我有这两个陈述
return self.getData() if self.getData() else ''
和
return self.getData() or ''
我想知道它们是相同的还是有任何区别
答案 0 :(得分:32)
我会说不,因为如果self.getData()
在操作期间发生了某些变化,那么第一个语句就有可能返回不同的结果,因为它会进行第二次调用。
答案 1 :(得分:22)
可能,但仅当self.getData()
是纯函数且没有副作用时。更重要的是,self.getData()
返回的对象也必须没有任何副作用,并且始终返回一个布尔值。
在最简单的情况下,f()
定义为:
def f():
return ["Hello World!"]
然后是以下内容:
x = f() if f() else ""
在逻辑上等同于:
x = f() or ""
由于f()
在两种情况下都被视为布尔表达式,f()
将评估为True
(ish)或False
(ly)值,两个表达式都将返回同样的结果。
在逻辑中,语句p和q在逻辑上是等价的,如果他们有 相同的逻辑内容。这是一个语义概念;两个陈述是 等价,如果他们在每个模型中具有相同的真值(门德尔森 1979:56)。 p和q的逻辑等价有时表示为 p \ equiv q,Epq或p \ Leftrightarrow q。但是,这些符号是 也用于物质对等;正确的解释取决于 在上下文中。逻辑等价与材料不同 等价,虽然这两个概念密切相关。
答案 2 :(得分:8)
它们将具有相同的结果,因为两者都将self.getData()
的结果视为布尔上下文,但要注意:
1)
return self.getData() if self.getData() else ''
将运行函数getData
两次,而
2)
return self.getData() or ''
只运行一次。如果getData()
需要一段时间才能执行,这可能很重要,这意味着1)如果函数getData()
有任何副作用,则不与2)相同。 / p>
坚持2)。
答案 3 :(得分:7)
我看到的唯一区别是第一个将调用self.getData()
两次,第一个用于评估布尔值,第二个可以返回(如果第一个被评估为True)。
另一个选项只会对函数进行一次评估,并将其用作布尔检查和返回。
例如,如果self.getData()
在返回数据后删除或修改数据或者函数需要很长时间来计算,那么这一点至关重要。