2020-10-10
程序员文章站
2022-11-22 14:56:39
#查询student表的所有记录SELECT *FROM student;#查询student表的第2条到4条记录SELECT * fromstudent LIMIT 1, 4;#从student表查询所有学生的学号(id)、姓名(name)和院系(department)的信息SELECT id,name,department FROM student ;#从student表中查询计算机系和英语系的学生的信息SELECT * from stude......
闭包和装饰器
1、高阶函数
- 接收函数作为参数是高阶函数
- 将函数作为返回值返回的函数就是高阶函数
2、匿名函数
- lambda函数(无名函数)
- 语法:lambda 参数列表:表达式
-
filter()函数(过滤列表)
- 第一个参数:函数
- 第二个参数:序列
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