Scr*_*ffy 8 python pep8 logical-operators
以下是使用符合Pythonic/pep8的逻辑表达式吗?
这个:
x = a or b
Run Code Online (Sandbox Code Playgroud)
代替:
if not a:
x = b
else:
x = a
Run Code Online (Sandbox Code Playgroud)这个:
x = a and b
Run Code Online (Sandbox Code Playgroud)
代替:
if not a:
x = a
else:
x = b
Run Code Online (Sandbox Code Playgroud)(曲线球?)这个:
x = x or y
Run Code Online (Sandbox Code Playgroud)
代替:
if not x:
x = y
Run Code Online (Sandbox Code Playgroud)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.
与 C 和 Java 不同,Python 的逻辑运算符不返回布尔值。除了你问题中的那个之外,我无法想象该语言功能的另一个用例,所以除非语言设计者不假思索地添加功能,否则它是Pythonic的(#3除外)。
在很多情况下,短路逻辑“或”都可以派上用场。这是Requests源代码中的一个简单代码:
cookies = request.cookies or {}
Run Code Online (Sandbox Code Playgroud)
这段代码的结果应该是什么是显而易见的,因为它读起来就像一个句子。这并不是说详细版本不可读:
cookies = request.cookies if request.cookies else {}
Run Code Online (Sandbox Code Playgroud)
和:
cookies = {}
if request.cookies:
cookies = request.cookies
Run Code Online (Sandbox Code Playgroud)
但它们是多余的。Python 对字典使用相同的语法来防止相同类型的冗余:
d.get('key', 'fallback')
Run Code Online (Sandbox Code Playgroud)