Hyp*_*eus 63 python for-loop range
人们常常在SO的python问题中找到这种类型的表达式.要么只是访问iterable的所有项目
for i in range(len(a)):
print(a[i])
Run Code Online (Sandbox Code Playgroud)
这只是一种繁琐的写作方式:
for e in a:
print(e)
Run Code Online (Sandbox Code Playgroud)
或者为了分配可迭代的元素:
for i in range(len(a)):
a[i] = a[i] * 2
Run Code Online (Sandbox Code Playgroud)
哪个应该是相同的:
for i, e in enumerate(a):
a[i] = e * 2
# Or if it isn't too expensive to create a new iterable
a = [e * 2 for e in a]
Run Code Online (Sandbox Code Playgroud)
或者对索引进行过滤:
for i in range(len(a)):
if i % 2 == 1: continue
print(a[i])
Run Code Online (Sandbox Code Playgroud)
可以这样表达:
for e in a [::2]:
print(e)
Run Code Online (Sandbox Code Playgroud)
或者当您只需要列表的长度而不是其内容时:
for _ in range(len(a)):
doSomethingUnrelatedToA()
Run Code Online (Sandbox Code Playgroud)
可能是:
for _ in a:
doSomethingUnrelatedToA()
Run Code Online (Sandbox Code Playgroud)
在蟒蛇我们enumerate,切片,filter,sorted,等...至于蟒蛇for结构旨在遍历iterables不仅整数的范围,是你需要有真实世界的使用情况in range(len(a))?
Jon*_*nts 11
如果你需要使用序列的索引,那么是 - 你使用它...例如相当于numpy.argsort ...:
>>> a = [6, 3, 1, 2, 5, 4]
>>> sorted(range(len(a)), key=a.__getitem__)
[2, 3, 1, 5, 4, 0]
Run Code Online (Sandbox Code Playgroud)
简短回答:从数学上讲,不,实际上,是的,例如对于故意编程.
从技术上讲,我认为数学上正确的答案是"不,它不需要",因为它可以使用其他结构表达,即它等同于其他结构......就像一个语言是图灵完整的那样,它在哪个句法上并不重要/范式构造它,因为无论如何一切都可以在其中表达.
但实际上,我使用for i in range(len(a)(或者for _ in range(len(a))如果我不需要索引)使它明确表示我想迭代序列中的项目的次数,而不需要使用序列中的项目.
那么回答"有需要吗?" part -I 需要它来表达代码的含义/意图以便于阅读.
另见:https://en.wikipedia.org/wiki/Intentional_programming
PS但同时,从故意编程的角度看,以下似乎在语义上是等价的:
for _ in a:
...
Run Code Online (Sandbox Code Playgroud)
要么
b = ["hello" for _ in a]
Run Code Online (Sandbox Code Playgroud)
...总而言之,我猜不同之处在于你是否真的要明确"重复多次出现,因为有些项目a",而不是"对于每一个元素a,无论内容是什么a" ......所以最后只是故意编程的细微差别.
如果您需要同时访问列表中的两个元素,该怎么办?
for i in range(len(a[0:-1])):
something_new[i] = a[i] * a[i+1]
Run Code Online (Sandbox Code Playgroud)
你可以使用它,但它可能不太清楚:
for i, _ in enumerate(a[0:-1]):
something_new[i] = a[i] * a[i+1]
Run Code Online (Sandbox Code Playgroud)
就个人而言,我对这两者都不是百分之百!