迭代器
- 迭代是访问集合元素的一种方式;
- 迭代器是一个可以记住遍历位置的对象;
- 迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束;
- 迭代器只能往前而不会往后;
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
所以生成器就是一个迭代器(Iterator),那么列表、字典等是不是迭代器呢?不是,它们是可迭代对象。
可迭代对象:
- 生成器;
- 字符串、元组、列表、集合、字典。
如何判断一个对象是可迭代的:
from typing import Iterable
res = isinstance(‘bigllxx‘, Iterable)
print(res)
如何判断一个对象是迭代器:
from typing import Iterator
res = isinstance(‘bigllxx‘, Iterator)
print(res)
如何将可迭代对象变为迭代器:
list_1 = [1, 2, 3, 4, 5]
list_1 = iter(list_1) # iter()系统函数,将可迭代对象转为迭代器
生成器
受到机器内存限制,一个列表的内存有限,假如一个列表有10亿条数据,但是我们每次调用时用的都是前几条,那么其他的内存空间都被浪费了,这时我们引入一个生成器,生成器的列表数据是按照某种规律实时生成的。
得到生成器的方式:
# 我们想要得到一个[0,3,6,9,12,...,30000]的列表
# 方式1:列表推导式
g = (i*3 for i in range(10 ** 4)) # 通过列表推导式,[]换成(),就是一个生成器(generator)
next(g) # 也可g.__next()__,向下读取一个生成器元素
# 方式2:函数 yield关键字
def gen():
n = 0
while n < 30:
n += 1
yield n # 只要函数中存在yield,该函数就是一个生成器,返回值就是yield后的元素
return ‘没有更多元素‘ # 当生成器元素用尽时,会把return的东西报错出来
g = gen()
next(g)
斐波那契数列
def fib(length):
a, b = 0, 1
n = 0
while n < length:
yield a # yield 返回a并暂停
a, b = b, a + b
n += 1
return ‘没有更多元素‘
g = fib(10)
print(next(g))
生成器与迭代器的关系:迭代器包含生成器,所以生成器肯定是迭代器,但是可迭代对象通过iter()函数也可转为迭代器,所以迭代器不一定是生成器。