'';和';逻辑运算符与"&&引用;Python中的按位运算符?

'';和';逻辑运算符与"&&引用;Python中的按位运算符?,python,bitwise-operators,logical-operators,Python,Bitwise Operators,Logical Operators,我有两个Python案例: 1) 案例1: 此案例将给出一个结果:和:False 2) 案例2: 这种情况将产生如下错误: Bitwise : Traceback (most recent call last): File "G:\Dropbox\Workspace_Python\PyGUI\default\__init__.py", line 6, in <module> print "Bitwise :", exists("") & os.path.getsi

我有两个Python案例: 1) 案例1:

此案例将给出一个结果:
和:False

2) 案例2:

这种情况将产生如下错误:

Bitwise :
Traceback (most recent call last):
  File "G:\Dropbox\Workspace_Python\PyGUI\default\__init__.py", line 6, in <module>
    print "Bitwise :", exists("") & os.path.getsize("")
  File "C:\Python27\lib\genericpath.py", line 49, in getsize
    return os.stat(filename).st_size
WindowsError: [Error 3] The system cannot find the path specified: ''
按位:
回溯(最近一次呼叫最后一次):
文件“G:\Dropbox\Workspace\u Python\PyGUI\default\\uuuuu init\uuuuuu.py”,第6行,在
打印“按位:”,存在(“”)和os.path.getsize(“”)
文件“C:\Python27\lib\genericpath.py”,第49行,在getsize中
返回os.stat(文件名).st\u大小
WindowsError:[错误3]系统找不到指定的路径:“”
您能帮我解释一下这两种情况之间的区别吗?

在逻辑
运算符中,如果第一个表达式为false,则不会计算第二个表达式。由于
存在(“”
失败,
os.path.getsize(“”
在第一种情况下永远不会执行

但是在按位
&
运算符的情况下,两个操作数都必须求值才能得到结果。由于您无法统计无效文件(获取大小),因此它会失败并出现错误

引用文件

表达式
x和y
首先计算
x
;如果
x
为false,则返回其值;否则,将计算
y
,并返回结果值

还注意到

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为false:
false
None
、所有类型的数字零以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为true

那么,当你评估

exists("") and os.path.getsize("")
存在(“”
返回
False
,根据上面引用的文本,它将立即返回
False
,而不必在逻辑
运算符中执行
os.path.getsize(“”
),如果第一个表达式为False,它将不会计算第二个表达式。由于
存在(“”
失败,
os.path.getsize(“”
在第一种情况下永远不会执行

但是在按位
&
运算符的情况下,两个操作数都必须求值才能得到结果。由于您无法统计无效文件(获取大小),因此它会失败并出现错误

引用文件

表达式
x和y
首先计算
x
;如果
x
为false,则返回其值;否则,将计算
y
,并返回结果值

还注意到

在布尔运算的上下文中,以及当控制流语句使用表达式时,以下值被解释为false:
false
None
、所有类型的数字零以及空字符串和容器(包括字符串、元组、列表、字典、集合和冻结集)。所有其他值都被解释为true

那么,当你评估

exists("") and os.path.getsize("")
exists(“”
返回
False
,根据上面引用的文本,它将立即返回
False
,而无需执行
os.path.getsize(“”

,与大多数语言一样,如果第一个参数为False,逻辑and将立即中止(因为不管第二个参数是什么,结果都是一样的)

在您的示例中,如果将二进制AND(
)翻转为OR(
),该语言不能短路,因为第一个结果为false,它需要检查第二个结果,以确定它整体上应返回true还是false。

与大多数语言一样,如果第一个参数为false,逻辑and将立即中止(因为无论第二个参数是什么,结果都是相同的)


在您的示例中,如果将二进制AND(
)翻转为OR(
),则该语言不能短路,因为第一个结果为false,它需要检查第二个结果,以确定其整体上是否应返回true或false。

谢谢您给我的正确答案。这里的重点是“短路”@LongUni:是的,主要的一点是Python布尔/逻辑运算符可以短路,但出于设计原因,按位运算符不能短路。有时可以方便地对布尔值使用按位运算,例如
a&=b
,但一般来说,在处理布尔值时使用布尔运算更好,并且只对在实际操作位时使用位运算。谢谢你给我的正确答案。这里的重点是“短路”@LongUni:是的,主要的一点是Python布尔/逻辑运算符可以短路,但出于设计原因,按位运算符不能短路。有时可以方便地对布尔值使用按位运算,例如
a&=b
,但一般来说,在处理布尔值时使用布尔运算更好,并且只对在实际操作位时使用按位运算。
exists("") and os.path.getsize("")