有时让我记住默认情况下排除for循环的上限是有点困惑的。有没有办法让它具有包容性?
答案 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
的意图非常明确。