Передача функций, которые имеют несколько возвращаемых значений в качестве аргументов в 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])", но это приведет к повторному выполнению строки().
Есть ли элегантный, эффективный способ сделать это? Или я должен просто увидеть эту цитату о преждевременной оптимизации и забыть об этом?
Ответы
Ответ 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())
нет, поэтому вам нужно использовать звездочку. Возможно, приятным термином для него может быть "неявная распаковка набора" или "распаковка кортежа без назначения".