python函数之闭包函数与装饰器

python函数之闭包函数与装饰器

闭包函数
  • 概述

    • 闭包函数本质就是函数
    • 在函数外面是无法访问函数内部数据的,通过闭包函数在函数外面访问函数内部的数据
    • 使用闭包有风险,占用内存,可能会导致内存溢出,闭包在使用中将函数内部的局部变量永久保存在内存中.
  • 闭包函数的必要条件

    • 函数的嵌套定义
    • 内部函数使用外部函数的变量
    • 外部函数必须有返回值, 返回内部函数名
  • 闭包函数的执行

    def fun():
    	name = "liming"
    	def inner():
    		print(name)
    		age = 12
    		return name, age
    	return inner
    
    
    if __name__ == '__main__':
    	# 调用外层函数 fun , 把内层函数inner返回给inner_function变量
    	# inner只是赋值给了inner_function, 没有被调用
    	# 注意此时name依然存在,没有被释放, 因为内层函数引用了name的值, 
    	# 且内层函数赋值给了全局变量inner_function
    
    	inner_function = fun()  # 相当于 inner_function = inner
    	
    	# 调用内层函数inner
    	print(inner_function())  # 相当于 inner()
    
  • 闭包的作用

    • 让函数内部的局部变量, 在函数执行完成后, 让外部能够操作这个变量, 延长了函数内部变量的生命周期
  • 应用场景:

    • 在项目开发中可以使用闭包函数,对程序进行扩展
  • 案例: 检测某个函数的执行时间

      ```python
      import time
      
      def execution_time(func):
      	def inner():
      		start_time = time.time()
      		func()
      		end_time = time.time()
      		print(f'函数执行共用时{end_time-start_time}')
      	return inner
      
      
      def program():
      	print("这是个一程序")
      	time.sleep(2)
      	print("执行结束")
      
      if __name__ == '__main__':
      	# 调用闭包的外层函数,传入要检测的函数, 将内层函数inner返回给inner_function
      	inner_function = execution_time(program)  
      	
      	# 调用inner_function, 即inner函数
      	inner_function()
          
      ```
    
装饰器
  • 概述

    • 装饰器函数本质就是一个闭包, 也是一个函数
    • 装饰器有其固定的语法格式
  • 作用

    • 在不修改原函数及其调用方式的情况下对原函数功能进行拓展
  • 格式

    • @装饰器名称

      被装饰的函数

    •   def outer(func):
        	def inner(*args, **kwargs):
        		# 被装饰函数之前执行的代码
        		ret = func(*args, **kwargs) # 被装饰的函数
        		# 被装饰函数之后执行的代码
        		return ret
        	return inner
        
        @outer
        def function(*args, **kwargs):
        	pass
      
  • 案例1: 修改年龄(带参数的装饰器)

    def outer(fun):
    	def inner(name, age):
    		print(f"修改前的年龄{age}")
    		age -= 2
    		fun(name, age)
    	return inner
    
    
    @outer   # 相当于 change_age = outer(change_age) 即把inner赋值给change_age
    def change_age(name, age):
    	print(f"我是{name}, 今年{age}岁")
    
    
    if __name__ == '__main__':
    	change_age("李明", 20)
    
  • 案例2: 测试程序执行时间( 带返回值的装饰器)

    import time
    
    def outer(func):
    	def inner(*args, **kwargs):
    		start_time = time.time()
    		ret = func(*args, **kwargs) # 被装饰的函数
    		end_time = time.time()
    		print(f'函数执行共用时{end_time-start_time}')
    		return ret
    	return inner
    
    @outer
    def function():
    	print("这是个一程序")
    	time.sleep(2)
    	print("执行结束")
    	return "ok"
    
    
    if __name__ == '__main__':
    	ret = function()
    	print(ret)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序烂人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值