鱼C论坛

 找回密码
 立即注册
查看: 2414|回复: 5

[已解决]为什么是这样的,求解

[复制链接]
发表于 2022-8-31 16:18:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
list(map(max,[1,3,5],[2,2,2],[0,3,9,8])
我知道只会比较前三位,但是为什么max是从[1,2,0],[3,2,3],[5,2,9]中选的??
最佳答案
2022-8-31 17:37:12
本帖最后由 Brick_Porter 于 2022-8-31 17:39 编辑

因为这是map函数和max函数共同作用的结果。不太清楚你对Python了解到什么程度了,所以我尽量用通俗的语言来解释。

先来看真正用来比较大小的max函数,它有两种用法:
1. max(iterable, *[, default=obj, key=func]) -> value
这里的iterable就类似我们平时使用的列表、元组等数据,如果只传入一个列表或者元组,就返回其中的最大值。如果还设置了default,那么当iterable为空的时候就返回default的值。例如:
>>> max([1, 2, 3])  # 只传入一个列表
3
>>> max((233, 120, 99))  # 只传入一个元组
233
>>> max([], default=666)  # 传入一个空列表,并且设置默认返回的值
666
最后一个参数key的值是一个函数,用来自定义筛选标准,不是我们今天讨论的重点,不做过多展开。

2. max(arg1, arg2, *args, *[, key=func]) -> value
第二种用法是一次传入多个参数(两个及以上),此时max会找出这些参数中的最大值,例如:
>>> max(1, 2)  # 传入两个参数
2
>>> max(1, 5, 3)  # 传入三个参数
5
>>> max([1, 2], [4, 5, 6], [9, 1])  # 注意这种情况,传入的参数是3个列表
[9, 1]
特别注意最后一种情况,当传入的参数是多个iterable的时候max会把它们对齐然后依次i比较,也就是类似这样:
[1, 2]
[4, 5, 6]
[9, 1]
然后从索引为0处开始比较这三个列表,索引为0处的三个值分别是1、4、9,其中9最大,所以此时max直接返回[9, 1],这里请注意max([1, 2], [4, 5, 6], [9, 1])其实是通过列表中的具体数字来比较三个列表的大小,因为传入的参数是列表所以返回的最大值也是列表类型。

list(map(max, [1, 3, 5], [2, 2, 2], [0, 3, 9, 8]))的返回值是[2, 3, 9],这个结果很有迷惑性,我们很难第一时间判断到底是哪种用法。
其实此处是max的第一种用法,因为如果是按照第二种方法,虽然max会对齐三个列表然后比较大小,但因为传入的都是列表类型,所以结果也应该是列表,第一轮比较(1, 2, 0)之后结果很明朗,2最大,所以应该返回列表[2, 2, 2],但结果却是[2, 3, 9],所以显然不是第二种用法。
但是第一种max用法并不会对齐三个列表,似乎进入死胡同了。但我开头说了,这里还有一个重要的“函数”map,其实负责对齐[1, 3, 5]、[2, 2, 2]、[0, 3, 9, 8]这三个列表的是它!

map(func, *iterables),我们重点来看看map的第二个参数。
当第二个参数是一个列表或者元组的时候map会把这个列表或元组的所有元素都给第一个func函数处理;
但是当第二个参数是多个类似列表的数据时,map会先把它们对齐,然后把对齐的元素传给第一个参数func函数。
而我们的代码[1, 3, 5], [2, 2, 2], [0, 3, 9, 8]显然符合第二种情况,于是乎它们被对齐为(1, 2, 0), (3, 2, 3), (5, 2, 9),然后这三个元组分别传给max函数,于是max分别返回2、3、9,最后由list转为列表,所以结果就变成了[2, 3, 9]。

综上所述,max和map都会对传入的多个iterable对齐,但map先对输入的参数做了对齐处理,然后才把对齐的结果传给max函数,因此结果才会是[2, 3, 9]。
最后,关于对齐我建议你学习zip函数,它具有对齐多个iterable的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-31 16:30:50 From FishC Mobile | 显示全部楼层
map就是这样的用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-31 17:29:51 | 显示全部楼层
https://docs.python.org/zh-cn/3/library/functions.html#map
map(function, iterable, ...)
返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。 当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-31 17:37:11 | 显示全部楼层
wp231957 发表于 2022-8-31 16:30
map就是这样的用法

谢谢啦,没有读懂map的中文注解,刚刚弄懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-31 17:37:12 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Brick_Porter 于 2022-8-31 17:39 编辑

因为这是map函数和max函数共同作用的结果。不太清楚你对Python了解到什么程度了,所以我尽量用通俗的语言来解释。

先来看真正用来比较大小的max函数,它有两种用法:
1. max(iterable, *[, default=obj, key=func]) -> value
这里的iterable就类似我们平时使用的列表、元组等数据,如果只传入一个列表或者元组,就返回其中的最大值。如果还设置了default,那么当iterable为空的时候就返回default的值。例如:
>>> max([1, 2, 3])  # 只传入一个列表
3
>>> max((233, 120, 99))  # 只传入一个元组
233
>>> max([], default=666)  # 传入一个空列表,并且设置默认返回的值
666
最后一个参数key的值是一个函数,用来自定义筛选标准,不是我们今天讨论的重点,不做过多展开。

2. max(arg1, arg2, *args, *[, key=func]) -> value
第二种用法是一次传入多个参数(两个及以上),此时max会找出这些参数中的最大值,例如:
>>> max(1, 2)  # 传入两个参数
2
>>> max(1, 5, 3)  # 传入三个参数
5
>>> max([1, 2], [4, 5, 6], [9, 1])  # 注意这种情况,传入的参数是3个列表
[9, 1]
特别注意最后一种情况,当传入的参数是多个iterable的时候max会把它们对齐然后依次i比较,也就是类似这样:
[1, 2]
[4, 5, 6]
[9, 1]
然后从索引为0处开始比较这三个列表,索引为0处的三个值分别是1、4、9,其中9最大,所以此时max直接返回[9, 1],这里请注意max([1, 2], [4, 5, 6], [9, 1])其实是通过列表中的具体数字来比较三个列表的大小,因为传入的参数是列表所以返回的最大值也是列表类型。

list(map(max, [1, 3, 5], [2, 2, 2], [0, 3, 9, 8]))的返回值是[2, 3, 9],这个结果很有迷惑性,我们很难第一时间判断到底是哪种用法。
其实此处是max的第一种用法,因为如果是按照第二种方法,虽然max会对齐三个列表然后比较大小,但因为传入的都是列表类型,所以结果也应该是列表,第一轮比较(1, 2, 0)之后结果很明朗,2最大,所以应该返回列表[2, 2, 2],但结果却是[2, 3, 9],所以显然不是第二种用法。
但是第一种max用法并不会对齐三个列表,似乎进入死胡同了。但我开头说了,这里还有一个重要的“函数”map,其实负责对齐[1, 3, 5]、[2, 2, 2]、[0, 3, 9, 8]这三个列表的是它!

map(func, *iterables),我们重点来看看map的第二个参数。
当第二个参数是一个列表或者元组的时候map会把这个列表或元组的所有元素都给第一个func函数处理;
但是当第二个参数是多个类似列表的数据时,map会先把它们对齐,然后把对齐的元素传给第一个参数func函数。
而我们的代码[1, 3, 5], [2, 2, 2], [0, 3, 9, 8]显然符合第二种情况,于是乎它们被对齐为(1, 2, 0), (3, 2, 3), (5, 2, 9),然后这三个元组分别传给max函数,于是max分别返回2、3、9,最后由list转为列表,所以结果就变成了[2, 3, 9]。

综上所述,max和map都会对传入的多个iterable对齐,但map先对输入的参数做了对齐处理,然后才把对齐的结果传给max函数,因此结果才会是[2, 3, 9]。
最后,关于对齐我建议你学习zip函数,它具有对齐多个iterable的功能。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-31 17:39:11 | 显示全部楼层
Brick_Porter 发表于 2022-8-31 17:37
因为这是map函数和max函数共同作用的结果。不太清楚你对Python了解到什么程度了,所以我尽量用通俗的语言来 ...

谢谢大佬,你讲的有些许复杂,我刚才已经浅显的弄懂了map函数的使用啦,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 16:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表