while 1
很多初学者都很喜欢使用while 1
,原因可能是,1只需要输入一个字符,更加“省事”,可以“偷懒”,并且,1看起来更加简洁明了。
实际上,在python中,while 1
与while True
是等价的,都是布尔真值,这意味着,他们最终的结果都是无限循环。然而,从代码风格和可读性的角度来说,使用while 1
是不适合的,正确的做法是使用while True
,因为,其明确表达了意图,即“当条件为真时循环”。
相比之下,while 1
则没有那么明确,并且,如果while 1
可行的话,是不是while 2
,while 520
,while "sagegrass"
都是可行的呢?如果这样做的话,代码将会陷入到混乱之中。因此,建议总是使用while True
。
按位代替逻辑
按位操作符
按位操作符,也即&
,|
,~
,对于其使用,我之前有过详细的介绍,如果不了解的话,可以查看这篇文章,按位操作符的使用
逻辑操作符,也即and
,or
,not
按位操作符确实可以操作布尔值,例如:
bool1 = True
bool2 = Falseprint(bool1 & bool2) # 结果为False
print(bool1 | bool2) # 结果为True
print(~bool1) # 结果为-2
print(~bool2) # 结果为-1
对于~bool1
的结果,可能让人大吃一惊,1按位取反以后,怎么不是0呢?怎么会变成-2呢?
实际上,对于任意整数x,~x
的结果,应该为-(x + 1)
,所以对于1,结果为-(1 + 1)
,所以得到的是-2。
因此,很显然,按位取反不能代替not
使用。
逻辑运算符的短路特性
那么,按位与以及按位或的结果确实看起来和逻辑与与逻辑或的结果是相同的,那么,按位与以及按位或可以代替逻辑运算符使用吗?
实际上,逻辑运算符具有短路特性,也即:
当A and B
时:如果A为False,则立即返回False,不再继续对B求值。
当A or B
时:如果A为True,则立即返回True,不再继续对B求值。
利用这个特性,可以写出一些专门的代码,例如:
# 除以0是不正确的,会触发异常# 如果使用逻辑运算符and,由于在条件False时就停止了,因此不会触发异常
if False and (1 / 0):pass# 如果使用按位运算符&,按位运算符没有短路特性,因此,会触发异常
if False & (1 / 0):pass
因此,按位运算符无法使用逻辑运算符的短路特性。
非布尔值的情况
如果,我们遇到了本身非布尔值,而是后续转为布尔值的情况,例如:
a = 1
b = 2print(a and b) # 结果为True
print(a & b) # 结果为0
可以看到,这里明显使用按位操作符就是不正确的了,他与我们希望得到的结果是完全不同的,除非改为:
a = 1
b = 2print(bool(a) & bool(b))
因此,综合上述情况,按位操作符不应该,也不建议代替逻辑运算符使用。
命题逻辑的运算律
逻辑运算律
在数学中,运算律是一些基本的规则,用于对命题进行逻辑操作。
应用逻辑运算律
python中的逻辑运算符同样也遵循这些运算律,因此,可以应用到程序中。
例如,对于德摩根律,这些两种形式是等价的:
if not a or not b:passif not (a and b):pass
在实际使用中,可能是这样的,例如,对于一个用户登陆的情况:
username = request.get("username") # 尝试取出用户名,可能有,也可能没有
password = request.get("password") # 尝试取出密码,可能有,也可能没有# 按照正常思路,理解为“如果没有用户名或者没有密码”
if not username or not password:pass# 根据德摩根率,可以简写
if not (username and password):pass