我正在努力学习python,并遇到了一些代码,这些代码非常简短,但完全没有意义。
背景是:
def fn(*args):
return len(args) and max(args)-min(args)我知道它在做什么,但是python为什么要这样做--即返回值而不是True/False?
10 and 7-2返回5.类似地,将and更改为或将导致功能更改。所以
10 or 7 - 2还会有10块。
这是合法的/可靠的风格,还是有什么问题吗?
发布于 2017-10-30 03:23:42
引用Python文档
注意,
and和or都没有限制值和类型的--它们返回到False和True,而是返回E 112最后评估的参数E 213。这有时很有用,例如,如果s是一个字符串,如果该字符串为空,则应由默认值替换,则表达式s or 'foo'将生成所需的值。
因此,Python就是这样设计来计算布尔表达式的,上面的文档让我们了解了为什么会这样做。
要得到一个布尔值,只需键入它。
return bool(len(args) and max(args)-min(args))为什么?
短路。
例如:
2 and 3 # Returns 3 because 2 is Truthy so it has to check 3 too
0 and 3 # Returns 0 because 0 is Falsey and there's no need to check 3 at allor也是如此,也就是说,一旦找到它,它就会返回Truthy的表达式,因为评估表达式的其余部分是多余的。
Python没有返回硬核True或False,而是返回Truthy或Falsey,它们无论如何都要评估为True或False。您可以按原样使用该表达式,它仍将工作。
要知道Truthy和Falsey是什么,请查看帕特里克·霍的回答
发布于 2017-10-30 03:33:45
和、或执行布尔逻辑,但它们在比较时返回一个实际值。当使用和时,从左到右在布尔上下文中计算值。0、'‘、[]、()、{}、和None在布尔上下文中都是假的;其他一切都是真的。
如果布尔上下文中的所有值都为真,则和将返回最后一个值。
>>> 2 and 5
5
>>> 2 and 5 and 10
10如果任何值在布尔上下文中为false,则和返回第一个false值。
>>> '' and 5
''
>>> 2 and 0 and 5
0所以密码
return len(args) and max(args)-min(args)当有max(args)-min(args) args时,返回的值,否则返回len(args),即0。
发布于 2017-10-30 03:26:57
这是合法的/可靠的风格,还是有什么问题吗?
这是合法的,它是返回最后一个值的短路评价。
你提供了一个很好的例子。如果没有传递参数,该函数将返回0,并且代码不必检查没有传递参数的特殊情况。
使用此方法的另一种方法是将任何参数默认为可变原语,如空列表:
def fn(alist=None):
alist = alist or []
....如果将一些不真实的值传递给alist,则默认为空列表,这是避免if语句和可变的默认参数陷阱的简便方法。
https://stackoverflow.com/questions/47007680
复制相似问题