迭代器生成器和Yield

作为一个初入门的小白来说,迭代器生成器还有yield的用法确实是模模糊糊,所以看了官方文档做了一些总结

迭代器
可迭代的对象,是可以直接作用于for循环的对象(iterable)可以用isinsatance()去判断一个对象是否是可迭代的对象,例如下面判断列表是不是可迭代对象

from collections import Iterable#从collections中引入Iterable方法
print(isinstance([],Iterable))#判断列表是不是可迭代对象

可以直接作用于for的数据类型一般分两种
1、集合类:list,tuple,dict,set,string
2、Generator,包括生成器和带Yield的generator function

迭代器不但可以作用于for循环还可以被next()函数不断调用并返回下一个值,直到最后抛出一个StopIteration错误的时候说明无法返回下一个值

将数据转化为Iterator对象


from collections import Iterator
a = iter([1,2,3,4,5])
print(next(a))
print(next(a))
print(isinstance(iter([]),Iterator))
print(isinstance(iter({}),Iterator))
print(isinstance(iter(()),Iterator))

迭代器和生成器
当你创建一个列表,你可以一个一个的读取它的每一项,这叫做迭代(iteration)

mylist = [x*x for x in range(3)]
for i in mylist:
    print(i)

你可以用在for…in…语句中的都是可迭代的,他们非常的方便使用但是你必须把他们放在内存中,当他们有很多值时就会消耗太多的内存

Generators
其实生成器也是迭代器的一种,但是你只能迭代他们一次,因为他们不是全部存在内存里面,只在调用的时候在内存里面生成:

mygenerator = (x*x for x in range(3))
for i in mygenerator:
    print(i)

生成器迭代器的区别就是用()替换[],还有你不能用for i in mygenerator 第二次嗲奥用生成器:首先计算0 然后会在内存里面将0丢掉然后计算1,知道计算完4才终止。

Yield
其实Yield的用法和return关键字差不多,下面的函数会返回一个生成器

def createGenerator():
    mylist = range(3)
    for i in mylist:
        yield i*i

mygenerator = createGenerator() # 创建生成器
print(mygenerator) # mygenerator is an object!

for i in mygenerator:
    print(i)

首先的理解在你调用函数的时候,函数里面的代码并没有运行,函数仅仅返回生成器对象,这就是他奇妙的地方,然后在for语句的作用下语句迭代生成器的时候你的代码才会运转。
当for语句第一次调用函数里返回的生成器对象,函数里的代码就开始运作,直到碰到yield,然后会返回本次循环的第一个返回值.所以下一次调用也将运行一次循环然后返回下一个值,直到没有值可以返回.

扫描二维码关注公众号,回复: 3586144 查看本文章

一旦函数运行并没有碰到yeild语句就认为生成器已经为空了.原因有可能是循环结束或者没有满足if/else之类的.

猜你喜欢

转载自blog.csdn.net/qq_41114516/article/details/83045416