Могут ли эти две функции Python:
def negativeList(a):
return [-e for e in a]
def negativeTuple(a):
return tuple(-e for e in a)
заменить эквивалентной общей функцией negative(a)
?
@Тарик Что ты имеешь в виду?
Вы предполагаете, что negativeList
на самом деле принимает в качестве аргумента список (а не произвольное итерируемое значение)?
@chepner Это было мое предположение, выраженное в имени функции.
Вы можете использовать функцию isinstance, чтобы проверить тип входных данных, а затем вернуть соответствующий тип.
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)
ИМХО, это «правильное» решение.
Вы можете определить тип во время выполнения
def negative(a):
return type(a)(-e for e in a)
Таким образом, мы также можем использовать класс 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.")
Понижение, слишком много кода: negative = lambda a: type(a)(map(lambda e: -e, a))
достаточно. ;)
ок, поменяю :) это
Руководство по стилю Python рекомендует не использовать лямбда-выражения в подобных ситуациях; вы просто объявляете обычную функцию. Лямбды следует использовать только для встроенных функций в качестве аргументов.
@deceze о, ок, ок, да, капитан, я найду лучшее решение, обещаю :)
Я считаю, что именно для этого можно использовать декораторы одиночной отправки:
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]
, в связанной документации есть примеры, и веб-поиск должен найти гораздо больше.
Вы изменили сигнатуру функции