生成器
生成器的定义:
在函数里面具有yield关键字的函数就是生成器。
生成器的作用:节省了内存空间
在调用函数的时候就不会执行函数体代码了,变成了生成器。
"""生成器其实也是迭代器""" def index(): print('first') yield print('second') res=index() # 由于函数里面有yield关键字,所以函数就不在执行了,激活成生成器 res.__next__() # 第一次yield,代码走到了第一个yield位置,只是停在那个位置了 res.__next__() # 再次next,代码继续从上一个yield位置开始往下继续走 next(res) next(res)
要想使用生成器,要用next取值
每next取值代码走到下一个yield处停住
yield后面如果跟很多数据,会以元组的形式返回
自定义range
range函数本身就是一个生成器,在Python3中不会直接造出数据来,做了进一步的优化,节省了空间。
# for 循环内部自带next ## 传两个参数 def my_range(start, stop): while start<stop: yield start start += 1 res = my_range(1,10) for i in my_range(1,10): print(i)
#传三个参数 def my_range(start, stop, step=1): while start < stop: yield start start += step res = my_range(1,10,2) for i in my_range(1, 10, 2): print(i) # 传一个参数 def my_range(start, stop=None, step=1): # 判断传了一个参数还是两个参数 if not stop: stop = start start = 0 while start < stop: yield start start += step res = my_range(10) for i in my_range(10): print(i)
yield关键字传参问题
只要函数里有yield,就不再执行而是变成了生成器
def eat(name): print("%s干饭" % name ) while True: food = yield print("%s正在吃%s" % (name, food)) res=eat('kevin') res.__next__() res.send('狗不理') # 传值又__next__ res.send('狗不理1') # 传值又__next__
return和yield对比
return
1.函数遇到return直接终止运行
2. return也可以返回多个值
yield
1.函数遇到yield代码不会立即终止运行,而是"停住"
2.yield也可以返回多个值,以元组的形式返回
3.yield可以把函数变成生成器,而且还支持传参
生成器表达式
# 答案:C # 求和 def add(n, i): return n + i # 调用之前是函数 调用之后是生成器 def test(): for i in range(4): yield i g = test() # 初始化生成器对象 for n in [1, 10]: g = (add(n, i) for i in g) """ 第一次循环:n=1 g = (add(1, i) for i in g) 第二次循环: g = (add(n, i) for i in g) g = (add(10, i) for i in (add(10, i) for i in g)) """ res = list(g) print(res) # A. res=[10,11,12,13] # B. res=[11,12,13,14] # C. res=[20,21,22,23] # D. res=[21,22,23,24]
标签:res,生成器,yield,next,start,range From: https://www.cnblogs.com/Lucky-Hua/p/17460861.html