这两个 Python 函数可以:
def negativeList(a):
return [-e for e in a]
def negativeTuple(a):
return tuple(-e for e in a)
被等效的单一通用函数取代吗negative(a)
?
4
最佳答案
4
您可以使用函数检查输入的类型,然后返回适当的类型。
def negative_sequence(a):
if isinstance(a, list):
return [-e for e in a]
elif isinstance(a, tuple):
return tuple(-e for e in a)
else:
raise TypeError("Input must be a list or a tuple")
# Example usage:
print(negative_sequence([1, 2, 3])) # Output: [-1, -2, -3]
print(negative_sequence((1, 2, 3))) # Output: (-1, -2, -3)
1
-
1我认为这是“正确”的解决方案。
–
|
您可以在运行时确定类型
def negative(a):
return type(a)(-e for e in a)
0
|
我相信这就是的用途:
from functools import singledispatch
@singledispatch
def negative(arg):
return f'unsupported type: {type(arg)}'
@negative.register
def _(arg: tuple):
return tuple(-e for e in arg)
@negative.register
def _(arg: list):
return list(-e for e in arg)
print(negative(10))
print(negative('abc'))
print(negative([1, 2, 4]))
print(negative((1, 2, 3)))
笔记:
- 我宁愿引发异常而不是返回错误字符串,那部分只是为了更容易的演示。
- 您可以使用例如
list[int]
或进一步区分tuple[float]
,链接的文档中有示例,并且网络搜索应该会出现更多示例。
|
因此我们也可以使用Iterable
类使其更加健壮
from collections.abc import Iterable
import numpy as np
def negative(a):
if isinstance(a, Iterable):
result = (-e for e in a)
if isinstance(a, list):
return list(result)
elif isinstance(a, tuple):
return tuple(result)
elif isinstance(a, np.ndarray):
return np.negative(a)
else:
raise TypeError("Not supported iterable type.")
else:
raise TypeError("Interables only.")
4
-
1反对,代码太多了:
negative = lambda a: type(a)(map(lambda e: -e, a))
就足够了。;)
– -
1好的,会改变的:)
– -
1Python 风格指南建议不要在这种情况下使用 lambda;你只是声明一个常规函数。Lambda 应该只用于内联函数作为参数。
–
♦ -
@deceze 哦,好的,好的,好的,队长,我保证会找到更好的解决方案:)
–
|
–
–
negativeList
实际上以列表(而不是任意可迭代值)作为参数?–
–
|