2016-05-12 74 views
0

我还是比较新的Python和使用都像报表中的以下内容:“while True”循环的替代语法?

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 

前三种方法更明确,那么为什么他们(或其中之一)不优于第四种方法?前三种写作“while flag == False”的方式有什么不同吗?

+1

如果你想使你的意图在while循环的条件明确,我想创建一个'didnt_break_yet =拉姆达:TRUE'和使用它像'而didnt_break_yet():#做something'。通过这种方式,您可以清楚地知道,循环*无意运行无限长* – WorldSEnder

+0

如果您有多个选项可供选择,无论您的个人偏好是什么,都可以使用代码上下文中的任何作品。 –

回答

-1

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

例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)的计算结果为False,因此while3将无限延续,但由于None != FalseNone is not Falsewhile1while2都将终止。

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

例2

def fun(x): 
    return x 

现在,对于我们每一个循环的,我们要改变flag = fun()flag = fun(0)

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

例3 - Mutables

现在,这得到了很多更加复杂与mutables,这就是为什么明确与隐含的依赖局面的情况。可变数是可以修改的任何对象,并包括字典,列表。不可变的对象是任何不能被修改的东西,比如元组,浮点数,浮点数,strs。

说我有以下几点:

a = [] 
b = [] 

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

但是,有一般规则。

通则

检查无与其他来源 如果你接受比无其他任何值,检查x is None

检查mutables 切勿使用x is b,因为mutables可以有不同的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循环

如果可以的话,总是一个while循环转换为一个循环。这并不总是可能的,但说你想要做一个简单的例子:

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

这可以转换为:

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

之所以使用for循环而不是while循环是,如果某个错误发生在你的代码中,while循环可能导致无限循环并导致你的程序崩溃,而for循环总是会退出。

+0

匿名downvoter,有何评论? –

+0

这是一个非常有帮助的答案,谢谢!我想对于我的任何电流应用,我可以继续使用任何方法为'flag'只会被设置为TRUE;或'FALSE',但基本上使用'而TRUE'避免了所产生的这些问题,对不对? – Lotte

+0

@Lotte,是的。 '而真'是一个很好的声明,直到一个条件被设置。如果可以,请将while循环转换为for循环,但如果您需要将代码卷积到循环中,while循环存在的原因很充分。 –

0

我不认为真的有偏好。只要指定的布尔表达式保持为真,while循环将继续执行代码块。

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

0

虽然前三个更明确,但最后一个更具可读性和清晰性。我想说的是,这是其他三个选项的更大选项。将不会搜索循环中某些变量的初始化。就这样说,所有的方法都是完全可以接受的,你应该使用一个更舒适的方法。

0

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

此外,如果while条件命名正确,那么它会列出您为什么要循环的文档。

while not end_of_file: 
    ..read read read.. 

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

+0

我想问一下避免多个'return'语句的原因是什么?这仅仅是为了清楚吗?我可能会对此感到内疚。 – Lotte

+0

@Lotte,为清楚起见,也为调试代码更实际的原因。很高兴有一个地方所有的代码退出,所以你可以找出返回值。 – swdev