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)
你不能.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)
当您迭代它时,该生成器将在值True和False值之间切换.那里的序列中没有位置,所以也没有任何一点暴露位置.
坚持下去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实现的,所以它会在任何一天尝试读取原始迭代器上的属性,这在每次迭代中都需要更多的字节码操作.
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |