请教关于filter结合lambda以及三元运算符的使用问题
比如说有个题目,要求用filter结合lambda,求1-10之间(不含10)的能被2整除的数答案如下:
>>> list(filter(lambda x : x if x % 2 == 0 else None,range(1,10)))
在lambda中,用了三元运算符,变得复杂了。如果x被2除余数为0,则返回x值,如果余数不为0,则返回None.
也就是说,x为2,4,6,8时,返回2,4,6,8,而x为1,3,5,7,9时返回None
可对于filter来说,第一个参数为None的时候,会把第二个参数中所有为True的值筛选出来,也就是应该把1,3,5,7,9也显示出来
但最终结果只有2,4,6,8,并没有显示1,3,5,7,9
请教是哪一步理解错误呢?先谢谢啦! 本帖最后由 柿子饼同学 于 2021-5-9 13:21 编辑
{:10_277:}
个人理解,None就是不返回东西,然后跳过继续下一个
有错误请指正{:10_265:} 噗,第一个参数是那个函数对象,不是它的返回值啊.. qiuyouzhi 发表于 2021-5-9 13:23
噗,第一个参数是那个函数对象,不是它的返回值啊..
那它是怎么运行的 可对于filter来说,第一个参数为None的时候,会把第二个参数中所有为True的值筛选出来,也就是应该把1,3,5,7,9也显示出来filter第一个参数不是None,是lambda x : x if x % 2 == 0 else None
第一个参数是None时,filter会筛选出第二个参数中可以看做True的元素
第一个参数不是None时,filter会将第二个参数中的每个元素逐个代入第一个参数运算取其结果,结果为True则将该元素选出 柿子饼同学 发表于 2021-5-9 13:25
那它是怎么运行的
遍历第二个参数(一个可迭代对象),
然后对它的每个元素调用传入的func(为None则不调用),
然后判断True/False。
自己写了个较为简陋的filter,你可以看看
def filter(func, seq):
for each in seq:
tmp = func(each) if func else each
if tmp: yield tmp hrp 发表于 2021-5-9 13:27
filter第一个参数不是None,是lambda x : x if x % 2 == 0 else None
第一个参数是None时,filter会筛选出 ...
就是说如果参数不是None时,要看第一个参数的运行结果。只有结果是True,才会将该元素取出。比如说把第一个参数函数里的 else None 改为 else False 或者else 0,反正不让它返回 True
>>> list(filter(lambda x : x if x % 2 == 0 else False,range(1,10)))
>>> list(filter(lambda x : x if x % 2 == 0 else 0,range(1,10)))
O2H2O 发表于 2021-5-9 13:37
就是说如果参数不是None时,要看第一个参数的运行结果。只有结果是True,才会将该元素取出。比如说把第一 ...
是的。
但None其实就为False,所以不用改。 大概明白了,谢谢! O2H2O 发表于 2021-5-9 13:37
就是说如果参数不是None时,要看第一个参数的运行结果。只有结果是True,才会将该元素取出。比如说把第一 ...
对,把else None去掉也一样,甚至没必要用三元运算符,只返回真或假就行了,filter并不关心第一个参数返回的具体值是什么,只管真假。
a=list(filter(lambda x :not x % 2,range(1,10)))
print(a)
页:
[1]