2 回答
TA贡献1865条经验 获得超7个赞
最好使用isinstance而不是处理异常来检查参数是数字还是字典:
def func(*args):
out = {}
factor = 1
for arg in args:
if isinstance(arg, dict):
if not out:
out = arg.copy()
elif out.keys() != arg.keys():
raise KeyError('not same keys')
else:
for key in out:
out[key] *= arg[key]
else:
factor *= arg
for key in out:
out[key] *= factor
if out:
return out
return factor
print(
func(
{'key1': 1, 'key2': 2},
3,
{'key1': 10, 'key2': 20},
4
)
)
print(func(2, 3))
# result:
# {'key1': 120, 'key2': 480}
# 6
TA贡献1898条经验 获得超8个赞
这是一个可以使用的版本,它使用了一些 Python 的“功能”工具。
实际的乘法是使用functools.reduce完成的,使用operator.mul作为乘法运算符。如果您希望函数执行不同的操作,可以很容易地用operator模块中的另一个运算符替换它。
一些警告:
该函数通过将非字典参数替换为所有键等于非字典参数的字典来处理它们。如果您打算处理非常大的字典或包含大量非字典项的 参数列表,这可能是一个问题。
该函数构建其参数和作为字典的参数的列表;同样,这对于非常大的输入来说可能是一个问题。
它不检查参数是否都是可接受的类型。
import functools
import operator
def p(*args):
args = list(args)
dicts = list(filter(lambda x: isinstance(x, dict), args))
if not dicts:
# Either there are no arguments, or they all numbers.
return functools.reduce(operator.mul, args, 0)
keys = dicts[0].keys()
if not all(d.keys() == keys for d in dicts):
raise ValueError(f'Not all dicts have matching keys.')
for i, arg in enumerate(args):
# Assume "number" means int or float, but could be complex, or Decimal?
# See the numbers module for numeric abstract base classes.
if isinstance(arg, (float, int)):
args[i] = dict.fromkeys(keys, arg)
out = {k: functools.reduce(operator.mul, (a[k] for a in args)) for k in keys}
return out
添加回答
举报