如何解决为什么在使用空迭代器调用时`max` 和`min` 不返回适当的无穷大?
我正在写一篇关于 reduce
是什么、它是如何工作的以及它隐藏在背后的功能的 blog article,并且在某个时候我谈到了 sum
、{{1 }}、all
、any
和 max
,所有减少。
然后,我谈谈 min
如何接受第三个参数,即初始值,它应该是您正在使用的函数的标识元素。
然后,我继续展示一些特殊的归约,其中包含了身份元素:
reduce
那么,为什么 >>> sum([])
0
>>> import math
>>> math.prod([])
1
>>> all([])
True
和 max
在使用空迭代器调用时会抛出错误,
当他们的操作有标识元素时?
min
我们可以做>>> max([])
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
ValueError: max() arg is an empty sequence
,那么为什么这不是float("-inf")
返回的值呢?同样,为什么 max([])
不返回 min([])
?
解决方法
因为 min()
和 max()
接受任何类型,并且它们可能无法与浮点数进行比较。例如,字符串:
>>> 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'
如果你想要你正在谈论的行为,你可以使用default参数:
>>> min([],default=float('-inf'))
-inf
也就是说,min()
和 max()
的应用比你提到的其他函数更广泛。 sum()
和 math.prod()
主要用于数字,因此为它们提供数字起始值是有意义的。不过,您可以使用它们的 start
参数更改它。下面是一些带有列表的示例,尽管它们不是很惯用。
>>> math.prod([2,3],start=['a']) # better: ['a'] * math.prod([2,3])
['a','a']
>>> sum([['a'],['b']],start=[]) # better: list(itertools.chain(['a'],['b']))
['a','b']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。