生成器
它能够按需生成值,而不是一次性生成所有值。与列表、元组等容器类型的可迭代对象不同,生成器不会将所有数据存储在内存中,而是在每次请求时"即时"生成数据。
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
是特殊的迭代器,遵循迭代器协议 使用yield语句生成值并暂停执行 函数状态会被保存,下次调用时从暂停处继续 每次调用只提供一个数据 不能"回头"访问已生成的值 支持next()函数调用 不支持下标索引访问 惰性计算,按需生成数。
def generatorFun(): yield 1 yield 2 yield 3ger = generatorFun() print(next(ger))print(next(ger))print(next(ger))try: print(next(ger))except StopIteration: print("生成器已耗尽")
def countUp(max): count = 1 while count <= max: yield count count+=1for num in countUp(5): print(num)
genExpr = (x ** 2 for x in range(4))
# 生成器使用方法 - forfor i in genExpr: print(i, end=' ')0 1 4 9
Python 推导式
Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。
Python 推导式是一种强大且简洁的语法,适用于生成列表、字典、集合和生成器。
names = ['Bob','Tom','alice','Jerry','Wendy','Smith'] new_names = [name.upper()for name in names if len(name)>3] print(new_names)['ALICE', 'JERRY', 'WENDY', 'SMITH']
dic = {x: x**2 for x in (2, 4, 6)} dic{2: 4, 4: 16, 6: 36}
a = {x for x in 'abracadabra' if x not in 'abc'} a{'d', 'r'} type(a)<class 'set'>
a = (x for x in range(1,10)) a<generator object <genexpr> at 0x7faf6ee20a50> # 返回的是生成器对象 tuple(a) # 使用 tuple() 函数,可以直接将生成器对象转换成元组(1, 2, 3, 4, 5, 6, 7, 8, 9)
迭代器
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器。
list=[1,2,3,4]it = iter(list) # 创建迭代器对象for x in it: print (x, end=" ")