Подтвердить что ты не робот

Передача функций, которые имеют несколько возвращаемых значений в качестве аргументов в Python

Таким образом, функции Python могут возвращать несколько значений. Мне показалось, что было бы удобно (хотя и немного менее читаемо), если бы было возможно.

a = [[1,2],[3,4]]

def cord():
    return 1, 1

def printa(y,x):
    print a[y][x]

printa(cord())

... но это не так. Я знаю, что вы можете сделать то же самое, сбросив оба возвращаемых значения во временные переменные, но это не выглядит так элегантно. Я также мог бы переписать последнюю строку как "printa (cord() [0], cord() [1])", но это приведет к повторному выполнению строки().

Есть ли элегантный, эффективный способ сделать это? Или я должен просто увидеть эту цитату о преждевременной оптимизации и забыть об этом?

4b9b3361

Ответ 1

printa(*cord())

* вот оператор расширения аргумента... ну, я забыл, что он технически назвал, но в этом контексте он берет список или кортеж и расширяет его, поэтому функция видит каждый элемент list/tuple как отдельный аргумент.

Это в основном обратная сторона *, которую вы можете использовать для захвата всех аргументов без ключевого слова в определении функции:

def fn(*args):
    # args is now a tuple of the non-keyworded arguments
    print args

fn(1, 2, 3, 4, 5)

печатает (1, 2, 3, 4, 5)

fn(*[1, 2, 3, 4, 5])

делает то же самое.

Ответ 2

Попробуйте следующее:

>>> def cord():
...     return (1, 1)
...
>>> def printa(y, x):
...     print a[y][x]
...
>>> a=[[1,2],[3,4]]
>>> printa(*cord())
4

Звезда в основном говорит: "Используйте элементы этой коллекции в качестве позиционных аргументов". Вы можете сделать то же самое с аргументом dict для ключевого слова, используя две звезды:

>>> a = {'a' : 2, 'b' : 3}
>>> def foo(a, b):
...    print a, b
...
>>> foo(**a)
2 3

Ответ 3

Собственно, Python действительно не возвращает несколько значений, он возвращает одно значение, которое может быть несколькими значениями, упакованными в кортеж. Это означает, что вам нужно "распаковать" возвращаемое значение, чтобы иметь кратные значения. Утверждение типа

x,y = cord()

делает это, но напрямую использует возвращаемое значение, как вы это делали в

printa(cord())

нет, поэтому вам нужно использовать звездочку. Возможно, приятным термином для него может быть "неявная распаковка набора" или "распаковка кортежа без назначения".