while循环中的小代码冗余(感觉不够简洁)

11 投票
1 回答
701 浏览
提问于 2025-04-15 23:22

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

将循环逻辑与循环中逐个产生的各种项目分开处理,是这里的关键抽象帮助!

撰写回答