迭代器和生成器
可迭代对象 Iterable
- str tuple list dict set 这些可以直接作用于for循环的对象统称为可迭代对象
from collections.abc import Iterable
list1 = [1, 2, 3]
print(isinstance(list1, Iterable))
isinstance 判断是不是可迭代对象
迭代器(Iterator)
可以被next()函数调用并不断返回下一个值的对象称为迭代器
- 把list、dict、str等Iterable变成Iterator可以使用iter()函数
- 懒惰的生成下一个值
s = "123456"
s = iter(s)
print(next(s))
print(next(s))
print(next(s))
print(next(s))
print(next(s))
print(next(s))
超过范围之后会报错StopIteration
判断是不是迭代器
from collections.abc import Iterable, Iterator
s = "123456"
s = iter(s)
print(isinstance(s, Iterable))
超过范围时可以使用以下的方法防止报错
s = "123456"
s = iter(s)
while 1:
try:
print(next(s))
except StopIteration:
print("迭代结束!")
break
生成器(Generator)
生成器表达式
列表推导式 列表生成式
l = [i for i in range(100)]
for i in range(100):
l.append(i)
print(l)
l = (i for i in range(1000000000000))
print(l)
print(next(l))
print(next(l))
print(next(l))
print(next(l))
for i in range(101):
print(next(l))
生成器函数 关键字yield
- 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
- 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
- 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
当函数中有yield关键字时 这个函数会返回一个生成器,只能用于迭代操作。用next()调用生成器的过程中,每次遇到yield关键字会暂停函数并且保留当前函数的运行信息,返回yield的值,并且在下一次执行的时候从当前位置继续向下执行
def my_generator():
for i in range(1, 6):
print(f"第{i}次执行yield之前")
yield i
print(f"第{i}次执行yield之后")
g = my_generator()
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
斐波那契数列
已知两个数值 0 1 后面的每一位等于前两项之和
0 1 1 2 3 5 8 13 21
简单的计算方法
def ficonacci():
a, b = 0, 1
while 1:
yield a
a, b = b, a+b
f = ficonacci()
for i in range(1000):
print(next(f))