因此,在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甚至不允许在循环条件下进行分配。

此有效的代码修复了冗余,

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