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

时间:2012-06-04 15:55:32

标签: python for-loop

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

4 个答案:

答案 0 :(得分:10)

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

for i in range(len(container)):
    print container[i]

你应该这样做:

for item in container:
    print item

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

for i, item in enumerate(container):
    print item
    container[i] += 1

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

container = [item + 1 for item in container]

或者如果你需要修改列表,试试这个,它结合了一个切片分配(替换现有的列表)和一个生成器表达式(懒惰地修改项目):

 container[:] = (item + 1 for item in container)

答案 1 :(得分: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。

答案 2 :(得分:2)

你会习惯的。只需在上限添加一个。

答案 3 :(得分:0)

你可以定义一个没有太多痛苦:

def fullrange(lower, upper, step = 1):
    return range(lower, upper + 1, step)

但正如其他人所说,习惯range(lower, upper + 1)可能会更好。我会说+ 1的意图非常明确。