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
参数似乎是强制性的,但我不希望它做任何事情,除非关键字验证返回True
或False
时转到下一个可迭代对象。我尝试在 else 子句之后添加 pass,但 Python 不喜欢它。它适用于我放置的else print('bad parameter')
,但这只是一个临时解决方案。当它是False
时,我可以在这里使用什么来执行/输出任何内容?
【问题讨论】:
好吧,通过使用 map,您将一个函数应用于可迭代的每个项目。你的函数应该总是返回一些东西,对吧?如果是同一个变换,则适当设置 这能回答你的问题吗? List comprehension with if statement 也许首先尝试使用普通功能而不是lamba
、map(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
以避免创建无用的None
s 列表;all
将在这里起作用,因为.update()
总是返回None
,但这可能是更糟糕的编程风格。 )
一般来说,只使用map
来产生副作用通常不是好的风格,除非您确实需要延迟执行副作用(在这种情况下,需要一些文档) .
相反,将生成器作为第一个参数传递给update
; update
迭代它的第一个参数,因此生成器将被完全评估。此外,表达式更简单,(我认为)更易于阅读:
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 三元表达式 闭包
python中map(lambda x: x % mydict, mylist)是啥意思?