闭包和装饰器

1、高阶函数

  • 接收函数作为参数是高阶函数
  • 将函数作为返回值返回的函数就是高阶函数

2、匿名函数

  • lambda函数(无名函数)
  • 语法:lambda 参数列表:表达式
  • filter()函数(过滤列表)
    • 第一个参数:函数
    • 第二个参数:序列

3、闭包
能够读取其他函数内部变量的函数。可以理解为函数嵌套函数,将函数内部和函数外部连接起来的桥梁。

作用:

  • 闭包可以保存外部函数的变量,不会随着外部函数调用完而销毁
  • 可以将一些私有数据藏到闭包里
  • 可以通过闭包创建一些只有当前函数能访问的变量

形成闭包的条件:

  1. 函数嵌套
  2. 将内部函数作为返回值返回
  3. 内部函数必须要使用到外部函数的变量

注意:由于闭包引用了外部函数的变量(参数),则外部函数德变量不会被释放,占用内存!

4、装饰器(Decorators)

  • 如果直接修改函数的代码来完成需求,会产生很多问题,例如:重复修改代码等
  • 装饰器的作用就是避免了修改原函数而能达到自己修改代码的需求,定义新的函数来装饰原函数,其就是一个闭包
  • 简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短

装饰器的语法糖写法(即使用更方便了),默认对下一个函数有效,最近的先起作用,@ 符号就是装饰器的语法糖,它放在函数开始定义的地方,这样就可以省略最后一步再次赋值的操作。

@fn
def speak()

这里@fn作用即为fn()传入参数speak,等于fn(speak),有了 @ ,我们就可以省去r = fn(speak)这一句了,直接调用 speak() 即可得到想要的结果。

  • @wraps接受一个函数来进行装饰,并加入了复制函数名称、注释文档、参数列表等等的功能。这可以让我们在装饰器里面访问在装饰之前的函数的属性。
  • 装饰器还有更大的灵活性,例如带参数的装饰器,*args和**kwargs
  • @functools.wraps(func),这是python提供的装饰器。它能把原函数的元信息拷贝到装饰器里面的 func 函数中。函数的元信息包括docstring、name、参数列表等等。

5、列表推导式

旧的列表 –>新的列表
语法:1.[表达式 for 变量 in 旧列表 if 条件]

res = [name for name in list if len(list)>4]

6、生成器
生成器实现方式一:通过推导式得到

generator = (i in range(100) if i%3 ==0) #generator即为生成器,特殊的迭代器
print(next(generator))  # 使用next()每次取一个符合条件的数

生成器的特性:生成器相当于一个容器,当把容器内的数据一次取出来了后容器内则没有数据了,即容器内数据为一次性

生成器实现方式二:利用函数的方式 yield

  • 当使用yield关键字后函数不再是函数,而是一个生成器
  • 当程序执行到yield的时候,程序就会停止,类似***input***
  • 生成器会记住你之前取到的元素的位置
def fn():
	print('程序被执行')
	i = 1
	while True:
		yield i
		i+=1

r = fn()
print(next(r))

本文地址:https://blog.csdn.net/qq_29529339/article/details/109004061