Как выполнить итерацию в конце, а не в начале al oop in python без выполнения while? - PullRequest
0 голосов
/ 17 апреля 2020

Простите, я новичок в python.

В других языках, когда я хочу выполнить итерацию в конце al oop, а не в начале, я бы использовал do while l oop.

Python не имеет do while, поэтому я сделал это:

iter_ = zip(x_list, y_list)
x,y = initial_values()
while x:
    foo(x,y)
    x,y = next(iter_,(False,False))

Это прекрасно работает, но я не полностью удовлетворен:

  • кортеж по умолчанию (False,False). Однако я считаю предпочтительным try except: StopIteration; break
  • использование x в качестве условия, поскольку x может быть элементом, который на законных основаниях интерпретируется как False в логическом тесте. Однако я считаю, что предпочтительнее ввести отдельную переменную условия и выполнить тест в дополнение к вызову next()

Какой самый лучший / самый лучший python идиоматический c способ выполнения итерации в конце а не начало л oop?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я думаю, что есть два разных способа ответить на ваш вопрос.

Во-первых, касаясь только решения проблем, я бы сказал, что ваш вариант использования do...while l oop является искусственным, и, возможно, происходит от какого-то другого языка, который использует этот вид запутанного мышления. В Python я бы использовал:

z = calc_z_for_first_pass()
for x,y in zip(x_list, y_list) 
    foo(x,y,z)
    z = calc_z_for_subsequent_passes()

Во-вторых, действительно есть случаи, когда вы хотели бы иметь do...while l oop, например что-то вроде:

do:
    z = calc_z()
while not is_valid(z)

В этом случае вам нужно вручную эмулировать свой собственный do...while l oop (см. [ Эмулировать do-while l oop в Python? , как предложено Ольвином) :

while True:
    z = calc_z()
    if is_valid(z):
        break
0 голосов
/ 17 апреля 2020

А как же:

z = set_z_for_first_pass()  
for x,y in zip(x_list,y_list):
   if not x: break
   foo(x,y,z)
   z = set_z_for_subsequent_passes()
...