赞
踩
与普通函数不同,生成器是一个返回迭代器的函数,只能用于迭代操作。在调用生成器的过程中,每遇到yield时函数会暂停并保存当前所有的运行内存信息,返回yield的值,并在下一次从当前位置继续运行。
注:可以通过for循环或者手动调用Xun(5)的next()方法。
例1:
当使用return时,函数运行到return即截止,返回数值。
- def getNum(n):
- i = 0
- while i <= n:
- return i # 循环结束,不能再运行下一行
- i += 1
- print(getNum(5))
- # output:0
把return改成yield后:
- def getNum(n):
- i = 0
- while i <= n:
- yield i
- i += 1
- print(getNum(5))
- # output:<generator object getNum at 0x000002D818C496D8>
返回了一个生成器对象。
将getNum(5)赋值给a,再print(a):
- def getNum(n):
- i = 0
- while i <= n:
- yield i
- i += 1
- a = getNum(5)
- print(next(a)) # output:0
- print(next(a)) # output:1
可以看到,第一个print(next(a))调用了getNum生成器,当运行到yield时,返回i的值(0);第二个print(next(a))使生成器接着从yield开始运行,再运行到yield时返回i的值(1)。
一般地,我们采用for循环:
- def getNum(n):
- i = 0
- while i <= n:
- yield i
- i += 1
- a = getNum(5)
- for i in a:
- print(i)
注:例子中,当i运行到6时,也就是调用6次next(a)时,会报错。
例2:
for循环本身就是一个生成器。当我们运行如下所示的代码时,非常占内存,会卡。
- a = [x for x in range(10000000)]
- print(a)
换种方式,把它变成生成器:
- a = (x for x in range(10000000))
- print(a)
用一下生成一个,不占内存。(这里的括号和元祖没关系)
例3:
我们给yield赋值:
- def getNum(n):
- i = 0
- while i <= n:
- temp = yield i
- print(temp)
- i += 1
- a = getNum(5)
- print(next(a))
- print(next(a))
会发现输出是:
- 0
- None
- 1
是因为yield返回值后,再次运行时,只运行temp=,所以temp是None。
我们把next改为a.send:
- def getNum(n):
- i = 0
- while i <= n:
- temp = yield i
- print(temp)
- i += 1
- a = getNum(5)
- print(next(a))
- print(a.send('我是a'))
输出:
- 0
- 我是a
- 1
用send,我们把“我是a”字符串送回生成器,赋值给了temp。
迭代器是python最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,只到所有的元素被访问完结束。
迭代器只能往前不会后退。迭代器有两个基本方法:iter(), 和next()。
字符串,列表或元祖,集合对象都可以用于创建迭代器:
- list1 = [1, 2, 3, 4]
- it = iter(list1) # 创建迭代器对象
- print(next(it)) # 输出迭代器的下一个元素 output:1
- print(next(it)) # output:2
可迭代对象:可以用for in 便利的对象都可以叫可迭代对象。如:list, string, dict。
迭代器:可以被next()函数调用的,并不断返回下一个值的对象叫迭代器。
凡是可以用作与next()函数的对象都是可迭代对象。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。