day13 python学习 迭代器,生成器

Posted 王大拿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day13 python学习 迭代器,生成器相关的知识,希望对你有一定的参考价值。

1.可迭代:
当我们打印

print(dir([1,2]))   在出现的结果中可以看到包含

‘__iter__‘,  这个方法,#次协议叫做可迭代协议

包含‘__iter__‘方法的函数就是可迭代函数
字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的


2.迭代器 iterator
l = [1,2,3,4]
l_iter = l.__iter__()  #迭代器的生成
item = l_iter.__next__()    #迭代器的使用,用此方法一一钓鱼迭代器中的数值
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)
item = l_iter.__next__()
print(item)

这是一段会报错的代码,如果我们一直取next取到迭代器里已经没有元素了,就会抛出一个异常StopIteration,告诉我们,列表中已经没有有效的元素了。

这个时候,我们就要使用异常处理机制来把这个异常处理掉。

l = [1,2,3,4]
li=l.__iter__()
while True:
        try:
            item=li.__next__()
            print(item)
        except StopIteration:#这里要输入的是报错的内容  ,出现这个错误时执行以下内容
print(超出索引) break

3.判断是否是迭代器

print(__next__ in dir(range(12)))  #查看‘__next__‘是不是在range()方法执行之后内部是否有__next__   当他为真时证明是可迭代的,
print(__iter__ in dir(range(12)))  #查看‘__next__‘是不是在range()方法执行之后内部是否有__next__   当两个结果都为True时,就是迭代器

from collections import Iterator
print(isinstance(range(100000000),Iterator))  #验证range执行之后得到的结果不是一个迭代器

4.生成器

如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。

Python中提供的生成器:

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

 

生成器Generator:

  本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

  特点:惰性运算,开发者自定义

生成器函数

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。

 

def func():   #这就是一个简单的生成器函数
    for i in range(1000):
        yield (生产了%s件衣服%i)            注意这里使用的是yield  返回数据  而不是return  
j=func()
print(j.__iter__())
print(j.__iter__())
print(j.__iter__())

 













以上是关于day13 python学习 迭代器,生成器的主要内容,如果未能解决你的问题,请参考以下文章

python学习日记:day13------迭代器与生成器

python 全栈开发,Day13(迭代器,生成器)

Python基础day13

Python学习之旅—Day07(生成器与迭代器)

迭代器生成器 day13

Python100天学习笔记Day20 迭代器与生成器及 并发编程