段落内的小型代码冗余(不干净)
-
05-10-2019 - |
题
因此,在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]]中,以返回“从迭代中返回下一个值)。
捕获循环的逻辑,除了您是什么 做 在循环本身依次生产的各种项目上,是这里的关键抽象助手!
不隶属于 StackOverflow