DR
我们首先总结两个逻辑运算符的两种行为
and
和
or
. 这些习语将构成我们下面讨论的基础。
和
返回第一个错误值(如果有),否则返回最后一个
表达式中的值。
或
返回第一个truthy值(如果有),否则返回最后一个
表达式中的值。
这些行为也总结在
the docs
,尤其是在这个表中:
返回布尔值的唯一运算符是
not
操作员。
“真实”和“真实”评价
声明
len(args) and max(args) - min(args)
是一个
非常
小精灵
简洁(而且不太可读)的表达方式
args
不为空,返回结果
max(args) - min(args)
“,否则返回
0
. 一般来说,它是
if-else
表达式。例如,
exp1 and exp2
应该(大致)翻译成:
r1 = exp1
if not r1:
r1 = exp2
或者,同等地,
r1 = exp1 if exp1 else exp2
在哪里?
exp1
和
exp2
是任意的python对象,或返回某个对象的表达式。理解逻辑用法的关键
和
和
或
这里的运算符理解它们不限于对布尔值进行操作或返回布尔值。任何具有真实性值的对象都可以在这里进行测试。这包括
int
,
str
,
list
,
dict
,
tuple
,
set
,
NoneType
,以及用户定义的对象。短路规则仍然适用。
但什么是真实?
它指的是在条件表达式中使用对象时如何计算对象。@帕特里克·豪在书中很好地总结了真理。
this post
.
所有的价值观都被认为是“真理”,除了以下的
“法西斯”:
-
None
-
False
-
零
-
0.0
-
0j
-
Decimal(0)
-
Fraction(0, 1)
-
[]
空的
列表
-
{}
空的
双关语
-
()
空的
元组
-
''
空的
STR
-
b''
空的
bytes
-
set()
空的
设置
-
空的
range
,像
range(0)
-
对象
-
obj.__bool__()
收益率
假
-
obj.__len__()
收益率
零
“truthy”值将满足
if
或
while
声明。我们用“truthy”和“falsy”来区别
bool
价值观
True
和
假
.
怎么
和
作品
我们以op的问题为基础,讨论了在这些情况下这些运算符是如何实现的。
给出一个函数的定义
def foo(*args):
...
如何返回最小值和最大值之间的差异
在一个包含零个或多个参数的列表中?
找到最小值和最大值很容易(使用内置函数!)。这里唯一的障碍是适当地处理参数列表可能为空的角点情况(例如,调用
foo()
)我们可以做到这两个在一条线上感谢
和
操作员:
def foo(*args):
return len(args) and max(args) - min(args)
foo(1, 2, 3, 4, 5)
# 4
foo()
# 0
自从
和
如果第一个表达式是
真
. 注意,如果第一个表达式的计算结果为truthy,则返回值为
总是
结果是
第二个表达式
. 如果第一个表达式的计算结果为false,则返回的结果是第一个表达式的结果。
在上面的函数中,如果
foo
接收一个或多个参数,
len(args)
大于
零
(正数),因此返回的结果是
最大(args)-最小(args)
. 哦,如果没有参数被传递,
伦琴(ARGS)
是
零
那是假的,而且
零
返回。
请注意,编写此函数的另一种方法是:
def foo(*args):
if not len(args):
return 0
return max(args) - min(args)
或者,更简洁地说,
def foo(*args):
return 0 if not args else max(args) - min(args)
当然,这些函数都不执行任何类型检查,所以除非您完全信任所提供的输入,
不
依赖于这些构造的简单性。
怎么
或
作品
我解释的工作
或
以类似的方式,举一个人为的例子。
给出一个函数的定义
def foo(*参数):
…
你将如何完成
福
返回所有数字
9000
?
我们使用
或
来处理这个角落的案子。我们定义
福
AS:
def foo(*args):
return [x for x in args if x > 9000] or 'No number over 9000!'
foo(9004, 1, 2, 500)
# [9004]
foo(1, 2, 3, 4)
# 'No number over 9000!'
福
对列表执行筛选以保留所有数字
九千
. 如果存在任何这样的数字,则列表理解的结果是一个非空列表,这是正确的,因此将返回该列表(此处短路)。如果没有这样的数字,那么列表comp的结果是
[]
这是假的。所以第二个表达式现在被求值(非空字符串)并返回。
使用条件句,我们可以重新编写这个函数,
def foo(*args):
r = [x for x in args if x > 9000]
if not r:
return 'No number over 9000!'
return r
和以前一样,这个结构在错误处理方面更加灵活。