3

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

4

4 回答 4

11

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

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)
于 2012-06-04T16:35:31.163 回答
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。

于 2012-06-04T15:57:30.207 回答
2

你会习惯的。只需在上限上加一即可。

于 2012-06-04T15:57:07.820 回答
0

您可以在没有太多痛苦的情况下定义一个:

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

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

于 2014-04-26T05:07:10.847 回答