python学到后面,觉得挺难的。刚开始学的时候,只知道这样用就行,形成了惯性思维。比如for循环,为什么会自动遍历列表呢?答:python自带的啊,他就是这样的。现在的理解是:python中所有的方法都是底层已经封装好了,所以可以这么用。于是我就在想for循环到底是怎么运行的,为什么可以去遍历。《python学习手册》中有一个例子,讲迭代器的。
原来的例子是这样:
class FirstPra:
def __init__(self, start, stop):
self.value = start
self.stop = stop
def __iter__(self):
# 这里返回的是实例本身
return self
def __next__(self):
if self.value == self.stop:
raise StopIteration
self.value += 1
return self.value
m = FirstPra(2, 7)
# 第一个for循环
for i in m:
print(i)
# 第二个for循环
for j in m:
print(j)
因为书上说这个是单次迭代,不支持独立位置的多次迭代。所以我特意加了两个for循环验证一下,结果确实是这样:第一个for循环是有值的,第二个for循环是没值的,但也没报错,只是没值。
查阅资料了解到,for循环在运行时,会去调用iter函数生成生成器对象,然后调用next函数生成值,再赋值给上述for循环中的变量 i 。那么可多次迭代的实现是不是就是每一次for循环都生成一个迭代器,这样第二个for循环也可以输出值。于是我把__iter__函数中返回的内容改成 return FirstPra(self.value, self.stop)
这样,第二个for循环就有值了。