我想设计一个函数f(x)
,其输入可以是
在第二种情况下,f(x)
应返回相应结果的列表。
我正在考虑将其设计如下。
def f(x):
if isinstance(x, list):
return [f(y) for y in x]
# some calculation
# from x to result
return result
这是一个好设计吗?这样做的规范方法是什么?
答案 0 :(得分:4)
不,这不是好设计。
将函数设计为仅采用一种数据类型。如果调用者只有一个项目,那么在调用之前将它们包装在列表中是微不足道的。
result = f([list x])
或者,让函数只接受一个值,调用者可以轻松地将该函数应用于列表:
result = map(f, [x, y, z])
答案 1 :(得分:4)
当他们有一个列表时,他们可以很容易地映射该函数(例子):
def f(x):
return x + 1 #calcuation
lst = map(f, [1, 2, 3])
print(lst) # [2, 3, 4]
请记住:该功能应该做一件事,做得好:)
答案 2 :(得分:1)
我避免它。我最大的问题是,有时你会返回一个列表,有时候你会返回一个对象。我让它在列表或对象上运行,然后让用户处理包装对象,在列表解析中调用函数。
如果你真的需要让它同时工作,我认为你最好不要使用:
def func(obj):
if not isinstance(obj, list):
obj = [obj]
# continue
这样你总是会返回一个列表。
答案 3 :(得分:0)
实际上,实施可能有效(但有改进的余地)。问题是你正在创造一个暧昧和意想不到的行为。最好的方法是拥有2个不同的函数f(x)
和f_on_list()
或类似的东西,其中第二个将第一个函数应用于列表。