大多数情况下,让第一次迭代成为特殊情况比最后一次迭代更容易(也更便宜):
first = True
for data in data_list:
if first:
first = False
else:
between_items()
item()
这将适用于任何迭代对象,即使是那些没有len()的迭代对象:
file = open('/path/to/file')
for line in file:
process_line(line)
# No way of telling if this is the last line!
除此之外,我不认为有更好的解决方案,因为这取决于你想要做什么。例如,如果您正在从列表中构建字符串,那么使用str.join()自然比使用“带有特殊情况”的For循环更好。
使用相同的原理,但更紧凑:
for i, line in enumerate(data_list):
if i > 0:
between_items()
item()
看起来很眼熟,不是吗?:)
对于@ofko,以及其他真正需要找出不带len()的可迭代对象的当前值是否为最后一个值的人,你需要向前看:
def lookahead(iterable):
"""Pass through all values from the given iterable, augmented by the
information if there are more values to come after the current one
(True), or if it is the last value (False).
"""
# Get an iterator and pull the first value.
it = iter(iterable)
last = next(it)
# Run the iterator to exhaustion (starting from the second value).
for val in it:
# Report the *previous* value (more to come).
yield last, True
last = val
# Report the last value.
yield last, False
然后你可以这样使用它:
>>> for i, has_more in lookahead(range(3)):
... print(i, has_more)
0 True
1 True
2 False