如果你把无知隐藏起来,没人可以伤害你
但你也学不到任何东西。
while 1
while 1 是一个无限循环。
while ture在Python3中与之相同,在Python2中while 1 会更快。
由于Python2中,True/False不是关键字,因此我们可以对其进行任意的赋值,这就导致程序在每次循环时都需要对True/False的值进行检查。
>>> True = 5
>>> True == 5
True
而对于1,则被程序进行了优化,而后不会再进行检查。
而在Python3中,由于True/False已经是关键字了,不允许进行重新赋值,因此,其执行结果与while 1不再有区别。
由于python2还在被广泛使用中,所以建议统一使用while 1提升性能。
>>> import timeit
>>>
>>>
>>> def while_one():
... i = 0
... while 1:
... i += 1
... if i == 1000000:
... break
...
>>>
>>> def while_true():
... i = 0
... while True:
... i += 1
... if i == 1000000:
... break
...
>>>
>>> time1 = timeit.timeit(while_one, number=3)
>>> time2 = timeit.timeit(while_true, number=3)
>>> print("while one: %s\nwhile_true: %s" % (time1, time2))
while one: 0.18305241497 # in python2
while_true: 0.259429785424 # in python2
while one: 0.24419935399782844 # in python3
while_true: 0.20986851999623468 # in python3
True + True = 2
python中bool是int的子类,因此为了保证向下兼容性,在进行算术运算中,True/False会被当作int值来执行。
>>> True + True
2
>>> True - True
0
>>> True * True
1
>>> (True + True) > 1
True
>>> True + 5
6
>>> 1 / False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
if x == True还是 if x
在PEP285中,还提到了这两种写法的比较。PEP285中认为,==
具有传递性,a==b, b==c会被化简为a==c。
也就是说,如果选择前一种写法的话,6和7在if语句中都应该被认为是真值,那么就会造成6==True==7,被化简为6==7的问题,因此后一种写法才是正确的。
if x == True
会比if x
多出检查True值和进行比较的操作。
也就是说,不论从遵循PEP的规范,还是执行效率,或者程序的简洁性来说,我们都应该使用if x
而不是if x == True
来进行比较。