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
添加回答
舉報