所以,在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
意味着这个循环将永远运行;我正在使用一个循环,但给它一个假的条件并将真正的条件放入其中。
我太挑剔了吗?有一个更好的方法吗?也许有一些我不知道的为此设计的语言结构?
答案 0 :(得分:30)
认为迭代器 - 例如,在这种特定情况下:
for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'):
print the_input
Python中的大多数循环,除了最低级别的抽象外,最好用for
循环实现,借助一些底层迭代器捕获“循环逻辑” - 构建iter
-in可以帮助(比如这里),有时genexps(生成器表达式)可以,有时标准库模块itertools
来救援。
大多数情况下,您会选择编写自定义生成器函数(使用yield
),或者偶尔(当您需要非常复杂的状态管理时)自定义迭代器类< / em>(一个将__iter__
特殊方法定义为return self
,并在最新版本的Python中使用next
[[或__next__
]]返回“迭代)。
捕获循环逻辑,除了你对循环本身顺序生成的各个项目 之外的任何东西都是关键的抽象助手!