Python for循环具有更直观的上限?

MyN*_*han 3 python for-loop

有时让我记住,默认情况下排除for循环的上限是有点困惑的.有没有办法让它具有包容性?

kin*_*all 10

十分之九,如果你正在编写for迭代一系列数字的Python 循环,然后使用这些数字索引到一个列表或其他容器中,那你做错了.换句话说,而不是这样做:

for i in range(len(container)):
    print container[i]
Run Code Online (Sandbox Code Playgroud)

你应该这样做:

for item in container:
    print item
Run Code Online (Sandbox Code Playgroud)

可是等等!你反对.如果我需要索引怎么办,因为我要以某种方式修改项目?Pythonic的方法是使用enumerate()内置函数.

for i, item in enumerate(container):
    print item
    container[i] += 1
Run Code Online (Sandbox Code Playgroud)

如果您不介意制作列表副本,那么列表理解通常是最佳选择:

container = [item + 1 for item in container]
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要修改列表,请尝试此操作,它将切片分配(替换现有列表)和生成器表达式(懒惰地修改项目)组合在一起:

 container[:] = (item + 1 for item in container)
Run Code Online (Sandbox Code Playgroud)


Lev*_*von 7

是的,for i in range(upper + 1)或者如果你愿意,for i in range(lower, upper + 1)会工作,

许多编程语言使用从零开始的索引,因此非包容性上限是一种常见做法(这是由于内存寻址和添加偏移量)

举个例子:如果你有一个大小为5的数组ar,从索引0开始,你最大的有效索引值将是4(即0,1,2,3,4),但你的循环结构会引用大小数组(5)如下:

for i in range(5):

或更常见和更好:

for i in range(len(ar)):

..确保您只获得合法的索引值0 .. 4.

  • @ user1435323但即使在C++中,出于同样的原因,你几乎也不会这样做.一旦你编写了递归算法,你就会注意到,使用独占边界将输入分成两个大小相等的部分要容易得多.因此,相应地设计API是一个非常好的主意. (2认同)