Python 为什么不';t`max`和`min`在使用空iterables调用时是否返回适当的无穷大?
我写了一篇关于什么是Python 为什么不';t`max`和`min`在使用空iterables调用时是否返回适当的无穷大?,python,python-3.x,math,reduce,Python,Python 3.x,Math,Reduce,我写了一篇关于什么是reduce的文章,它是如何工作的,以及它背后隐藏的函数,在某一点上我谈到了sum,all,any,max,和min,所有的缩减 然后,我将讨论reduce如何接受第三个参数,即初始值,它应该是您正在使用的函数的标识元素。 然后,我继续展示一些特殊的简化,其中包含身份元素: 总和([]) 0 >>>输入数学 >>>math.prod([]) 1. >>>全部([]) 真的 那么,为什么max和min在使用空iterables调用时会抛出错误, 当它们的操作具有标识元素时 >
reduce
的文章,它是如何工作的,以及它背后隐藏的函数,在某一点上我谈到了sum
,all
,any
,max
,和min
,所有的缩减
然后,我将讨论reduce
如何接受第三个参数,即初始值,它应该是您正在使用的函数的标识元素。
然后,我继续展示一些特殊的简化,其中包含身份元素:
总和([])
0
>>>输入数学
>>>math.prod([])
1.
>>>全部([])
真的
那么,为什么max
和min
在使用空iterables调用时会抛出错误,
当它们的操作具有标识元素时
>>最大值([])
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:max()arg是一个空序列
我们可以执行float(“-inf”)
,那么为什么这不是max([])
返回的值呢?类似地,为什么min([])
不返回float(“inf”)
?因为min()
和max()
接受任何类型,它们可能无法与float进行比较。例如,字符串:
>>> min('a', 'b')
'a'
>>> min(float('-inf'), 'a', 'b')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'str' and 'float'
也就是说,
min()
和max()
比您提到的其他函数有更广泛的应用sum()
和math.prod()
主要用于数字,因此为它们提供数字起始值是有意义的。尽管如此,您可以使用它们的start
参数来更改它。下面是一些带有列表的示例,尽管它们不是很习惯用法
>>> math.prod([2, 3], start=['a']) # better: ['a'] * math.prod([2, 3])
['a', 'a', 'a', 'a', 'a', 'a']
>>> sum([['a'], ['b']], start=[]) # better: list(itertools.chain(['a'], ['b']))
['a', 'b']
因为一个空的iterable没有任何项,它的max怎么可能有任何值呢?身份不仅仅是有效的东西,它需要有意义!.
prod
应该计算数字的乘积,但列表可以包含任何内容,max
可以应用于任何项目列表,只要它们可以进行比较。如果字符串列表恰好为空,为什么无限浮点是一个合理的最大值?@DYZ为prod
返回1是基于数学约定的。。。想想n^0
的n≠ 0
。返回None
将意味着无法返回有意义的最大值,而这正是应该引发异常的情况。有一种通用的方法来管理异常,同时创建一个特殊情况,其中max
将返回None
,这将防止代码立即失败并允许无效值传播,并强制代码的其余部分在每次使用时测试返回值。
>>> math.prod([2, 3], start=['a']) # better: ['a'] * math.prod([2, 3])
['a', 'a', 'a', 'a', 'a', 'a']
>>> sum([['a'], ['b']], start=[]) # better: list(itertools.chain(['a'], ['b']))
['a', 'b']