李二蛋 发表于 2022-3-18 21:54:09

map()函数和filter()区别和用法

0.
list(map(sum,))
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
    list(map(sum,))
TypeError: 'int' object is not iterable
请问为什么会报错,不是可迭代对象么?
list(map(sum,,))
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
    list(map(sum,,))
TypeError: 'int' object is not iterable
可以用map求),sum()]吗?
1.
list(filter(pow,,))
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
    list(filter(pow,,))
TypeError: filter expected 2 arguments, got 3
filter()和map()的区别是在于filter是把结果中的False过滤掉,
filter返回结果为真的元素,map返回运算结果
为什么报错原因是要求期望两个参数但是返回三个?
list(filter(max,,))
Traceback (most recent call last):
File "<pyshell#29>", line 1, in <module>
    list(filter(max,,))
TypeError: filter expected 2 arguments, got 3

小甲鱼说这两个函数特别重要,请求各位前辈指引,晚辈感激不尽{:7_123:}

hrpzcf 发表于 2022-3-18 22:04:38

>>> list(map(sum,(,)))

>>>

李二蛋 发表于 2022-3-18 22:44:44

hrpzcf 发表于 2022-3-18 22:04


请问为什么要加括号

hrpzcf 发表于 2022-3-18 22:53:24

李二蛋 发表于 2022-3-18 22:44
请问为什么要加括号

map(a, b),a是函数,b是可迭代对象
map会将可迭代对象“b”的每一项作为参数放入函数“a”执行
这里你的函数“a”是sum,,而sum又是要求参数是可迭代对象,所以相当于要求b中的每一项都是可迭代对象
所以b写成(, )或者[ , ]等等都可以,map会将和分别放入sum计算,即sum()...

李二蛋 发表于 2022-3-19 09:43:18

hrpzcf 发表于 2022-3-18 22:53
map(a, b),a是函数,b是可迭代对象
map会将可迭代对象“b”的每一项作为参数放入函数“a”执行
这里 ...

0.
b是一个列表,将b的每一项作为参数放入函数a中
那么相对于函数是pow,max此类需要可迭代对象是多列表的情况
b是多个列表,取多个列表的每一项拼接成参数放入函数a中
可以这样理解嘛
1.
>>> list(filter(max, , , ))
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
    list(filter(max, , , ))
TypeError: filter expected 2 arguments, got 4
>>> list(filter(pow, , ))
Traceback (most recent call last):
File "<pyshell#56>", line 1, in <module>
    list(filter(pow, , ))
TypeError: filter expected 2 arguments, got 3

请问前辈filter()是不是无法进行都多列表的运算?

傻眼貓咪 发表于 2022-3-19 10:01:00

map()
有若干个元素,经过一个函数/方法,变成另外一个元素:
a, b, c -------> 函数 ---------> x, y, z

filter()
有若干个元素,经过一个函数/方法,只挑选出符合条件的元素:

a, b, c -------> 函数 --------> a, c

hrpzcf 发表于 2022-3-19 10:48:41

本帖最后由 hrpzcf 于 2022-3-19 11:01 编辑

李二蛋 发表于 2022-3-19 09:43
0.
b是一个列表,将b的每一项作为参数放入函数a中
那么相对于函数是pow,max此类需要可迭代对象是多列 ...

map和filter功能、如何传参你都没理解

功能:
1)map(func, ) --> 返回 (它返回的不是列表,而是生成器,要用list函数把生成器转换为列表或者对生成器for循环等,我这里写返回列表是方便理解)

2)filter(func, ) --> func(a), func(b), func(c), func(d)... --> 只取中经func调用后为True的,比如 func(b), func(c) 结果都是True,那么filter返回结果就是 (它返回的不是列表,而是迭代器,要用list函数把生成器转换为列表或者对生成器for循环等,我这里写返回列表是方便理解)

待续....


传参:
你的代码:list(filter(max, , , ))
你是想max(), max(), max()?
首先你传了max, , , 4个参数给filter,这就是错的,filter只接受2个参数
给, , 套上一层括号不就变一个参数了吗?max, [, , ] 不就变两个参数了吗?[, , ]共3项,把每一项传给max不就分别是max(), max(), max()了吗?
filter会把[, , ] 中经过max(), max(), max()后结果是True的项选出来,max(), max(), max()结果分别是5, 2, 9,都非0,都可判定是True,所以filter选出来的项分别就是, , ,结果就是[, , ]
(我不理解你想达到什么目的)

李二蛋 发表于 2022-3-19 11:12:11

hrpzcf 发表于 2022-3-19 10:48
map和filter功能、如何传参你都没理解

功能:


特别感谢您,我一下子就明白了,我没有好好看速查宝典,不知道filter只接受两个参数,那么filter和pow永远无法兼容,因为pow至少要三个参数才可以,抱歉我有些钻牛角尖,刚开始学想什么东西都搞懂,细枝末节抓着不放,感谢前辈不厌其烦的帮助{:7_119:}

李二蛋 发表于 2022-3-19 11:12:59

傻眼貓咪 发表于 2022-3-19 10:01
map()
有若干个元素,经过一个函数/方法,变成另外一个元素:
a, b, c -------> 函数 ---------> x, y, z ...

明白啦明白啦,感谢前辈指点,祝您万事顺意

hrpzcf 发表于 2022-3-19 11:17:29

李二蛋 发表于 2022-3-19 11:12
特别感谢您,我一下子就明白了,我没有好好看速查宝典,不知道filter只接受两个参数,那么filter和pow永 ...

内置的pow最少只需要2个参数,第三个是可选的
但是直接filter(pow, [...])的话filter会把[...]中的每一项传给pow,pow也只能接受到一个参数,这是不行的,想要实现也很简单,对pow进行一层包装就可以了

待续...

hrpzcf 发表于 2022-3-19 11:20:33

李二蛋 发表于 2022-3-19 11:12
特别感谢您,我一下子就明白了,我没有好好看速查宝典,不知道filter只接受两个参数,那么filter和pow永 ...

def my_pow(x):
    return pow(*x)

print(list(filter(my_pow, [, , ]))) # 没意义
print(list(map(my_pow, [, , ])))

# 结果:
# [, , ]
#

李二蛋 发表于 2022-3-19 19:58:08

hrpzcf 发表于 2022-3-19 11:20


return pow(*x)
前辈这段代码是什么意思吖

hrpzcf 发表于 2022-3-19 20:13:44

李二蛋 发表于 2022-3-19 19:58
return pow(*x)
前辈这段代码是什么意思吖

调用函数时,参数前面加星号是解包的意思,要求参数是元组或者列表之类的才能解包。定义函数时形参前面的星号是打包参数的意思。
比如x是,直接pow(x)【即pow()】肯定是不行的,pow不接受列表参数,需要把列表解包,pow(*x)【即pow(3, 2)】

李二蛋 发表于 2022-3-20 14:44:33

hrpzcf 发表于 2022-3-19 20:13
调用函数时,参数前面加星号是解包的意思,要求参数是元组或者列表之类的才能解包。定义函数时形参前面的 ...

明白了明白啦,喜喜,感谢前辈咯

李二蛋 发表于 2022-3-20 14:51:59

hrpzcf 发表于 2022-3-19 20:13
调用函数时,参数前面加星号是解包的意思,要求参数是元组或者列表之类的才能解包。定义函数时形参前面的 ...

>>> list(map(lambda x:pow(*x), [, , ]))

前辈您看我这样写行么

hrpzcf 发表于 2022-3-20 16:04:15

李二蛋 发表于 2022-3-20 14:51
>>> list(map(lambda x:pow(*x), [, , ]))

前辈您看我这样写行么

可以,匿名函数写法,函数简短的时候这么写更方便

李二蛋 发表于 2022-3-21 15:03:52

hrpzcf 发表于 2022-3-20 16:04
可以,匿名函数写法,函数简短的时候这么写更方便

{:7_112:}
页: [1]
查看完整版本: map()函数和filter()区别和用法