首页 > 编程语言 >python学习之闭包与装饰器

python学习之闭包与装饰器

时间:2024-07-26 08:59:38浏览次数:18  
标签:函数 python 之闭 cost time print 或类 装饰 def

一、闭包

闭包允许一个函数访问并操作函数外部的变量(即父级作用域中的变量),即使在该函数外部执行。

特性:

(1)外部函数嵌套内部函数。

(2)外部函数可以返回内部函数。

(3)内部函数可以访问外部函数的局部变量。

def out():
    print("我是外层")
    n = 10

    def ins():
        print("我是内层")
        nonlocal n
        n += 30
        print(n)
    return ins



out()
i = out()
i()

 

二、装饰器

装饰器(Decorator)是Python中一种强大的函数或类修饰机制,它允许开发者在不修改原始函数或类代码的情况下,对其进行功能扩展或修改。装饰器基于函数式编程的概念,通过将函数作为参数传递给另一个函数,并返回一个新的函数来实现。

概念:一个闭包就是一个函数+在创建这个函数时可以访问的变量

定义:装饰器本质上是一个Python函数或类,它接收一个函数或类作为参数,并返回一个新的函数或类对象。

实现:闭包+@语法

@decorator  
def func():  
    pass

三、装饰器案例

1.时间开销



def time_cost(f):

    def calc():

        start = time.time()

        f()

        print(f"结束执行: {f.__name__} 消耗时间 {time.time()-start}")





    return calc



@time_cost

def fun1():

    datas.sort()

    print(datas)



# fun1 = time_cost(fun1)

fun1()



# fun1()





@time_cost

def fun2():

    new_datas = sorted(datas_copy)

    print(new_datas)





# fun2 = time_cost(fun2)

fun2()

# fun2()

2.权限校验

# 当前登录用户

user = None





def login_required(f):

    def check():

        global user

        if user:

            f()

        else:

            while True:

                username = input("输入用户名")

                password = input("输入密码")

                if username == "admin" and password == "123456":

                    user = "admin"

                    f()

                    break

                else:

                    print(f"用户名密码错误")



    return check





def index():

    print(f"我是首页")





@login_required

def center():

    print(f"我是个人中心")





@login_required

def cart():

    print(f"我是购物车")





# index()

# center()

# cart()



index()



# center = login_required(center)

center()



# cart = login_required(cart)

cart()

标签:函数,python,之闭,cost,time,print,或类,装饰,def
From: https://blog.csdn.net/dudnf/article/details/140617745

相关文章

  • 如何正确处理Python中的可选功能
    我正在开发实现科学模型的python包,我想知道处理可选功能的最佳方法是什么。这是我想要的行为:如果无法导入某些可选依赖项(例如,在无头机器上绘制模块),我想在我的类中禁用使用这些模块的功能,警告用户如果他尝试使用它们以及所有这些,而不会破坏执行。所以下面的脚本在任何情况下......
  • 在Python中,对于一个数字列表,如何找到具有最大和的数字的连续子集范围?
    输入的一个示例可能是nums1=[-1,4,-3,5,-5]nums2=[-1,4]我想知道这里什么可能是有效的解决方案。谢谢。defmax_subarray_sum_range(nums):"""找到数字列表中具有最大和的连续子集范围。Args:nums:数字列表。Returns:一个包含最大和子集起......
  • 如何安装mysqlclient 1.4.6? (Python 3.6)MacO?
    我安装pipinstallmysqlclient==1.4.6--no-cache-dir但是出现错误:ld:library'ssl'notfoundclang:error:linkercommandfailedwithexitcode1(use-vtoseeinvocation)error:command'clang'failedwithexitstatus......
  • Numpythonic 方式从所需的时间步长和窗口大小构造窗口向量
    给定参数timestep=2window_size=3我已经展平了大小为9的时间序列向量。内容是:arr=np.array([1,2,3,4,5,6,7,8,9])如何使用这些参数重塑/构造窗口时间序列?我希望输出具有形状unknown,window_size)所以,它的输出将是这样的矩阵:windowed_arr=np......
  • Python - 检测字母模式而不迭代所有可能的组合
    对于可能不太有用的标题,我表示歉意,我不知道如何将这个问题总结为一句话。我正在尝试计算Python3.10中一个单词有多少个“单位”长。一个“单位”是(C表示辅音,V表示元音)CV或VC或C或V(后两者仅在没有配对时使用)可以制作)。例如,“件”将为三个单位......
  • scipy.fft (Python) 结果和 FFTW (C) 结果之间的微小差异
    我正在尝试使用C中的FFTW从Python中的一些已知工作代码重新创建结果。我发现结果中有一些小错误。scipy.fft我的输入数据是真实的3d,尺寸=(294,294,294)。我的scipy.fft调用如下所示:我的fftw代码如下所示这个:complex_data_out=scipy.fft.fftn......
  • 使用 Python 生成多页 PDF 报告,其中包含表格、页眉、页脚和可调整单元格数据(使用 repo
    我想在Python中生成带有表格、页眉、页脚和可调整单元格数据的多页PDF报告(使用reportlab)但是,由于奇怪的原因,字体大小并没有随着表格内容而改变......我尝试在这里改变:('FONTSIZE',(0,1),(-1,-1),24),#内容的字体大小但什么也没发生importtimefromreportlab......
  • Python 和 ReportLab。如何更改 Table 对象中的字体和字体大小?
    我需要更改表对象(ReportLab)中特定单元格的文本样式。据我了解,它可以通过TableStayle类完成,但我找不到示例。my_table=Table(data,colWidths=column_widths,rowHeights=row_heghts)my_colour_black=[0,0,0]my_colour_ligt_gray=[0.8,0.8,0.8]my_colour_gra......
  • 如何在Python中查找字符串中所有出现的子字符串,同时忽略某些字符?
    我想找到所有出现的子字符串,同时忽略某些字符。我怎样才能在Python中做到这一点?示例:long_string='thisisat`es"t.Doesthetestwork?'small_string="test"chars_to_ignore=['"','`']print(find_occurrences(long_string,small_string......
  • 如何让 python 为我提供正确的函数解决方案并根据符号更改零的格式?
    我正在尝试制作一个二次公式计算器。一切看起来都很好,但是,当我输入一些函数(例如x^2-2x+1和x^2+2x+1)时,当它们有不同的解决方案时,它会给我相同的零。我遇到的另一个问题是,在代码的末尾,format_solution(root),我希望它能够根据符号改变格式。例如,如果零是(x-1),我不希望它输入(......