这两个 Python 函数可以:

def negativeList(a):
  return [-e for e in a]

def negativeTuple(a):
  return tuple(-e for e in a)

被等效的单一通用函数取代吗negative(a)

4

  • 你改变了函数签名


    – 

  • @Tarik 你的意思是什么?


    – 

  • 您是否假设它negativeList实际上以列表(而不是任意可迭代值)作为参数?


    – 

  • @chepner 这是我在函数名称中表达的假设。


    – 


最佳答案
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
    好的,会改变的:)


    – 

  • 1
    Python 风格指南建议不要在这种情况下使用 lambda;你只是声明一个常规函数。Lambda 应该只用于内联函数作为参数。


    – 

  • @deceze 哦,好的,好的,好的,队长,我保证会找到更好的解决方案:)


    –