while循环中的小代码冗余(感觉不干净)

Pon*_*dle 11 python maintainability redundancy organization

所以,在Python中(虽然我认为它可以应用于许多语言),我经常发现自己有这样的事情:

the_input = raw_input("what to print?\n")
while the_input != "quit":
    print the_input
    the_input = raw_input("what to print?\n")
Run Code Online (Sandbox Code Playgroud)

也许我太挑剔了,但我不喜欢这条线有多the_input = raw_input("what to print?\n")重复.它降低了可维护性和组织性.但是我没有看到任何避免重复代码的变通方法而不会进一步恶化问题.在某些语言中,我可以这样写:

while ((the_input=raw_input("what to print?\n")) != "quit") {
    print the_input
}
Run Code Online (Sandbox Code Playgroud)

这绝对不是 Pythonic,Python甚至不允许在循环条件AFAIK中进行赋值.

这个有效的代码修复了冗余,

while 1:
    the_input = raw_input("what to print?\n")
    if the_input == "quit":
        break
    print the_input
Run Code Online (Sandbox Code Playgroud)

但是也感觉不对.将while 1意味着这个循环将永远运行下去; 我正在使用一个循环,但给它一个假的条件并将真正的条件放入其中.

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

Ale*_*lli 30

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

for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'):
    print the_input
Run Code Online (Sandbox Code Playgroud)

Python中的大多数循环,除了最低级别的抽象外,最好for在一些底层迭代器的帮助下实现为循环,它捕获"循环逻辑" - iter内置可以帮助(比如这里),有时候是genexps(生成器)表达式)可以,有时标准库模块itertools来救援.

大多数情况下,您会选择编写自定义生成器函数(使用它们yield),或者偶尔(当您需要真正复杂的状态管理时)自定义迭代器类(一个将__iter__特殊方法定义为return self,next[[或__next__最新版本的Python]) ]返回"迭代中的下一个值".

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