Pythonic / pep8符合逻辑表达式的以下用途吗?
此:
x = a or b
而不是:
if not a:
x = b
else:
x = a
此:
x = a and b
而不是:
if not a:
x = a
else:
x = b
(曲线球?)这个:
x = x or y
而不是:
if not x:
x = y
答案 0 :(得分:5)
PEP 8与您使用逻辑运算符的方式无关。
假设使用逻辑运算符而不是条件运算的动机是简洁的,那么使用三元运算符可以更好地完成:
x = a if a else b
代替x = a or b
x = b if a else a
代替x = a and b
x = x if x else y
或仅if not x: x = y
代替x = x or y
但是没有人禁止你使用其他版本。这一切都是个人观点。引入三元运算符背后的动机是避免使用and
和or
运算符实现相同效果的容易出错的尝试(请参阅PEP 308)。它们还可以在列表推导中实现花哨的东西,以及更多的东西。
它们不是用于替换复杂的if语句,而是用作 pythonic 三元运算符:x if condition else y
。
答案 1 :(得分:1)
我不认为pep8涵盖了这一点,但对我而言,在您的示例中,if
语句看起来更具可读性(特别是对于Python新手(由于“可读性计数”因此更多Pythonic)逻辑运算符,它仍然看起来比三元运算符更像Pythonic。
然而,三元运算符肯定比condition and true_value or false_value
,(false_value, true_value)[condition]
等更好,因为它更易读,更不容易破解。
答案 2 :(得分:1)
与C和Java不同,Python的逻辑运算符不返回布尔值。除了你的问题之外,我无法想象该语言特性的另一个用例,所以除非语言设计者不加思索地添加功能,否则它是Pythonic(#3除外)。
在许多情况下,短路逻辑OR可以用于您的优势。这是Requests源代码中的一个简单:
cookies = request.cookies or {}
这个代码的结果应该是显而易见的,因为它读起来像一个句子。现在,这并不是说冗长的版本是不可读的:
cookies = request.cookies if request.cookies else {}
和
cookies = {}
if request.cookies:
cookies = request.cookies
但他们是多余的。 Python对字典使用相同的语法来防止相同类型的冗余:
d.get('key', 'fallback')