迭代器生成器可迭代对象
Posted treelight
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器生成器可迭代对象相关的知识,希望对你有一定的参考价值。
迭代器出现的原因
Python中的列表,有可能会占用很大的空间。而迭代器,它是每一次用__next__调用时才计算出值,这会节省内存空间。
迭代器、生成器、可迭代对象的关系
可迭代对象一般是列表、元组、字典、字符串等可以For循环的对象。可通过以下语句判断是不是可迭代对象。
from collections.abc import Iterator, Iterable l = [1, 2, 3, 4, 5] print(isinstance(l, Iterable)) # True
而且每个可迭代器都有__iter__方法,并且此方法返回一个迭代器。
那么什么是迭代器呢?它与可迭代对象有什么关系?为什么for循环可以得出每人元素的值?那是因为可迭代对象有一个记录员,可记录当前位置。而这个记录员就是迭代器。可迭代对象可生成迭代器,如下:
l = [1, 2, 3, 4, 5] it = iter(l) print(isinstance(it, Iterator)) # True
每个迭代器都有__next__方法。而生成器是迭代器的一种,除了有__next__方法以外,还要用到yield。
for循环的本质
其实for循环一个可迭代对象,为我们做了以下事情
1、通过可迭代对象生成一个迭代器
2、调用迭代器的__next__方法,生成值
3、遇到错误时,就退出
以下程序就说明了这个问题
l = [1, 2, 3, 4, 5] for i in l: print(i) # 以上for循环等同于以下效果 it = iter(l) while True: try: print(it.__next__()) except StopIteration: break
生成器
例一、斐波那契数列
def fib(m): n, a, b = 0, 0, 1 while n < m: yield b # 每一次用__next__调用时会在此结束,下一次调用时执行yield下面的语句 a, b = b, a + b n += 1 f = fib(5) # 生成生成器,不会调用,要调用就用__next__方法 # while True: # try: # print(f.__next__()) # except StopIteration: # break for i in f: print(i) # 斐波那契数列结束
例二、经典的生产者、消费都模型
def consumer(name): print(‘%s要准备吃包子了‘ % name) while True: n = yield print(‘%s吃了%s个包子‘ % (name, n)) def producer(name): print(‘%s准备制造包子了‘ % name) c1 = consumer(‘Daughter‘) c2 = consumer(‘Son‘) c1.__next__() c2.__next__() print(‘-‘ * 40) while True: time.sleep(3) print(‘%s已经制造了2个包子‘ % name) c1.send(1) # 可发送给yield c2.send(1) print(‘-‘*40) producer(‘Father‘) # 消费者、生产都模型结束
以上是关于迭代器生成器可迭代对象的主要内容,如果未能解决你的问题,请参考以下文章
python:可迭代对象,迭代器,生成器函数,生成器的解析举例代码说明