要开始,编写类似这样的代码:
condition and value1 or value2
在此之前,人们是如何在Python中实现三元条件运算符的:
value1 if condition else value2
由于PEP 0308,条件表达式在2.5版本中被引入。现在使用旧方法已经被弃用,而更高效、更易读的新方法则取而代之。
旧方法之所以有效,是因为在Python中,
and
和
or
的操作方式不同于大多数其他语言,这些运算符返回值而不是布尔结果。
执行a and b
,如果a
求值为False
,则返回a
;否则,返回b
:
>>> 0 and 1
0
>>> 1 and 0
0
>>> 1 and 2
2
>>>
a 或 b
的运算结果为 a
,如果 a
为 True
;否则返回 b
。
>>> 1 or 0
1
>>> 0 or 1
1
>>> 1 or 2
1
>>>
此外,如果您不知道,
0
会被评估为
False
,而其他所有数字都会被评估为
True
。
来看你的代码,这个:
isinstance(g, str) and g.lower() or g
实际上,Python将其解释为:
(isinstance(g, str) and g.lower()) or g
现在,如果
isinstance(g, str)
返回
False
(
g
不是字符串):
(False and g.lower()) or g
and
返回 False
:
False or g
然后
or
返回
g
。因此,我们避免在非字符串类型上调用
.lower()
。
但是,如果
isinstance(g, str)
返回
True
(
g
是一个字符串):
(True and g.lower()) or g
and
返回 g.lower()
:
g.lower() or g
然后
or
返回
g.lower()
,这是可以的,因为
g
是一个字符串。
综上所述,这两个表达式:
g.lower() if isinstance(g,str) else g
isinstance(g, str) and g.lower() or g
这两者在功能上是等价的。但请使用第一个!!另一个对可读性很差。