所有这些在技术上都是不同的。
例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)
在这种情况下,只有while1
和while2
将终止。由于bool(None)
的计算结果为False
,因此while3
将无限延续,但由于None != False
和None is not False
,while1
和while2
都将终止。
现在,通过更复杂的例子,这会变得更有趣。
例2
def fun(x):
return x
现在,对于我们每一个循环的,我们要改变flag = fun()
到flag = fun(0)
。
在这种情况下,while1
和while3
终止,而while2
无限期地继续。这是因为bool(0) == False
和0 == False
,但0 is not False
。
例3 - Mutables
现在,这得到了很多更加复杂与mutables,这就是为什么明确与隐含的依赖局面的情况。可变数是可以修改的任何对象,并包括字典,列表。不可变的对象是任何不能被修改的东西,比如元组,浮点数,浮点数,strs。
说我有以下几点:
a = []
b = []
在这种情况下,bool(a) == False
和a == b
,但a is not b
。简而言之,如何检查虚伪或真实的价值观并不存在,简单而坚定的规则。
但是,有一般规则。
通则
检查无与其他来源 如果你接受比无其他任何值,检查x is None
。
检查mutables 切勿使用x is b
,因为mutables可以有不同的ID,除非你明确要检查使用相同的ID(id(x) == id(b)
的对象。 通常情况下,检查not x
或x == 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 == b
或x is b
。
最后... While循环
如果可以的话,总是一个while循环转换为一个循环。这并不总是可能的,但说你想要做一个简单的例子:
x = 0
while x < 10:
print(x)
x -= 1
这可以转换为:
for x in range(10):
print(x)
之所以使用for循环而不是while循环是,如果某个错误发生在你的代码中,while循环可能导致无限循环并导致你的程序崩溃,而for循环总是会退出。
如果你想使你的意图在while循环的条件明确,我想创建一个'didnt_break_yet =拉姆达:TRUE'和使用它像'而didnt_break_yet():#做something'。通过这种方式,您可以清楚地知道,循环*无意运行无限长* – WorldSEnder
如果您有多个选项可供选择,无论您的个人偏好是什么,都可以使用代码上下文中的任何作品。 –