Небольшое избыточность кода в то время как-петли (не чувствует себя чистой)

StackOverflow https://stackoverflow.com/questions/2941272

Вопрос

Итак, в 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]] вернуть «следующее значение из итерации).

Захватить логику логика, кроме того, что вы, делать На различных элементах, последовательно производимых самой петлей, является ключевой абстракцией-помощником здесь!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top