Что такое * в функции возврата в python?

Что * взамен (последняя строка кода)?

def func_list():
    arr=[x for x in range(1,6,2)]
    arr1=arr
    arr1.append(10)
    return *arr,

print(func_list())

После запуска этого кода возвращаемое значение:

(1, 3, 5, 10)

Вы сами ответили на вопрос, не так ли?

Friedrich 21.02.2023 08:22

Отвечает ли это на ваш вопрос? Голая звездочка в параметрах функции?

Friedrich 21.02.2023 08:28

@ dm2 нет, ваша ссылка описывает использование * в аргументах функции, а не в возвращаемом значении

mSafdel 21.02.2023 08:28

@mSafdel выполняет ту же функцию: распаковывает итерируемый объект. Вот почему ваша функция возвращает кортеж, а не список.

dm2 21.02.2023 08:29

Также смотрите python doc в списках выражений.

Friedrich 21.02.2023 08:29

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

Friedrich 21.02.2023 08:30

@Friedrich Этот «дубликат» - совершенно не связанный с этим вопрос.

zvone 21.02.2023 08:46

Взгляните сюда: docs.python.org/3/tutorial/…

Pingu 21.02.2023 09:09
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Потяните за рычаг выброса энергососущих проектов
Потяните за рычаг выброса энергососущих проектов
На этой неделе моя команда отменила проект, над которым я работал. Неделя усилий пошла насмарку.
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
8
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Такое поведение объясняется PEP 448 «Дополнительные обобщения распаковки».

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

С реализацией PEP 448 в Python 3.5, как указано в PEP, распаковка разрешена также в «отображениях кортежей, списков, наборов и словарей».

Это означает, что можно использовать звездочку для распаковки некоторых значений при создании, например. кортеж. PEP показывает этот пример:

>>> *range(4), 4
(0, 1, 2, 3, 4)

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

return *arr,

Тем не менее, я бы не предложил использовать это так, как это было сделано в вопросе. Для этого варианта использования return tuple(arr) будет намного чище IMO, если нужно вернуть кортеж.

Оператор * распаковывает список (или любой другой итерируемый объект). В вашем примере:

return *arr,

На самом деле есть гораздо более важный символ, который меняет смысл выражения: запятая. Запятые в питоне немного странные. Возьмите этот пример:

a = 1,

Вас может удивить, что a == (1,) Запятая создает кортеж. В кортежах Python на самом деле не нужны круглые скобки. Однако, если у них есть только один элемент, им нужна запятая в конце.

Вот почему ваша функция возвращает кортеж.

Что касается *, он распаковывает итерируемый объект. Например, вы можете запустить print(*range(100)), чтобы напечатать числа от 1 до 100. Вы также можете использовать [*l], чтобы легко скопировать список l.

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

Все вместе *l, копирует содержимое l в кортеж.

Астериск не ограничивается списками в контексте распаковки. Применяется к любому итерируемому

Pingu 21.02.2023 09:13

@Pingu, как я ясно заявляю

mousetail 21.02.2023 09:14

Возможно, я педантичен, но ваше первое предложение в ответе может быть истолковано как означающее, что * применяется только к спискам. Не все читают весь ответ

Pingu 21.02.2023 09:15

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