可迭代
可以通过 isinstance(object, Itreable)
判断
也可以通过如下方式判断
dir()
方法,如果有实现__iter__
就说明是可迭代的- 当然也可能只是闲了
__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()
方法来看一下 Generator
和 List
所占用的空间。
答案就显而易见了,至少 Generator
更加节省空间。对于是否节省时间,笔者并不是很清楚,留给读者可以自己尝试一下。
由于生成器并不是一次产生所有的元素,而是一次一次地生成然后返回,那么我们只需要不断调用生成器就可以获得元素。
那么方法有两种
- 使用
next()
方法 - 使用
generator.send()
方法
两种方法是等价的,笔者可以自行尝试。
当然 generator.send()
更有其他用处,不过不是本篇文章讨论的内容,就不多做赘述。