"而True"的替代语法环?

时间:2016-05-12 23:38:27

标签: python loops while-loop

我对Python仍然比较新,并且一直在使用如下语句:

flag = False
while flag == False:
    # Do something here that might set the flag to True,
    flag = True

然而,这可以这样写:

while not flag:
    # Do something...
    flag = True 
while flag is False:
    # Do something...
    flag = True

使用另一种(首选?)方式编写这种类型的循环:

while True:
    # Do something and if wanting wanting to break out of loop,
    break

前三种方法更明确,为什么他们(或其中一种)不比第四种方法更受欢迎?写前三种方式之间是否存在差异?#34;而flag == False"?

4 个答案:

答案 0 :(得分:0)

我认为不存在偏好。只要指定的布尔表达式保持为True,while循环就会继续执行代码块。

flag == True,不是Flag,i< 6或评估为布尔表达式。如果你只是像你的例子那样说真,那么你只会进入一个无限循环。这会回答你的问题吗?

答案 1 :(得分:0)

所有这些都在技术上有所不同。

示例1

假设您有一个不返回任何有意义的函数调用,如下所示:

def fun(x=None):
    return x

现在,对于你的while循环,所有这些都将定义如下:

def while1():
   flag = False
   while flag == False:
      flag = fun(None)

def while2():
   flag = False
   while flag is False:
      flag = fun(None)

def while3():
   flag = False
   while not flag:
      flag = fun(None)

在这种情况下,只有while1while2会终止。由于bool(None)评估为Falsewhile3将无限延续,但自None != FalseNone is not False以来,while1while2都会终止。

现在,通过更复杂的示例,这会变得更有趣。

示例2

def fun(x):
    return x

现在,对于我们的每个循环,我们都会将flag = fun()更改为flag = fun(0)

在这种情况下,while1while3会终止,而while2会无限期地继续。这是因为bool(0) == False0 == False,但0 is not False

示例3 - Mutables

现在,对于mutable来说,这会变得更复杂,这就是为什么显式与隐式取决于情况的原因。 Mutables是可以修改的任何对象,包括dicts,lists。不可变对象是任何无法修改的对象,例如元组,整数,浮点数,strs。

说我有以下内容:

a = []
b = []

在这种情况下,bool(a) == Falsea == b,但a is not b。简而言之,对于如何检查虚假或真实的价值观,没有简单而坚定的规则。

但是,有一般规则。

一般规则

检查无与其他 如果您接受除None之外的任何值,请选中x is None

检查可变对象 永远不要使用x is b,因为mutable可以有不同的ID,除非您明确要检查具有相同ID(id(x) == id(b)的对象。 通常,请检查not xx == b

>>> a = []
>>> b = []
>>> a is b
False
>>> a == b
True
>>> not a
True

检查strs,浮动和整数 对于strs,浮点数和整数,请务必选中x == b而不是x is b。这是因为对于短strs,浮点数,整数,如果x == b,结果可能为真,但对于更复杂的情况,您的代码将停止工作。

例如:

>>> a = 1
>>> a is 1
True
>>> a = 10000000
>>> a is 10000000
False

检查布尔值

对于布尔值,您可以执行以上任何操作,但not x优于x == bx is b

最后......循环时

如果可以,请始终将while循环转换为for循环。这并不总是可行的,但是说你想做一个简单的案例:

x = 0
while x < 10:
    print(x)
    x -= 1

这可以转换为:

for x in range(10):
    print(x)

使用for循环而不是while循环的原因是代码中发生了一些错误,而循环可能导致无限循环并导致程序崩溃,而for循环将始终退出。

答案 2 :(得分:0)

虽然前三个更明确,但最后一个更易读和清晰。我想说这使得它比其他三个更好。不会为循环搜索某些变量的初始化。话虽如此,所有的方法都是完全可以接受的,你应该使用对你来说更舒适的方法。

答案 3 :(得分:0)

我认为while True:语法适用于简单逻辑。一旦你开始从多个位置突破循环或需要跟踪循环是否成功,那么它就会变得混乱。

此外,如果while条件被正确命名,那么它就是为什么要循环的文档。

while not end_of_file:
   ..read read read..

避免循环中的break语句,恕我直言,使代码更具可读性。就像避免函数中的多个return语句一样。