map() + lambda else 子句如何啥都不做

Posted

技术标签:

【中文标题】map() + lambda else 子句如何啥都不做【英文标题】:map() + lambda else clause how to do nothingmap() + lambda else 子句如何什么都不做 【发布时间】:2022-01-08 15:09:43 【问题描述】:
map(lambda k,v: self._value_store.update(k=v) if self.keyword_check(k) == True else print('bad parameter'), kwargs.keys(),kwargs.value)

keyword_check(k) 返回一个布尔值,具体取决于它是否在列表中。 这样做的目的是基本上更新每个参数的字典值和使用 kwargs 传入的值,但前提是参数名称存在于预定义列表中。

我不想使用 for 循环来解决这个问题。

我的问题是else 参数似乎是强制性的,但我不希望它做任何事情,除非关键字验证返回TrueFalse 时转到下一个可迭代对象。我尝试在 else 子句之后添加 pass,但 Python 不喜欢它。它适用于我放置的else print('bad parameter'),但这只是一个临时解决方案。当它是False 时,我可以在这里使用什么来执行/输出任何内容?

【问题讨论】:

好吧,通过使用 map,您将一个函数应用于可迭代的每个项目。你的函数应该总是返回一些东西,对吧?如果是同一个变换,则适当设置 这能回答你的问题吗? List comprehension with if statement 也许首先尝试使用普通功能而不是lambamap(my_function, kwargs) - 当它可以工作时,然后尝试将其转换为lambda。使用普通函数,您可以使用 print() 查看变量中的内容 - 这样您就可以对其进行调试。 【参考方案1】:

请注意,这个表达式实际上什么都不做(它和你的一样,除了一些更正,但为了便于阅读,分散了几行):

map(lambda k,v: self._value_store.update((k,v)) # k=v always sets key 'k'
                    if self.keyword_check(k) == True
                    else print('bad parameter'),
    kwargs.keys(),
    kwargs.values()
)

map 返回一个生成器。只有当您收集生成器的值时,它才会真正执行副作用(self._value_store.update)。因此,要让它真正更新对象的内部值存储,您需要执行类似的操作

list(map(lambda k,v: self._value_store.update((k,v))
                        if self.keyword_check(k) == True
                        else print('bad parameter'),
         kwargs.keys(),
         kwargs.values()
))

(您可以将list 替换为all 以避免创建无用的Nones 列表;all 将在这里起作用,因为.update() 总是返回None,但这可能是更糟糕的编程风格。 )

一般来说,只使用map 来产生副作用通常不是好的风格,除非您确实需要延迟执行副作用(在这种情况下,需要一些文档) .

相反,将生成器作为第一个参数传递给updateupdate 迭代它的第一个参数,因此生成器将被完全评估。此外,表达式更简单,(我认为)更易于阅读:

self._value_store.update((k,v) for k,v in kwargs.items()
                               if self.keyword_check(k))

您可能会发现显式循环更具可读性:

for k, v in kwargs.items():
    if self.keyword_check(k):
         self._value_store[k] = v

# Or, possibly faster (or possibly not):

for k in kwargs.keys():
    if self.keyword_check(k):
        self._value_store[k] = kwargs[k]    

顺便说一句,测试布尔函数返回的值是否与True 相等也是一种反模式(这就是我在上面没有这样做的原因)。如果谓词可能返回除True 之外的真实值,则可能会忽略通过测试的值。

【讨论】:

【参考方案2】:

正如其他人已经指出的,你的函数应该总是返回一个值(我不会争论这个)。

但是,也许您想要实现的是:

map(lambda k,v: self.keyword_check(k) and self._value_store.update(k=v), kwargs.keys(),kwargs.value)

请注意,我使用了一个简单的 and 运算符,而不是像您那样使用三元运算符。

这里,方法self._value_store.update(k=v) 仅在self.keyword_check(k)True 时调用。这就是你所追求的(避免需要 else 子句)。

这要归功于short circuit evaluation:计算 AND 表达式时,如果第一个运算符为 False,则表达式为 False,不需要计算第二个运算符。

当然,你应该注意,如果第一个状态(self.keyword_check(k))是False,那么返回值应该是False(应该存在一个值)。

【讨论】:

以上是关于map() + lambda else 子句如何啥都不做的主要内容,如果未能解决你的问题,请参考以下文章

Python-函数式编程-map reduce filter lambda 三元表达式 闭包

使用 lambda 定义可以带来啥乐趣?

python中map(lambda x: x % mydict, mylist)是啥意思?

在SQL语句中,分组用啥子句,排序用啥子句

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

如何在 WHERE 子句中使用 IF ELSE