【问题标题】:while-loops and python [duplicate]while循环和python [重复]
【发布时间】:2012-07-03 19:01:12
【问题描述】:

可能重复:
Why avoid while loops?

我正在尝试通过关注Learn Python The Hard Way 来学习 Python,随着我的进步,我发现它在网站上提到,

只使用 while 循环来永远循环,这意味着可能永远不会。这仅适用于 Python,其他语言不同。

现在我基本上是一名 Java 开发人员,这让我想知道为什么 while 在 Python 中应该避免使用,尽管它在 Java 中被广泛使用。我一直无法在互联网上找到任何答案。

【问题讨论】:

标签: python performance while-loop infinite-loop


【解决方案1】:

他在Exercise 33说:

while 循环的问题是:有时它们不会停止。

如果您知道自己在做什么,这并不是真正的 Python 问题。 ;)

【讨论】:

    【解决方案2】:

    for 在您想要迭代一定次数时几乎是 Python 中的“默认”选择。例如:

    for i in xrange(10):
        #do stuff
        #iterates 10 times
    
    for an_element in a_collection:
        #do stuff
        #iterates over every element in a collection
        #though generators can be "infinite"
    

    但是,如果您想循环代码 无限 次,while 循环更符合习惯。

    while a_boolean: 
        #do stuff
        #iterates as long as a_boolean evaluates to True
    
    while True:
        #do stuff
        #iterates till a break is encountered
    

    由于您来自 Java 背景,Python 中的 while 循环与 Java 中的 while 循环几乎相同,并且使用方式也大致相同。 Python 中的for 循环类似于:

     for(Integer i : anArrayListOfIntegers){
         //do stuff
     }
    

    for(int i=0;i<10;i++) 表单在 Python 中不存在,您可以在第一个示例中使用 range()/xrange() 表单。也就是说,每个for 循环都可以替换为等效的while 循环,除非是列表推导/生成器表达式等。

    在速度或内存使用方面,这样做没有真正的优势或劣势。然而,Python 程序员在迭代集合时倾向于使用for,而当他们想要迭代while直到 条件为真时,他们倾向于使用while。如果你坚持这个一般的经验法则,你可能不会出错。

    【讨论】:

      【解决方案3】:

      while 循环在 Python 中没有任何问题,当您不处理可迭代对象时,它也有它的位置。

      但如果您正在处理一个可迭代对象(这个概念在 Python 中非常普遍),for 循环总是更好的构造。

      例如,在许多语言中,您会写如下内容:

      while(! file.EOF) {
          ...
      }
      

      在 Python 中你使用:

      for line in file:
          do_something_with(line)
      

      【讨论】:

        【解决方案4】:

        这种说法非常主观,我不确定我是否同意。在 Python 中使用while 很容易产生无限循环:

          while True:
               # do stuff
        

        也许作者将其与 C 进行比较,在 C 中,for 也很容易产生无限循环:

          for(;;)
              /* do stuff */
        

        在 Python 中确实不存在这样的对应结构。

        话虽如此,有很多情况下无限循环很有用(在任何语言中) - 想想事件循环,或者循环控制可以通过无限循环来简化,并且只有某些条件会导致 break

        您经常会处理诸如列表和字符串之类的序列,并且使用 for 循环将是一个自然的选择,但我不会仅仅因为这个而忽略 while 循环。

        【讨论】:

        • 但是 while 循环是否会对代码造成任何不利影响?
        • @AnuragRamdasan 我没有看到.. 当然,任何错误选择的语言结构都可以。即,如果您的问题需要 for-loop 而您使用 while,它可能不是最佳选择,但它仍然可行。从技术角度来看,我认为没有劣势。
        【解决方案5】:

        Learn Python The Hard Way 相当固执己见,所以我不认为这意味着你永远不应该使用while。我最好的猜测是,因为迭代器是 Python 中普遍存在的模式,所以大多数实际迭代都可以使用for..in。 Java 有使用 while (it.hasNext()) { … } 的旧 Iterator 模式,或者类似的方式来读取 JDBC ResultSets,或者从标准输入读取行——所有这些都可以在 Python 中使用 for..in 来实现。 (可行并且可以说应该这样做;for..in 更具可读性,yield 使编写常规迭代变得容易,因此库没有理由不公开迭代器 API。)

        【讨论】:

          【解决方案6】:

          没有什么奇怪的想法。事实上,while 是 Python 中唯一的“经典”循环方式,因为for 是其他语言中foreach 的类比(即迭代集合或迭代器的运算符)。

          【讨论】:

            猜你喜欢
            • 2014-08-29
            • 1970-01-01
            • 2021-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-15
            • 2021-01-03
            • 1970-01-01
            相关资源
            最近更新 更多