生成式
列表生成式
列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式,可以快速生成一个新的列表
字典生成式
字典生成式就是一个用来生成字典的特定语法形式的表达式
集合生成式
快速生成集合
实例:
生成器
在Python中一遍循环一遍计算的机制称为生成器
生成器的作用
在性能限制需要用到,比如读取一个10G的文件,如果一次性将文件内容放到内存中处理的话,内存可能会溢出,但使用生成器把读写交叉处理进行,比如使用readline和readlines就可以在循环读取的同时不断处理,这样就可以节省大量的内存空间
实例:
使用生成式生成大量数据,查看生成时间与生成器对比
生成器有两种方法创建
第一种
列表生成式的改写,[]改为()
第二种方式
yield关键字
实例:
如何打印生成器中的每一个元素
直接查看,可以发现返回的是一个内存地址
第一种方式打印,for循环
第二种方式打印,next()函数,每到一个yield关键字会暂停
yiled关键字与return关键字的区别
当函数中出现return关键字代表函数终止,当函数中出现yiled关键字代表停靠,函数暂停,可以继续运行
生成器,迭代器与可迭代对象
迭代是访问容器元素的一种方式,迭代器是一个可以记住遍历的位置的对象。
迭代对象从集合的第一个元素开始访问,直到所有的元素被访问完结束
闭包
什么是闭包
闭包就是指有权访问另一个函数作用域中的变量的函数。
如何实现闭包
创建闭包最常见的方式,就是在一个函数内部创建另一个函数。
常见形式:内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。闭包的一个常用场景就是装饰器
闭包的优点:提高代码可重复使用性
实例:
装饰器
什么是装饰器
器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数(照片与相框)
为什么要使用装饰器
如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候就可以使用装饰器,因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能是开放的
装饰器的实现必须遵循两大原则:
封闭:对已经实现的功能代码块封闭。不能修改被装饰对象的源代码
开放:对扩展开放
装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能
如何实现装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
装饰器应用1
性能测试
import time
from functools import wraps
def timeit(fun):
@wraps(fun)
def wrapper(*args,**kwargs):
start_time = time.time()
a = fun(*args,**kwargs)
end_time = time.time()
print('函数%s执行的时间为%.2f' %(fun.__name__,end_time-start_time))
return a
return wrapper
@timeit
def hello(a,b):
time.sleep(0.2)
print(a,b)
print("欢迎学习python")
hello(1,2)
装饰器应用场景2
插入日志
import time
import logging
from functools import wraps
def add_log(f):
@wraps(f)
def wrapper(*args,**kwargs):
start_time = time.time()
result = f(*args,**kwargs)
end_time = time.time()
logging.error('%s函数执行时间为%.2f ,执行的结果是%s' %(f.__name__,end_time-start_time,result))
return result
return wrapper
@add_log
def add(x:int,y:int) -> int:
time.sleep(0.2)
return x+y
if __name__ == '__main__':
result = add(1,3)
print(result)
多装饰器
当一个函数同时被多个装饰器作为装饰对象,多个装饰器的顺序是自下而上,而调用的顺序是自上而下
内置高阶函数
函数式编程的一个特点就是允许吧函数本身作为参数传入另一个函数,还允许返回同一个函数,Python对函数编程提供部分支持
把函数作为参数传入,这样的函数称为告诫函数,函数式编程就是指这种高度抽象的编程范式