我们目前在"for x in y:"循环中使用哪个元素

Bas*_*sen 0 python loops list

for x in y:迭代列表的python语法必须以某种方式记住指针当前在哪个元素?我将如何获取该值,因为我试图在不诉诸的情况下解决这个问题 for index, x in enumerate(y):

我想要这样做的技术原因是我假设enumerate()成本性能虽然以某种方式访问​​已存在的"指针"不会.我从答案中看到,但是这个指针非常私密且无法访问.

我想要这样做的功能原因是,如果当前元素浮点值远离"期望的"浮点范围,则能够跳过例如100个元素.

- 答案 -

解决方法如下(纯示意图):

# foo is assumed to be ordered in this example
foo = [1,2,3,4,5,6....,99,100]
low = 60
high = 70
z = iter(foo)
for x in z:
    if x < low-10
        next(islice(z,10,10),None)
    if x > high
        break
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

你不能.for使用Python迭代协议,对于列表意味着它将创建一个私有迭代器对象.该对象跟踪列表中的位置.

即使您要使用显式创建迭代器iter(),当前位置也不是该对象上的公共属性:

>>> list_iter = iter([])
>>> list_iter
<listiterator object at 0x10056a990>
>>> dir(list_iter)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__iter__', '__length_hint__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'next']
Run Code Online (Sandbox Code Playgroud)

迭代协议的要点是,它允许您以完全相同的方式处理任何序列,甚至是无边界的序列.创建一个没有位置的序列生成器是微不足道的:

def toggle():
    while True:
        yield True
        yield False
Run Code Online (Sandbox Code Playgroud)

当您迭代它时,该生成器将在值TrueFalse值之间切换.那里的序列中没有位置,所以也没有任何一点暴露位置.

坚持下去enumerate().所有enumerate()必须做的就是保持柜台.它根本不会在包装的迭代器中保持位置.递增该整数不会花费您太多的性能或内存.

enumerate()基本上是这个,用C实现:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1
Run Code Online (Sandbox Code Playgroud)

因为它是用C实现的,所以它会在任何一天尝试读取原始迭代器上的属性,这在每次迭代中都需要更多的字节码操作.