生成式
定义: 快速生成对象的公式
例如
-
列表生成式
列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。
1). 普通的语法格式:[exp for iter_var in iterable]
2). 带过滤功能语法格式: [exp for iter_var in iterable if_exp]
3). 循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]
示例: -
字典生成式
示例: -
集合生成式
示例:
生成器(generator)
定义:一边循环一边计算的机制
生成器使用的场景
性能限制需要用到,比如读取一个10G的文件,如果一次性将10G的文件加载到内存处理的话(read方法),内存肯定会溢出;但使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.
- 可以用time()函数来比较生成器和生成式生成同一组数据的快慢
代码:
from functools import wraps
import time
def timeit(fun):
@wraps(fun)
def wrappers(*args, **kwargs):
start_time = time.time()
result = fun(*args, **kwargs)
end_time = time.time()
return '%s执行的时间为%.2f, 结果是%s' % (fun.__name__, end_time - start_time, result)
return wrappers
@timeit
def generator():
"""生成器"""
g = (i for i in range(1000000))
return type(g)
@timeit
def common():
"""生成式"""
li = [i for i in range(1000000)]
return type(li)
if __name__ == '__main__':
print(generator())
print(common())
测试:
生成器创建的方法
-
列表生成式的改写。将[ ] 改为()
示例: -
yield关键字
示例:
打印生成器每一个元素的方法
- 通过for 循环依次打印每一个for循环
- 可以通过next()函数获得下一个返回值
python中return关键字和yield关键字的区别
- return:在程序函数中返回某个值,返回之后函数不在继续执行,彻底结束。
- yield: 带有yield的函数是一个生成器,函数返回某个值时,会停留在某个位置,返回函数值后,会在前面停留的位置继续执行,直到程序结束
迭代器
定义:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可迭代对象
定义:可以直接作用于for循环的对象(如何判断是否可以迭代?)
- 一类是集合数据类型,如list, tuple,dict, set,str等;
- 一类是generator,包括生成器和带yield的generator function。
生成器, 迭代器和可迭代对象的关系
含义:
1. 生成器一定是迭代器,但是迭代器不一定是生成器
2. 迭代器一定是可迭代对象,但可迭代对象不一定是迭代器,例如,集合, 可以用iter()函数来将可迭代对象转换为迭代器
示例:
闭包
什么是闭包?如何实现闭包
- 闭包就是指有权访问另一个函数作用域中的变量的函数。
- 创建闭包最常见方式,就是在一个函数内部创建另一个函数。
- 常见形式: 内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。闭包的一个常用场景就是装饰器
装饰器
什么是装饰器?
器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数。
实现装饰器的目的
软件的维护遵循的是开放封闭原则,对源代码封闭,对扩展功能是开放的
装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能。
装饰器的模板
多个装饰器装饰一个函数的规则
- 装饰器的执行顺序是:自上而下执行
- 被装饰的顺序是: 自下而上装饰
内置高阶函数
map()函数
定义:map() 会根据提供的函数对指定序列做映射。
示例:
注: map()函数的返回值是一个map对象,可以用next()去访问,也可以用for 循环去访问, 也可以直接转换成list去打印
拓展:当map后的序列是多个时,map可以并行地对序列操作
示例:
reduce()函数
定义:函数会对参数序列中元素进行累积
示例: 求5的阶乘
注:reduce()函数需要导入
filter()函数
定义:函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
示例:
注:filter函数返回的是一个可迭代对象
sorted()函数
定义:sorted() 函数对所有可迭代的对象进行排序操作。返回重新排序的列表。
参数:反转 reverse= True
默认是升序排列,加入这个参数就是降序排列
示例:
python排序sort()和sorted()的区别是
- 排序对象不同: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
- 返回值不同:
1). list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,
2).内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。