while循环中的小代码冗余(感觉不够简洁)
在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
}
这绝对不是“Python风格”的写法,而且据我所知,Python甚至不允许在循环条件中进行赋值。
这段有效的代码解决了重复的问题,
while 1:
the_input = raw_input("what to print?\n")
if the_input == "quit":
break
print the_input
但感觉也不太对。while 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__
这个特殊方法返回self
,并且定义next
(或者在最新版本的Python中是__next__
)来返回“迭代中的下一个值”)。
将循环逻辑与循环中逐个产生的各种项目分开处理,是这里的关键抽象帮助!