我有这两个陈述
return self.getData() if self.getData() else ''
Run Code Online (Sandbox Code Playgroud)
和
return self.getData() or ''
Run Code Online (Sandbox Code Playgroud)
我想知道它们是相同还是有任何区别
mik*_*e.k 32
我会说不,因为如果self.getData()在操作期间改变某些东西,那么第一个语句有可能返回不同的结果,因为它将进行第二次调用.
Jam*_*lls 22
也许吧,但前提self.getData()是它只是一个纯粹的功能而且没有任何副作用.更重要的是,self.getData()返回的对象也必须没有任何副作用并始终返回布尔值.
在最简单的情况下,如果f()定义为:
def f():
return ["Hello World!"]
Run Code Online (Sandbox Code Playgroud)
然后是以下内容:
x = f() if f() else ""
Run Code Online (Sandbox Code Playgroud)
在逻辑上等同于:
x = f() or ""
Run Code Online (Sandbox Code Playgroud)
因为f()在两种情况下都被视为布尔表达式,并且f()将评估为True(ish)或False(ly)值,两个表达式将返回相同的结果.
这称为逻辑等价
在逻辑中,如果语句p和q具有相同的逻辑内容,则它们在逻辑上是等效的.这是一个语义概念; 如果两个陈述在每个模型中具有相同的真值,则它们是等价的(Mendelson 1979:56).p和q的逻辑等价有时表示为p\equiv q,Epq或p\Leftrightarrow q.但是,这些符号也用于材料等价; 正确的解释取决于具体情况.逻辑等价与物质等价不同,尽管这两个概念密切相关.
它们将具有相同的结果,因为它们都self.getData()在布尔上下文中处理结果,但要注意:
1)
return self.getData() if self.getData() else ''
将运行该函数getData两次,而
2)
return self.getData() or ''
只运行一次.如果这可能是重要getData()需要一段时间来执行,并且它意味着1)是不一样的2)如果该函数getData()具有任何副作用.
坚持2).
小智 7
我看到的唯一区别是第一个将调用self.getData()两次,第一个用于评估布尔值,第二个可以返回(如果第一个被评估为True).
另一个选项将仅对该函数进行一次评估,将其用作布尔检查和返回.
例如,如果self.getData()在返回数据后删除或修改数据或者函数需要很长时间来计算,这可能是至关重要的.