代码之家  ›  专栏  ›  技术社区  ›  Ponkadoodle

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

  •  11
  • Ponkadoodle  · 技术社区  · 16 年前

    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
    }
    

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

    while 1:
        the_input = raw_input("what to print?\n")
        if the_input == "quit":
            break
        print the_input
    

    但感觉也不太对。这个 while 1 意味着这个循环将永远运行;我用的是循环,但是给它一个假条件,然后把真的放进去。

    我是不是太挑剔了?有没有更好的办法?也许我不知道有什么语言结构是为此而设计的?

    1 回复  |  直到 12 年前
        1
  •  30
  •   Alex Martelli    16 年前

    思考 迭代器 --例如,在这种特殊情况下:

    for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'):
        print the_input
    

    Python中的大多数循环,除了最底层的抽象外,都最好实现为 for 借助于一些捕获“循环逻辑”的下划线迭代器进行循环 iter 内置的可以帮助(比如这里),有时genexps(generator expressions)可以,有时标准库模块可以 itertools

    大多数情况下,您会选择自定义代码 发电机功能 (使用 yield ),或者更偶尔(当您需要非常复杂的状态管理时)定制 迭代器类 __iter__ 特殊方法 return self next __next__ 在最新版本的Python中]]返回“迭代的下一个值”。

    在这里,循环本身按顺序生成的各个项是关键的抽象助手!

    推荐文章