11

所以,在 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意味着这个循环将永远运行;我正在使用一个循环,但给它一个假条件并将真实的条件放入其中。

是我太挑剔了吗?有一个更好的方法吗?也许有一些我不知道的为此设计的语言结构?

4

1 回答 1

30

想想迭代器——例如,在这种特定情况下:

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 中] ] 返回“迭代中的下一个值)。

除了你对循环本身顺序产生的各种项目所做的任何事情之外,捕获循环逻辑是这里的关键抽象助手

于 2010-05-31T03:50:43.260 回答