标签:code 出现 pre python 优点 生成 迭代 list 返回
1.生成器本质就是迭代器,Python社区生成器与迭代器是相同的
唯一区别:生成器是我们用Python代码构建的
只要函数中出现了yield那么它就是生成器函数
def func():
print(111)
yield 2
print(111)
yield 3
print(111)
yield
print(111)
yield 5
ret = func() # 生成器对象
print(ret) # <generator object func at 0x0000000001E10F68>
print(next(ret)) #一个next对应一个yield
return 结束函数,给函数的执行者返回值
yield 不结束函数,对应着给next返回值
#多个值皆通过元祖的形式返回
def eat_baozi_gen():
for i in range(1,2001):
yield f'{i}号包子'
ret1 = eat_baozi_gen()
print(next(ret1))
print(next(ret1))
...
for i in range(200):
print(next(ret))
for i in range(200):
print(next(ret))
将一个可迭代对象的每一个元素返回给next
节省代码,提升效率(代替了for循环)
def func():
l1 = [1, 2, 3]
yield l1
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))
l1 = []
for i in range(1,101):
l1.append(i)
print(l1)
列表推导式:一行代码构建一个有规律比较复杂的列表
l1 = [i for i in range(1, 101)]
print(l1)
构建方式:
1.循环模式:[变量(加工后的变量) for 变量 in iterable]
将10以内所有整数的平方写入列表
print([i**2 for i in range(1, 11)])
100以内所有的偶数写入列表
print([i for i in range(2, 101, 2)])
从python1期到python100期写入列表
print([f'python{i}期' for i in range(1, 101)])
2.筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
三十以内可以被三整除的数。
print([i for i in range(1, 31) if i % 3 == 0])
优点:简单快捷
缺点:可读性不高,不好排错
与列表推导式相近 => 循环模式,筛选模式
obj = (i for i in range(5))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
如何触发生成器(迭代器)取值
1.next(obj)
2.for循环
for i in obj:
print(i)
3.数据转化
print(list(obj))
生成器节省内存
与列表推导式相近 => 循环模式,筛选模式
集合推导式
print({i for i in range(1, 101)})
字典推导式
{0: '小潘', 1: '怼怼哥', 2: '西门大官人'}
li = ['小潘', '蔡徐坤','西门大官人']
dic = {}
for index in range(len(li)):
dic[index] = li[index]
print(dic)
print({i:l1[i] for i in range(len(li))})
标签:code 出现 pre python 优点 生成 迭代 list 返回
原文地址:https://www.cnblogs.com/wxl1025/p/11062481.html