大多数时候,使第一次迭代更容易(和更便宜)是特殊情况而不是最后一次:

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