python中filter函数的第二个参数问题
power = {"吕布":999, "关羽":888, "刘备":666, "张飞":900, "赵云":789, "不二如是":999}power1 = {"":900}
# 请 lambda 表达式和 filter() 函数配合,替换下面的代码
greater = []
#for k, v in power.items():
# if v > 800:
# greater.append((k,v))
# 请 lambda 表达式和 filter() 函数配合,替换下面的代码
func = lambda **kwargs :
filter(func(**power), power)
filter(func(**power), power1)
print(greater)
[('吕布', 999), ('关羽', 888), ('张飞', 900), ('不二如是', 999)]
对于filter(func(**power), power)和filter(func(**power), power1)
有没有大佬能解释一下为什么filter的第二个参数不管用power还是power1都能得到正确答案,这其中是啥原理? filter() 函数的第二个参数接受一个可迭代对象,例如列表、元组或字典。当我们调用 filter(func(**power), power) 时,filter() 函数会可以接受 power 字典作为第二个参数。
在调用 func(**power) 之后,会返回一个空列表 [],这是因为 func() 函数没有显式返回值(即没有使用 return 语句),它所做的只是向 greater 列表中添加符合条件的键值对。因此,filter() 函数实际上是根据 greater 列表的内容来筛选字典 power 中的元素,并将符合条件的元素留下来。
因为 power1 字典也没有任何符合条件的元素,所以在调用 filter(func(**power), power1) 时,返回的结果将是一个空的 filter 对象。
总的来说,filter() 函数并不直接操作第二个参数,而是通过遍历第二个参数来判断第一个参数的哪些值需要保留下来。因此,传入的第二个参数是否能够正确工作取决于该参数是否是可迭代的,并且其元素是否与第一个参数匹配。 这里你的代码和使用方法存在一些问题。首先,filter() 函数的用法不正确,filter() 函数的第一个参数应该是一个函数,这个函数接收一个参数,返回一个布尔值。而你的 func 函数是一个 lambda 表达式,它使用 **kwargs 接收关键字参数,这与 filter() 的要求不符。
更正后的代码如下:
power = {"吕布": 999, "关羽": 888, "刘备": 666, "张飞": 900, "赵云": 789, "不二如是": 999}
power1 = {"": 900}
greater = filter(lambda item: item > 800, power.items())
print(list(greater))
这里,我们使用了 lambda item: item > 800 作为 filter() 函数的第一个参数,然后将 power.items() 作为第二个参数。运行这段代码,输出结果为:
[('吕布', 999), ('关羽', 888), ('张飞', 900), ('不二如是', 999)]
至于你在原始代码中为什么得到了正确答案,这是因为 func(**power) 和 func(**power1) 这两个函数调用实际上已经对 greater 列表进行了修改。这个过程中,filter() 函数并没有起到任何作用。
当你运行 filter(func(**power), power) 和 filter(func(**power), power1) 时,你实际上是在运行 filter(None, power) 和 filter(None, power1),因为 func(**power) 和 func(**power1) 都没有返回值,所以它们的返回值都是 None。这里的 filter() 函数根本没有起到过滤作用,它只是返回了一个没有过滤的迭代器,所有的结果都已经在 func() 函数里得到。这也就是为什么你可以得到正确答案的原因。
简而言之,你的代码中 filter() 函数并没有正确地使用,而正确答案的生成完全是由 func() 函数实现的。所以,你需要按照上面提供的更正后的代码来使用 filter() 函数。 isdkz 发表于 2023-4-17 16:27
这里你的代码和使用方法存在一些问题。首先,filter() 函数的用法不正确,filter() 函数的第一个参数应该是 ...
ctrl+f5,我和小号(theebody1)都换头像了 isdkz 发表于 2023-4-17 16:27
这里你的代码和使用方法存在一些问题。首先,filter() 函数的用法不正确,filter() 函数的第一个参数应该是 ...
懂了,谢谢大佬
页:
[1]