生成器
生成器
什么是生成器对象
自定义的迭代器对象--可以自定义一个容器,存放多个值,可以不依赖索引取值
# 函数内部一旦有了yield , 函数名()就不再是函数的调用得到函数的结果,而是产生‘’生成器对象‘’
def fn():
yield 1
obj = fn()
print(obj)
# 生成器对象通过__next__()方法的去获取yield的返回值,获得了就会停止执行
def func():
print("娃哈哈")
yield 1 #return和yield都可以返回数据
print("呵呵呵")
gen = func() #不会执行函数,拿到的是生成器
ret = gen.__next__() #会执行到下一个yield
print(ret)
gen.__next__()
# 函数中如果有yield,这个函数就是生成器函数
# yield: 相当于return可以返回数据,但yield不会彻底中断函数,而是分段执行函数
# gen.__next__() 执行函数,执行到下一个yield
# gen.__next__() 继续执行函数到下一个yield
1.函数中有yield, 函数名() 不是执行函数,而是生成生成器函数
eg:
# 占内存演示
def order():
lst = []
for i in range(10000):
lst.append("衣服"+str(i))
return lst
ll = order()
# 上面的实例可能导致非常占用内存,导致崩溃
解决方案是使用生成器
def order():
for i in range(10000)
yield "衣服”+str(i)
g = order() #获取生成器
mingwei = g.__next__() # ===> 衣服0
print(mingwei)
zhaoyining = g.__next__()) # ===> 衣服1
print(zhaoyiming)
# 要一件衣服的时候取一件,不会造成内存占用过高,导致崩溃
生成器的应用场景:
就是可以生成一个可以无限取值的容器。
例子
python 2.x中没有生成器概念: range() 会给出全部的量[a, b, c, d,......n]
python 3.x中引入生成器概念: range() 会给出range(a, b)

浙公网安备 33010602011771号