如果变量不是None,是否有一种pythonic方式将条件添加到while语句

时间:2019-02-11 01:35:12

标签: python python-3.x

仅当变量值不为None时,我才想向while循环添加条件。

我现在正在使用的这种方法:

from queue import Queue
max_limit = None  # could be None or an integer (user provided value)
q = Queue()
q = get_values()
counter = 0
while not q.empty() and \
      (not max_limit or counter <= max_limit):

     # If max_limit is None , counter <= max_limit never gets evaluated thanks to lazy OR

     # do stuff...
     counter += 1 

现在的问题是,仅通过查看就很难确定正在做什么。除了在while循环之前或之内添加if语句之外,还有其他更Python化的方法吗?

4 个答案:

答案 0 :(得分:3)

尽管您的声明:

  

除了在while循环之前或之内添加if语句

我相信这实际上是最好的解决方案。

如果您最终遇到多个约束中的一个,可能会变成非常丑陋的while条件,因此我将离开while循环来处理正常情况,而只需添加“退出”尽早循环”代码来处理特殊情况,例如:

counter = 0
while not q.empty():
    counter += 1
    if max_limit is not None and counter > max_limit: break # User count limit.
    if GetElapsedTime() > timeLimit:                  break # Took too long.
    # Other checks as necessary.

    # do stuff...

每行有一个退出原因(并有记录),它仍然保持原始循环的可读性。


您应该记住,Pythonic代码并非总是 最好的代码,有时它只是用来显示人们如何认为自己很聪明:-)

我的第一个倾向是始终针对 可读性进行优化。

答案 1 :(得分:3)

尽管您的数学老师会告诉您什么,但实际上 是最大的数字。

max_limit = # do something magic
if max_limit is None:
    max_limit = float('inf')
# ...
while not q.empty() and counter <= max_limit:
    pass
顾名思义,

float('inf')是浮点常量无穷大,它大于任何有限值。由于counter总是较小,因此它将有效地禁用您的条件。而且while循环代码也不会被一堆条件语句所困扰。

答案 2 :(得分:0)

max_limit = None or sys.maxint  # use sys.maxsize for python 3
counter = 0
while not q.empty():
    if counter > max_limit:
        break  # exit the loop

    # do stuff...

    counter += 1

答案 3 :(得分:-1)

from queue import Queue
max_limit = None  # could be None or an integer (user provided value)
q = Queue()
q = get_values()
counter = 0
while q is not None and counter <= max_limit:

     counter += 1