Что * взамен (последняя строка кода)?
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)
Отвечает ли это на ваш вопрос? Голая звездочка в параметрах функции?
@ dm2 нет, ваша ссылка описывает использование * в аргументах функции, а не в возвращаемом значении
@mSafdel выполняет ту же функцию: распаковывает итерируемый объект. Вот почему ваша функция возвращает кортеж, а не список.
Также смотрите python doc в списках выражений.
Тот факт, что * обычно используется в аргументах, не означает, что он специфичен для аргументов.
@Friedrich Этот «дубликат» - совершенно не связанный с этим вопрос.
Взгляните сюда: docs.python.org/3/tutorial/…
Такое поведение объясняется 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, как я ясно заявляю
Возможно, я педантичен, но ваше первое предложение в ответе может быть истолковано как означающее, что * применяется только к спискам. Не все читают весь ответ
Вы сами ответили на вопрос, не так ли?