您的位置:首页 > 编程语言 > Python开发

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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: