python - 生成器与迭代器
2、生成器的用法
# 生成器的作用是节省空间,生成器就是迭代器的一种
# def index():
# print('index')
# yield 123 #yield后面如果没有加参数会打印none
# # #函数中如果存在yield关键字,在调用之前,还是一个普通的函数,一旦调用函数,就把函数变成的生成器(迭代器),生成器一定是迭代器,迭代器不一定是生成器,因为,迭代器不能用yield关键字
# res = index()#一旦服赋予变两此时这个index就是生成器
# ret = res.__next__()
# print(ret)
def index():
print('index')
yield 123
print('阿道夫')
yield 222
print('drgd')
# yild关键字的用法
res = index()
ret = res.__next__()#代码遇到yield会停住,夯住
ret = res.__next__()#再次执行__next__()代码从上一次停住的位置继续往下执行,
yield实现range方法:两个参数
# def my_range(start, stop): #1、 我们先定一一个函数这个函数my_range,这个函数里面肯定要有两个形参来接收my_range里面1和10的这两个参数,所以我用start,stop
# while start < stop: # 2、因为每次都要打印返回值所以这里我们使用while循环,7、因为while的条件是True所以一直不会结束 这个时候就需要给循环加条件start < stop,而stop对应的是10,所以到10就会结束
# yield start # 4、这里执行到yield的时候就会把1传给start
# start += 1 # 6、但是我们执行后每一次都只打印这个1,所以这个时候我们需要加1,这个时候while循环第二次打印就会返回2
#
#
# for i in my_range(1, 10): #3、for的内部原理其实就是迭代器,既然是迭代器里面就一定会有__next__(),说一就会执行 yield
# print(i)# 5、当我们代码碰到yield的时候会把返回值给到这个 i,这个时候在打印i的时候就会把 1 打印出来
yield 传值
def eat():
print('开始吃饭')
while True:
food = yield #none
print('开始吃%s' % food)
res = eat()#只是把函数变成了生成器
ret = res.__next__()#取值取到了第一次遇到了yield,然后停住
res.send('臭豆腐')#1、send调用了__next__() ,2、传参数,
yield与return
yield
1、可以有返回值
2、函数遇到yield不会结束,只会停住
3、yield关键字把函数变成了生成器,支持迭代器去值了
return
1、可以有返回值
2、遇到return关键字直接结束函数运行
**生成器表达式**
l = [1, 2, 3, 4, 5, 6]
res = (i + 1 for i in l)#生成器
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())#234567,这就是生成器,
注意生成器如果执行__next__(),内部的代码不会执行