有时我有点困惑,记住默认情况下排除了 for 循环的上限。有没有办法让它具有包容性?
4 回答
十分之九,如果你正在编写一个 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)
是的,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。
你会习惯的。只需在上限上加一即可。
您可以在没有太多痛苦的情况下定义一个:
def fullrange(lower, upper, step = 1):
return range(lower, upper + 1, step)
但正如其他人所说,习惯可能会更好range(lower, upper + 1)
。我想说的意图+ 1
很明确。