python生成器
2021-06-24 03:05
标签:range 李彦宏 循环 list() hello lis list val 列表 一 python生成器 1 生成器的本质就是迭代器.(可迭代对象) def p(): print("hello world !") yield gen = p() # gen就是一个生成器,每次取p()都会是一个新的生成器 gen_other = p() gen 和gen_other是两个生成器 2. 生成器函数 生成器函数:在函数中return换成yield. 这个函数就是生成器函数 def func(): yield gen = func() 函数并不会被执行, 而是创建一个生成器对象 取值: gen.__next__() 下一个 gen.send() 可以给上一个yield传值, 第一次执行不能用send() def func(): a = None for i in range(50): print(i) a = yield (i,a) gen = func() print(gen.__next__()) print(gen.send("发票")) >>>0 (0, None ) 1 (1, "发票") 特性: 1. 节省内存 (不获取执行结果是不执行,获取是按照yield的位置端点,可以避免数据过多是占用内存) 2. 惰性机制 (不主动获取是,不执行结果,用__next__()或者下一个yield之前的数据) 3. 只能向前(同一个生成器,执行按协定的顺序来,执行完毕之后不再重复执行) 3. 各种推导式 li = [x for x in range(5)] print(li) >>>[0, 1, 2, 3, 4, 5] dic = {k:k+10 for k in range(3) } print(dic) >>>{0: 10, 1: 11, 2: 12, 3: 13} se = {x for x in ["a", "a", "b","c", "1", "2", "1"]} print(se) >>>{"a", "b", "c", "1", "2"} 4 生成器表达式 (结果 for循环 if条件) 惰性机制 记录在内存中的一段代码 gen = (x for x in range(5)) #小括号中的它就是一个生成器表达式可以使用__next__(), 含有__iter__() gen.__next__() >>>0 for i in gen : print(i) >>> 1 2 3 4 for E 1--------- # def func(): 2----------- 3 ----- python生成器 标签:range 李彦宏 循环 list() hello lis list val 列表 原文地址:https://www.cnblogs.com/tcpblog/p/9671001.html
生成器由生成器函数来创建或者通过生成器表达式来创建
1.列表推导式: [结果 for循环 if条件]
2.字典推导式: { key: value for循环 if条件}
3.集合推导式: {key for循环 if条件}
# for i in range(1, 10000):
# yield "衣服%s" % i
#
# gen = func()
# for i in range(50):
# yf = gen.__next__()
# for i in range(50):
# yf = gen.__next__()
# for i in range(50):
# yf = gen.__next__()def func():
yield "麻花藤"
yield "李彦宏"
yield "马云"
yield "刘强东"
gen = func()
# print(gen.__next__()) # 麻花藤
# print(gen.__next__()) # 麻花藤
# print(gen.__next__()) # 麻花藤
# print(gen.__next__()) # 麻花藤
# 生成器的本质是迭代器.
# print("__iter__" in dir(gen))
#
# # 生成器可以直接使用for循环
# # for el in gen:
# # print(el)
#
# lst = list(gen) # 把生成器中的每一个数据拿出来组合成一个列表
# print(lst)
def add(a, b):
return a + b
# 生成器函数, 0-3
def test():
for r_i in range(4):
yield r_i
# 获取到生成器
g = test() # 惰性机制
for n in [2, 10]:
g = (add(n, i) for i in g) # 循环的内部也是一个生成器
# __next__()
# list()
print(list(g)) # 刚开始拿数据
# 生成器记录的是代码
下一篇:Java大体介绍(超级短的那种)