标签:斐波那契数 字符串 消费 ons producer consumer 字典 import ble
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循环一个可迭代对象,为我们做了以下事情
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‘)
# 消费者、生产都模型结束
标签:斐波那契数 字符串 消费 ons producer consumer 字典 import ble
原文地址:https://www.cnblogs.com/Treelight/p/12247578.html