关于for的用法:
python的for循环用于迭代序列,这与其他编程中的for不太一样
例如:可以遍历数组,可以遍历字符串等一系列可迭代对象。
ex:
for i in range(10):
print(i)
for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
print(i)
for i in '0123456789':
print(int(i))
上面三条语句都会输出相同的结果。
关于for的实现:
ls = [0, 1, 2, 3, 4, 5, 6, ]
for i in ls:
if i % 2 == 1:
ls.remove(i)
ls = [0, 1, 1, 2, 3, 3, 4, 5, 5, 6, ]
for i in ls:
if i % 2 == 1:
ls.remove(i)
print(ls)
尝试运行以上代码.如果你认为他们的输出结果是一样的就大错特错了。实际上,python会输出两个不一样的结果。下面是他们的输出结果。
[0, 2, 4, 6]
[0, 1, 2, 3, 4, 5, 6]
看来我们在for循环的时候如果删除了列表中的元素,for循环并不会“老实”地一直向前,而是会跳过下一个本来应该访问地字符。
既然for循环可以遍历所有可迭代对象,那现在我们探究一下迭代器的工作原理。迭代器通过__next__方法实现。next每次返回列表的下一个item。
ls = [0, 1, 1, 2, 3, 3, 4, 5, 5, 6, ]
it = iter(ls)
print(next(it))
ls.remove(1)
print(ls)
print(next(it))
ls.remove(1)
print(ls)
print(next(it))
print(ls)
输出如下:
0
[0, 1, 2, 3, 3, 4, 5, 5, 6]
1
[0, 2, 3, 3, 4, 5, 5, 6]
3
[0, 2, 3, 3, 4, 5, 5, 6]
我们可以轻易地看见,迭代器确实跳过了某些元素。这种跳过地方法很容易想到python的for循环本质上也是对数组下标进行遍历,but一个让我不那么想的原因,就是会发生溢出的情况。显然这和实际情况不符合,实际并不会发生溢出。
嗯!脑容量有限!直接看迭代器源码吧。。。
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
嗯 !not bad!还是猜对了一些的。确实和之前预想的用index进行遍历,但是python用了一个raise实现抛出StopIteration错误,不会出现溢出的情况。
另一个知识点:从上面的代码可以看出,index是递减的,结合list的append方法在列表尾部增加元素。突然发现list本质上是一个栈。
至此,大致了解了python for循环的机制。