python成长日迹--生成器&迭代器
2018-01-01 21:23
429 查看
列表生成式
a=[x for x in range(10)] print(a)
如此,我们就可以快速地生成一个列表
生成器(generator)
创建方法一:
我们在列表生成式的基础上,把[]改为(),看看有什么不同的y=(x for x in range(10)) print(y) #<generator object <genexpr> at 0x0000000001E98048>
此时我们发现,y已经变成了一个生成器对象,这样我们就创建了一个生成器
创建方法二:
python为我们提供了另一种创建生成器的方法,使用yield关键字,如何使用呢?def info(): print('abc') yield 1 print('123') yield 2
这种形式,我们一定以为这是一个函数,我们试着调用看看?
info() #当我们采用函数调用时,却发现什么也没有打印 print(info()) #<generator object info at 0x00000000025080A0>
通过打印我们可以看到,这是info是一个生成器对象,它是通过关键字yield实现,可以将yield后面的参数返回给生成器对象,同函数中的return,却与return又有不同之处
# 我们可以通过next()方法来得到这个参数 ret=info() print(next(ret)) #我们第一次使用next打印出的结果是abc 1 print(next(ret)) #再次打印输出结果是 123 2
可以看出,我们每输出一次,相当于它的指针停留在上次yield那段代码上,当我们再次输出,它就会执行当前yield之后的代码,直到遇到下一个yield
print(next(ret)) #StopIteration 此时我们再输出就会报错,提示已经没有可迭代的
那如果我们生成器中有很多元素,我们每次都使用next,我们可以使用遍历
以斐波那契数列为例
def fibo(num): x,before,after=0,0,1 while x<num: yield before before,after=after,before+after x+=1 # fibo()就是一个生成器对象 for i in fibo(5): print(i) # 打印结果: # 0 # 1 # 1 # 2 # 3
迭代器
所有的生成器都是迭代器,但迭代器不一定是生成器什么是迭代器,可迭代对象具有iter()方法,并使用该方法生成的都是迭代器
例如:
l=[1,2,3] a=iter(l) #iter(l)就是一个迭代器,迭代器都可以通过next()方法进行获取值 print(< 89a4 span class="hljs-built_in">next(a))
相关文章推荐
- ·python·用生成器和迭代器实现自己的xrange
- ·python·用生成器和迭代器实现自己的xrange
- 第三篇:python高级之生成器&迭代器
- Python学习之路7 - 生成器&迭代器
- ·python·用生成器和迭代器实现自己的xrange
- python·用生成器和迭代器实现自己的xrange
- python高级之生成器&迭代器
- python中的迭代器与生成器详解
- 举例讲解Python中的迭代器、生成器与列表解析用法
- python基础之迭代器和生成器
- python学习系列(六)迭代器生成器
- python中生成器和迭代器
- python的迭代器、生成器、装饰器
- 详解Python的迭代器、生成器以及相关的itertools包
- 完全理解 Python 迭代对象、迭代器、生成器
- python成长日迹--闭包
- Python 迭代器和生成器(转)
- Python 数据类型以及迭代器和生成器
- python中的迭代器与生成器
- Python 迭代器 & __iter__方法