可迭代、迭代器、生成器

可迭代

可以通过 isinstance(object, Itreable) 判断

也可以通过如下方式判断

  1. dir() 方法,如果有实现 __iter__ 就说明是可迭代的
  2. 当然也可能只是闲了 __getitem__ 方法,尝试按顺序获取元素,也不会抛出异常

因此,我们可以通过能不能用 for 去迭代或者使用 iter() 来尝试生成迭代器来测试是不是可迭代的。

迭代器都是可迭代的

迭代器

迭代器不可以用 for 来迭获取元素,但是实现了 __next__ 方法。可以使用 next(object) 来获取元素。

生成器

相比大家都见过这样的代码

L = (x * x for x in range(1000000)) # Generator
R = [x * x for x in range(1000000)] # List

def func(n):
    now = 0
    while (now < n):
        yield now
        now += 1

gen = func(10000) # Generator

那么这个是什么呢,就是 Generator (废话)。那么它的优越性是什么,我们为什么要使用 Generator 呢?

在研究这个问题之前,我们可以先使用 getsizeof() 方法来看一下 GeneratorList 所占用的空间。

答案就显而易见了,至少 Generator 更加节省空间。对于是否节省时间,笔者并不是很清楚,留给读者可以自己尝试一下。

由于生成器并不是一次产生所有的元素,而是一次一次地生成然后返回,那么我们只需要不断调用生成器就可以获得元素。

那么方法有两种

  • 使用 next() 方法
  • 使用 generator.send() 方法

两种方法是等价的,笔者可以自行尝试。
当然 generator.send() 更有其他用处,不过不是本篇文章讨论的内容,就不多做赘述。

posted @ 2023-10-01 20:02  Gensokyo_Alice  阅读(17)  评论(0)    收藏  举报