而循环没有内容

时间:2017-04-29 00:51:46

标签: python while-loop

我正在为猜测游戏编写一个Python程序,我正在实现主循环的当前方式有效,但感觉错误:

# Guess Loop
while not(guess(ans)):
    pass

它会起作用,但我想知道这是不好的做法(我认为是)。

3 个答案:

答案 0 :(得分:1)

PEP-8,Python的事实上的编码标准中没有任何反对意见。这正是while循环的用途。

我认为你很担心,因为while循环是空的,但是在一个非平凡的程序中它不会,并且你有东西要放在那里。

答案 1 :(得分:0)

我更喜欢

while True:
    if guess(ans):
        break

但你的代码

while not(guess(ans)):
    pass

功能完全相同。它甚至可能稍微高效一点!

from dis import dis
from random import choice

def foo(): return choice([True, False])  # flip a coin

# My code
def bar1():
    while True:
        if foo(): break

# Your code
def bar2():
    while not(foo()):
        pass

>>> dis(bar1)
  2           0 SETUP_LOOP              12 (to 14)

  3     >>    2 LOAD_GLOBAL              0 (foo)
              4 CALL_FUNCTION            0
              6 POP_JUMP_IF_FALSE        2
              8 BREAK_LOOP
             10 JUMP_ABSOLUTE            2
             12 POP_BLOCK
        >>   14 LOAD_CONST               0 (None)
             16 RETURN_VALUE
>>> dis(bar2)
  2           0 SETUP_LOOP              10 (to 12)
        >>    2 LOAD_GLOBAL              0 (foo)
              4 CALL_FUNCTION            0
              6 POP_JUMP_IF_TRUE        10

  3           8 JUMP_ABSOLUTE            2
        >>   10 POP_BLOCK
        >>   12 LOAD_CONST               0 (None)
             14 RETURN_VALUE

您的代码段可以省略" BREAK_LOOP"那里可能会提高性能。当然POP_JUMP_IF_TRUE也可能比POP_JUMP_IF_FALSE略强一些。反之亦然。

无论如何,它们的功能相同。使用你喜欢的任何一个。我更喜欢"永远循环的外观,如果guess(ans)为真,那就打破"到"循环直到guess(ans)的否定为假。"

答案 2 :(得分:-1)

有多种方法可以处理这个想法 - 循环的任何问题(特别是可能发生的一段时间(真)循环的错误)在这里都不会成立,但也许会出现在其他语言中,也许是什么让你停下来。