[英]Unpack multiple dictionaries as functional arguments without repeating double asterisk
[英]Unpack without using * (asterisk)
如果我想保持功能,并且不想在中间使用*
,那么等效的替代品 function 是什么? 例如,
import operator as op
print(op.eq(*map(str.upper, ['a', 'A'])))
我如何避免在这里使用*
?
我创建了一个 function,比如,
def unpack(args):
return *args
但它给出了语法错误, print(*args)
有效但return
失败
functools.reduce
可用于将两个 arguments 中的一个 function 累积应用于可迭代对象,这适用于您的示例案例
import operator as op
from functools import reduce
print(reduce(op.eq, map(str.upper, ['a', 'A'])))
您可以使用reduce
来检查所有映射元素是否彼此相等。
from functools import reduce
print(reduce(op.eq, map(str.upper, ['a', 'A'])))
不过,这并不是一件明智的事情。 我这样说是因为上面的reduce
调用并没有推广到具有更多或更少元素的情况:
TypeError: reduce() of empty sequence with no initial value
。True
或False
。False
。 如果您的计划是使用恰好两个操作数调用op.eq
,不多也不少,那么使用*
解包是合适的。 即使在功能上下文中。
实现此目的的一种方法是创建一个名为apply
的 function。
def apply(func, args):
return func(*args)
apply(op.eq, map(str.upper, ['a', 'A']))
如果有一些您知道不会出现的安全值,您可以使用reduce
来解决这个问题。 例如,如果您知道None
不会出现在您的列表中,您可以这样做
import functools
mylist = list(map(str.upper, ['a', 'A']))
result = functools.reduce(lambda x, y: x if x == y else None, mylist)
print('all equal' if result != None else 'some differ')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.