for
использует iter(song)
для цикла; вы можете сделать это в своем собственном коде, а затем продвигать итератор внутри цикла; повторный вызов iter()
для итерации вернет только тот же итерируемый объект, поэтому вы можете продвигать итерацию внутри цикла, а for
следует прямо на следующей итерации.
Усовершенствуйте итератор с помощью next()
функции; он правильно работает как в Python 2, так и в 3 без необходимости корректировать синтаксис:
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
print sing
if sing == 'look':
next(song_iter)
next(song_iter)
next(song_iter)
print 'a' + next(song_iter)
Перемещая строку print sing
вверх, мы также можем избежать повторения самих себя.
Использование next()
таким образом может вызвать исключение StopIteration
, если в итерируемом объекте нет значений.
Вы могли бы поймать это исключение, но было бы проще дать next()
второй аргумент, значение по умолчанию, чтобы игнорировать исключение и вместо этого возвращать значение по умолчанию:
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
print sing
if sing == 'look':
next(song_iter, None)
next(song_iter, None)
next(song_iter, None)
print 'a' + next(song_iter, '')
Вместо этого я бы использовал itertools.islice()
, чтобы пропустить 3 элемента; сохраняет повторные next()
вызовы:
from itertools import islice
song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
song_iter = iter(song)
for sing in song_iter:
print sing
if sing == 'look':
print 'a' + next(islice(song_iter, 3, 4), '')
Итерируемый islice(song_iter, 3, 4)
пропустит 3 элемента, затем вернет 4-й, а затем будет готов. Таким образом, вызов next()
для этого объекта извлекает 4-й элемент из song_iter()
.
Демо:
>>> from itertools import islice
>>> song = ['always', 'look', 'on', 'the', 'bright', 'side', 'of', 'life']
>>> song_iter = iter(song)
>>> for sing in song_iter:
... print sing
... if sing == 'look':
... print 'a' + next(islice(song_iter, 3, 4), '')
...
always
look
aside
of
life
person
Martijn Pieters
schedule
10.03.2014