python生成器
Posted python传言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python生成器相关的知识,希望对你有一定的参考价值。
一 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. 各种推导式
1.列表推导式: [结果 for循环 if条件]
li = [x for x in range(5)]
print(li)
>>>[0, 1, 2, 3, 4, 5]
2.字典推导式: { key: value for循环 if条件}
dic = {k:k+10 for k in range(3) }
print(dic)
>>>{0: 10, 1: 11, 2: 12, 3: 13}
3.集合推导式: {key for循环 if条件}
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():
# 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__()
2-----------
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)
3 -----
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)) # 刚开始拿数据 # 生成器记录的是代码
以上是关于python生成器的主要内容,如果未能解决你的问题,请参考以下文章