Something about Python:for

      关于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循环的机制。

参考文献:python的for循环,背后是什么原理? - 云+社区 - 腾讯云 (tencent.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hithithithithit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值