У більшості випадків простіше (і дешевше) зробити першу ітерацію окремим випадком замість останнього:
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