Небольшое избыточность кода в то время как-петли (не чувствует себя чистой)
-
05-10-2019 - |
Вопрос
Итак, в Python (хотя я думаю, что это может быть применено на многих языках), я оказываюсь с чем-то вроде этого довольно часто:
the_input = raw_input("what to print?\n")
while the_input != "quit":
print the_input
the_input = raw_input("what to print?\n")
Может быть, я слишком тихо, но мне не нравится как линия the_input = raw_input("what to print?\n")
должен повторяться. Это уменьшает ремонтопригодность и организацию. Но я не вижу никаких взаимодействий, чтобы избежать дублированного кода без дальнейшего ухудшения проблемы. На некоторых языках я мог написать что-то вроде этого:
while ((the_input=raw_input("what to print?\n")) != "quit") {
print the_input
}
Это определенно нет Pythonic и Python даже не допускают задания в условиях петли AFAIK.
Этот допустимый код исправляет избыточность,
while 1:
the_input = raw_input("what to print?\n")
if the_input == "quit":
break
print the_input
Но тоже не чувствует себя правильно. То while 1
подразумевает, что эта петля будет работать навсегда; Я использую цикл, но придавая ему поддельное состояние и помещая настоящую внутри него.
Я слишком тихо? Есть лучший способ сделать это? Возможно, есть какая-то языковая конструкция, разработанная для этого, о которых я не знаю?
Решение
Думать итераторы - Например, в этом конкретном случае:
for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'):
print the_input
Большинство петель в Python, за исключением самых низких уровней абстракций, лучше всего реализуются как for
петли с помощью некоторого моделящего итератора, который захватывает «петли логику» - iter
Встроенная может помочь (например, здесь), иногда Genexps (выражения генератора) может, иногда стандартный библиотечный модуль itertools
приходит к спасению.
Чаще всего вы выберете кодировать обычай Функции генератора (те, которые используют yield
), или более изредка (когда вам нужно действительно сложное управление государством) обычай Итератор класс (Один Определяющий __iter__
Специальный метод как return self
, а также next
[или __next__
В последних версиях Python]] вернуть «следующее значение из итерации).
Захватить логику логика, кроме того, что вы, делать На различных элементах, последовательно производимых самой петлей, является ключевой абстракцией-помощником здесь!