迭代器和生成器

迭代器

  • 迭代是访问集合元素的一种方式;
  • 迭代器是一个可以记住遍历位置的对象;
  • 迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束;
  • 迭代器只能往前而不会往后;
  • 可以被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()函数也可转为迭代器,所以迭代器不一定是生成器。

迭代器和生成器

上一篇:RoCE-DSCP


下一篇:Photoshop为树林草地上的美女加上唯美晨曦色