Можно ли заменить эти две функции Python одной универсальной, принимающей либо список, либо аргумент кортежа?

Могут ли эти две функции Python:

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

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

заменить эквивалентной общей функцией negative(a)?

Вы изменили сигнатуру функции

Tarik 31.08.2024 06:25

@Тарик Что ты имеешь в виду?

Paul Jurczak 31.08.2024 06:30

Вы предполагаете, что negativeList на самом деле принимает в качестве аргумента список (а не произвольное итерируемое значение)?

chepner 31.08.2024 15:01

@chepner Это было мое предположение, выраженное в имени функции.

Paul Jurczak 31.08.2024 23:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
84
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать функцию 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)

ИМХО, это «правильное» решение.

juanpa.arrivillaga 31.08.2024 06:40
Ответ принят как подходящий

Вы можете определить тип во время выполнения

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)) достаточно. ;)

Ulrich Eckhardt 31.08.2024 09:20

ок, поменяю :) это

Derek Roberts 31.08.2024 09:23

Руководство по стилю Python рекомендует не использовать лямбда-выражения в подобных ситуациях; вы просто объявляете обычную функцию. Лямбды следует использовать только для встроенных функций в качестве аргументов.

deceze 31.08.2024 09:33

@deceze о, ок, ок, да, капитан, я найду лучшее решение, обещаю :)

Derek Roberts 31.08.2024 09:41

Я считаю, что именно для этого можно использовать декораторы одиночной отправки:

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], в связанной документации есть примеры, и веб-поиск должен найти гораздо больше.

Другие вопросы по теме