Функции с переменным числом аргументов
В СИ имеются функции, которым можно передавать разное число фактических параметров. Например: функция printf. У нее есть 1 обязательный аргумент, форматная строка. Помимо нее могут присутствовать другие аргументы, но их количество никак не оговаривается. Появление необязательных аргументов приводит к тому, что компилятор теряет возможность осуществлять проверку их типов. В СИ любая функция с переменным числом аргументов должна иметь хотя бы 1 явный аргумент. У функции printf это формат.
Реализация функций с переменным числом аргументов
Основная проблема в том, каким образом обрабатывать те фактические параметры, для которых нет соответствующих формальных. Для работы с переменным списком аргументов, в заголовочном файле stdarg.h определено несколько макросов, имена которых начинаются с va_. Обработка переменного списка состоит из нескольких этапов.
1) определяем переменную, которая будет хранить указатель на переменную части списка. Эта переменная имеет тип va_list, которая является синонимом void*.
2) необходимо инициализировать эту переменную. Для этого вызывается макрос va_start, которому передаются два аргумента. 1й это переменная, для хранения указателя, а 2й это имя последнего фиксированного аргумента функции. Имя последнего фиксированного аргумента позволяет найти адрес первого нефиксированного.
3) с помощью макроса va_arg с двумя аргументами поочередно считываются значения добавочных параметров. Из этого следует, что программист должен заранее знать типы аргументов, которые могут быть помещены в произвольный список. Он вызывается для каждого дополнительного аргумента, но необходимо каким-то образом определить, когда список фактических параметров будет исчерпан. Это задача программиста. Решения могут быть разные. Например: 1й дополнительный аргумент может описывать общее количество дополнительных аргументов. Если дополнительные параметры имеют один и тот же тип, то признаком конца может служить некоторое специальное значение, например 0.
А в printf дополнительные параметры отыскиваются для каждой спецификации формата.4) после того как работа с переменной частью списка закончена, необходимо вызвать макрос va_end.
Особенности вызова функции в си
При вызове функции создается фрейм вызова, в котором в том числе размещаются значения фактических параметров. Есть два подхода: 1) аргументы помещаются в стек в порядке их записи в вызове. Этот метод используется в паскале. Однако для СИ он неудобен. Если число параметров переменное, то найти где находится первый аргумент, становится трудно. Поэтому в СИ используется обратный порядок. Тогда положение первого элемента определяется указателем на вершину стека. Когда число аргументов фиксировано, то вызываемая функция сама может освободить фрейм вызова, когда закончит выполняться. Поэтому компилятор добавляет в функцию необходимый для этого код. Так происходит в паскале. Если число аргументов — переменная, то о размере фрейма вызова знает вызывающая функция.
Переменные аргументов *args и **kwargs в функции Python.
Наконец, наименее часто используемая опция, это когда функция вызываться с произвольным числом аргументов. Обычно они указываются последними в списке формальных параметров, потому что собирают все оставшиеся входные аргументы, которые передаются в функцию.
При определении функции, параметры с произвольным числом аргументов указывают как:
*args
— произвольное число позиционных аргументов. При вызове функции, на место этого параметра передается список аргументов, заключенных в кортеж. Перед*args
может быть ноль или более нормальных аргументов. Любые формальные параметры, которые появляются после параметра*args
, являются аргументами «только для ключевых слов». Это означает, что следующие за*args
параметры могут использоваться только как ключевые аргументы, а не как позиционные.**kwargs
— произвольное число именованных аргументов. При вызове функции, на его место передается список именованных аргументов заключенных в словарь, кроме тех, имена которых были определены ранее. Параметр**kwargs
может быть определен совместно с другим формальным параметром*args
. Параметр**kwargs
указывается последним в области определения формальных параметров функции.
Примечание: один символ *
в имени параметра функцииargs
распаковывает список или кортеж для передачи позиционных аргументов, а два символа **
в имени параметра функции **kwargs
распаковывает словарь для передачи ключевых аргументов в функцию при ее вызове.
Имена *args
и **kwargs
по негласному соглашению принято использовать в документации Python. На самом деле никто не запрещает брать любые другие имена переменных. Например, для словарей наряду c **kwargs
иногда используют **options
.
*args
:def chees(*arguments): for arg in arguments: print(arg) word = ("It's very runny, sir.", "It's really very.", "VERY runny, sir.") chees(*word) # Выведет It's very runny, sir. It's really very. VERY runny, sir.Пример использования
**kwargs
:def shop(**keywords): for kw in keywords: print(kw, ":", keywords[kw]) kword = {shopkeeper:"Michael Palin", client:"John Cleese", sketch:"Cheese Shop Sketch"} shop(**kword) # Выведет shopkeeper : Michael Palin client : John Cleese sketch : Cheese Shop Sketch
Распаковку можно использовать несколько раз. На примере словаря:
def process_data(a, b, c, d): print(a, b, c, d) x = {'a': 1, 'b': 2} y = {'c': 3, 'd': 4} process_data(**x, **y) 1 2 3 4 process_data(**x, c=23, d=42) 1 2 23 42Пример совместного использования
*args
и **kwargs
:def cheeseshop(kind, *arguments, **keywords): print("-- Do you have any", kind, "?") print("-- I'm sorry, we're all out of", kind) for arg in arguments: print(arg) print("-" * 40) for kw in keywords: print(kw, ":", keywords[kw])
Функцию cheeseshop
можно вызвать так:
word = ("It's very runny, sir.", "It's really very.", "VERY runny, sir.") kword = {shopkeeper:"Michael Palin", client:"John Cleese", sketch:"Cheese Shop Sketch"} cheeseshop("Limburger", *word, **kword)
и, конечно, функция выведет:
-- Do you have any Limburger ? -- I'm sorry, we're all out of Limburger It's very runny, sir. It's really very. VERY runny, sir. ---------------------------------------- shopkeeper : Michael Palin client : John Cleese sketch : Cheese Shop Sketch
Аргументы функций Python (с примерами)
В этом руководстве мы узнаем об аргументах функций в Python с помощью примеров.
В компьютерном программировании функция — это значение, которое принимает функция.
Прежде чем мы узнаем об аргументах функций, обязательно узнайте о функциях Python.
Пример 1: аргументы функции Python
def add_numbers(a, b): сумма = а + б print('Сумма:', сумма) add_numbers(2, 3) # Вывод: Сумма: 5
В приведенном выше примере функция add_numbers()
принимает два параметра: a
и b
. Обратите внимание на строку
add_numbers(2, 3)
Здесь add_numbers(2, 3)
указывает, что параметры a
и b
получат значения 2 и 3 соответственно.
Аргумент функции со значениями по умолчанию
В Python мы можем указать значения по умолчанию для аргументов функции.
Мы используем оператор =
для предоставления значений по умолчанию. Например,
def add_numbers( a = 7, b = 8): сумма = а + б print('Сумма:', сумма) # вызов функции с двумя аргументами add_numbers(2, 3) # вызов функции с одним аргументом add_numbers (а = 2) # вызов функции без аргументов add_numbers()
Вывод
Сумма: 5 Сумма: 10 Сумма: 15
В приведенном выше примере обратите внимание на определение функции
def add_numbers(a = 7, b = 8): ...
Здесь мы предоставили значения по умолчанию 7 и 8 для параметров a и b соответственно. Вот как работает эта программа
Оба значения передаются при вызове функции. Следовательно, эти значения используются вместо значений по умолчанию.
2. add_number(2)
Во время вызова функции передается только одно значение. Итак, по позиционному аргументу 2 присваивается аргументу a
, а значение по умолчанию используется для параметра b
.
3. add_number()
Во время вызова функции значение не передается. Следовательно, для обоих параметров a
и b
используется значение по умолчанию.
Аргумент ключевого слова Python
В аргументах ключевого слова аргументы назначаются на основе имени аргументов. Например,
def display_info(first_name, last_name): print('Имя:', first_name) print('Фамилия:', last_name) display_info (last_name = 'Картман', first_name = 'Эрик')
Выход
Имя: Эрик Фамилия: Картман
Здесь обратите внимание на вызов функции,
display_info(last_name = 'Cartman', first_name = 'Eric')
Здесь мы присвоили имена аргументам во время вызова функции.
Следовательно, first_name
в вызове функции присваивается first_name
в определении функции. Аналогично, last_name
в вызове функции присваивается last_name
в определении функции.
В таких сценариях положение аргументов не имеет значения.
Функция Python с произвольными аргументами
Иногда мы не знаем заранее количество аргументов, которые будут переданы в функцию. Чтобы справиться с такой ситуацией, мы можем использовать произвольные аргументы в Python.
Произвольные аргументы позволяют передавать различное количество значений во время вызова функции.
Мы используем звездочку (*) перед именем параметра, чтобы обозначить этот тип аргумента. Например,
# программа для нахождения суммы нескольких чисел определение найти_сумма (* числа): результат = 0 для числа в цифрах: результат = результат + число print("Сумма = ", результат) # вызов функции с 3 аргументами найти_сумма (1, 2, 3) # вызов функции с 2 аргументами find_sum(4, 9)
Вывод
Сумма = 6 Сумма = 13
В приведенном выше примере мы создали функцию find_sum()
, которая принимает произвольные аргументы. Обратите внимание на строки
найти_сумма(1, 2, 3) find_sum(4, 9)
Здесь мы можем вызывать одну и ту же функцию с разными аргументами.
Примечание : после получения нескольких значений чисел
ведут себя как массив, поэтому мы можем использовать цикл для
для доступа к каждому значению.
Python args and kwargs: Demystified — Real Python
Смотреть сейчас Это руководство содержит соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Python args and kwargs: Demystified
Иногда, когда вы смотрите на определение функции в Python, вы можете заметить, что оно принимает два странных аргумента: *args
и **kwargs
. Если вы когда-нибудь задумывались, что это за необычные переменные или почему ваша IDE определяет их в main()
, то эта статья для вас. Вы узнаете, как использовать args и kwargs в Python, чтобы повысить гибкость ваших функций.
К концу статьи вы будете знать:
- Что на самом деле означают
*args
и**kwargs
- Как использовать
*args
и**kwargs
в определениях функций - Как использовать одну звездочку (
*
) для распаковки итерируемых объектов - Как использовать две звездочки (
**
) для распаковки словарей
В этой статье предполагается, что вы уже знаете, как определять функции Python и работать со списками и словарями.
Бесплатный бонус: Щелкните здесь, чтобы получить памятку по Python и изучить основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.
Передача нескольких аргументов в функцию
*args
и **kwargs
позволяют передавать в функцию несколько аргументов или аргументов с ключевыми словами. Рассмотрим следующий пример. Это простая функция, которая принимает два аргумента и возвращает их сумму:
по определению my_sum(a, b): вернуть а + б
Эта функция работает нормально, но она ограничена только двумя аргументами. Что делать, если вам нужно суммировать различное количество аргументов, когда конкретное количество переданных аргументов определяется только во время выполнения? Было бы здорово создать функцию, которая могла бы суммировать всех переданных ей целых чисел, сколько бы их ни было?
Удалить рекламу
Использование переменной Python args в определениях функций
Есть несколько способов передать в функцию различное количество аргументов. Первый способ часто наиболее интуитивно понятен для людей, имеющих опыт работы с коллекциями. Вы просто передаете список или набор всех аргументов вашей функции. Так за my_sum()
, вы можете передать список всех целых чисел, которые вам нужно добавить:
# сумма_целых_список. py защита my_sum (my_integers): результат = 0 для x в my_integers: результат += х вернуть результат list_of_integers = [1, 2, 3] печать (моя_сумма (список_целых чисел))
Эта реализация работает, но всякий раз, когда вы вызываете эту функцию, вам также нужно создать список аргументов для передачи ей. Это может быть неудобно, особенно если вы не знаете заранее все значения, которые должны войти в список.
Именно здесь *args
может быть действительно полезным, поскольку позволяет передавать различное количество позиционных аргументов. Возьмем следующий пример:
# sum_integers_args.py защита my_sum(*аргументы): результат = 0 # Перебор кортежа аргументов Python для x в аргументах: результат += х вернуть результат печать (моя_сумма (1, 2, 3))
В этом примере вы больше не передаете список в my_sum()
. Вместо этого вы передаете три разных позиционных аргумента. my_sum()
берет все параметры, предоставленные во входных данных, и упаковывает их все в один повторяемый объект с именем args
.
Обратите внимание, что args
— это просто имя. Вы не обязаны использовать имя args
. Вы можете выбрать любое имя, которое вы предпочитаете, например, целых чисел
:
# сумма_целых_аргументов_2.py Def my_sum (* целые числа): результат = 0 для x в целых числах: результат += х вернуть результат печать (моя_сумма (1, 2, 3))
Функция по-прежнему работает, даже если вы передаете итерируемый объект как целых чисел
вместо аргументов
. Здесь важно только то, что вы используете оператор распаковки ( *
).
Имейте в виду, что итерируемый объект, который вы получите с помощью оператора распаковки *
, — это не список
, а кортеж
. Кортеж
аналогичен списку
тем, что они оба поддерживают срезы и итерации. Однако кортежи сильно отличаются по крайней мере в одном аспекте: списки изменяемы, а кортежи — нет. Чтобы проверить это, запустите следующий код. Этот скрипт пытается изменить значение списка:
# change_list.py мой_список = [1, 2, 3] мой_список[0] = 9 распечатать (мой_список)
Значение, расположенное в самом первом индексе списка, должно быть обновлено до 9
. Если вы выполните этот скрипт, вы увидите, что список действительно изменяется:
$ python change_list.py [9, 2, 3]
Первое значение больше не 0
, а обновленное значение 9
. Теперь попробуйте сделать то же самое с кортежем:
# change_tuple.py my_tuple = (1, 2, 3) мой_кортеж[0] = 9печать (мой_кортеж)
Здесь вы видите те же значения, за исключением того, что они объединены в кортеж. Если вы попытаетесь выполнить этот скрипт, вы увидите, что интерпретатор Python возвращает ошибку:
.$ python change_tuple.py Traceback (последний последний вызов): Файл «change_tuple.py», строка 3, вмой_кортеж[0] = 9 TypeError: объект 'tuple' не поддерживает назначение элементов
Это связано с тем, что кортеж является неизменяемым объектом, и его значения не могут быть изменены после присваивания. Помните об этом, когда работаете с кортежами и *аргументы
.
Использование переменной Python kwargs в определениях функций
Хорошо, теперь вы поняли, для чего предназначено *args
, но как насчет **kwargs
? **kwargs
работает точно так же, как *args
, но вместо позиционных аргументов принимает аргументы ключевого слова (или с именем ). Возьмем следующий пример:
# concatenate.py деф конкатенировать (** kwargs): результат = "" # Перебор словаря Python kwargs для аргумента в kwargs.values(): результат += аргумент вернуть результат print(concatenate(a="Real", b="Python", c="Is", d="Great", e="!"))
Когда вы выполняете приведенный выше скрипт, concatenate()
будет перебирать словарь Python kwargs и объединять все найденные значения:
$ Python concatenate.py RealPython — это здорово!
Like args
, kwargs
— это просто имя, которое можно изменить на любое другое. Опять же, здесь важно использование оператора распаковки ( **
).
Итак, предыдущий пример можно было бы записать так:
# concatenate_2.py деф конкатенировать (** слова): результат = "" для аргумента в words.values(): результат += аргумент вернуть результат print(concatenate(a="Real", b="Python", c="Is", d="Great", e="!"))
Обратите внимание, что в приведенном выше примере итерируемый объект является стандартным dict
. Если вы перебираете словарь и хотите вернуть его значения, как в показанном примере, вы должны использовать .values()
.
На самом деле, если вы забудете использовать этот метод, вы обнаружите, что перебираете keys вашего словаря Python kwargs, как в следующем примере:
# concatenate_keys.py деф конкатенировать (** kwargs): результат = "" # Итерация по ключам словаря Python kwargs для аргумента в kwargs: результат += аргумент вернуть результат print(concatenate(a="Real", b="Python", c="Is", d="Great", e="!"))
Теперь, если вы попытаетесь выполнить этот пример, вы увидите следующий вывод:
$ питон concatenate_keys. py abcde
Как видите, если вы не укажете .values()
, ваша функция будет перебирать ключи вашего словаря Python kwargs, возвращая неверный результат.
Удаление рекламы
Упорядочивание аргументов в функции
Теперь, когда вы узнали, для чего нужны *args
и **kwargs
, вы готовы приступить к написанию функций, которые принимают различное количество входных аргументов. Но что, если вы хотите создать функцию, которая принимает переменное число как позиционных 9, так и0226 и именованные аргументы?
В этом случае вы должны иметь в виду, что заказов считается . Точно так же, как аргументы не по умолчанию должны предшествовать аргументам по умолчанию, *args
должны предшествовать **kwargs
.
Напомним, правильный порядок ваших параметров:
- Стандартные аргументы
-
*аргументы
аргументы -
**kwargs
аргументов
Например, правильное определение этой функции:
# correct_function_definition. py def my_function(a, b, *args, **kwargs): проходят
Переменная *args
правильно указана перед **kwargs
. Но что, если вы попытаетесь изменить порядок аргументов? Например, рассмотрим следующую функцию:
# неправильно_функция_определение.py def my_function(a, b, **kwargs, *args): проходят
Теперь **kwargs
предшествует *args
в определении функции. Если вы попытаетесь запустить этот пример, вы получите сообщение об ошибке от интерпретатора: 9SyntaxError: неверный синтаксис
В этом случае, поскольку *args
идет после **kwargs
, интерпретатор Python выдает SyntaxError
.
Распаковка с помощью операторов Asterisk:
*
и **
Теперь вы можете использовать *args
и **kwargs
для определения функций Python, которые принимают различное количество входных аргументов. Давайте немного углубимся, чтобы понять кое-что об операторах распаковки 9. 0031 .
Операторы распаковки с одинарной и двойной звездочкой были введены в Python 2. В версии 3.5 они стали еще более мощными благодаря PEP 448. Короче говоря, операторы распаковки — это операторы, которые распаковывают значения из итерируемых объектов в Python. Оператор одиночной звездочки *
можно использовать в любой итерации, предоставляемой Python, а оператор двойной звездочки **
можно использовать только в словарях.
Начнем с примера:
# print_list.py мой_список = [1, 2, 3] распечатать (мой_список)
Этот код определяет список и затем выводит его на стандартный вывод:
$ питон print_list.py [1, 2, 3]
Обратите внимание, как печатается список вместе с соответствующими скобками и запятыми.
Теперь попробуйте добавить оператор распаковки *
к имени вашего списка:
# print_unpacked_list.py мой_список = [1, 2, 3] распечатать (*мой_список)
Здесь оператор *
говорит print()
, чтобы сначала распаковать список.
В этом случае на выходе уже не сам список, а скорее содержимое списка:
$ питон print_unpacked_list.py 1 2 3
Вы видите разницу между этим выполнением и выполнением из print_list.py
? Вместо списка функция print()
принимает на вход три отдельных аргумента.
Еще вы заметите, что в print_unpacked_list.py
, вы использовали оператор распаковки *
для вызова функции, а не в определении функции. В этом случае print()
принимает все элементы списка, как если бы они были отдельными аргументами.
Вы также можете использовать этот метод для вызова собственных функций, но если ваша функция требует определенного количества аргументов, то итерируемый объект, который вы распаковываете, должен иметь такое же количество аргументов.
Чтобы проверить это поведение, рассмотрите этот скрипт:
# unpacking_call.py определить my_sum (а, б, в): напечатать (а + б + в) мой_список = [1, 2, 3] моя_сумма(*мой_список)
Здесь my_sum()
явно указывает, что a
, b
и c
являются обязательными аргументами.
Если вы запустите этот скрипт, вы получите сумму трех чисел в my_list
:
$ питон unpacking_call.py 6
3 элемента в my_list
идеально совпадают с требуемыми аргументами в my_sum()
.
Теперь посмотрите на следующий скрипт, где my_list
имеет 4 аргумента вместо 3:
# неправильно_распаковка_call.py определить my_sum (а, б, в): напечатать (а + б + в) мой_список = [1, 2, 3, 4] моя_сумма(*мой_список)
В этом примере my_sum()
по-прежнему ожидает только три аргумента, но оператор *
получает 4 элемента из списка. Если вы попытаетесь выполнить этот скрипт, вы увидите, что интерпретатор Python не может его запустить:
$ Python неправильный_unpacking_call.py Traceback (последний последний вызов): Файл "wrong_unpacking_call.py", строка 6, вмоя_сумма(*мой_список) TypeError: my_sum() принимает 3 позиционных аргумента, но было задано 4
Когда вы используете оператор *
для распаковки списка и передачи аргументов в функцию, это точно так же, как если бы вы передавали каждый аргумент отдельно. Это означает, что вы можете использовать несколько операторов распаковки, чтобы получить значения из нескольких списков и передать их все одной функции.
Чтобы проверить это поведение, рассмотрим следующий пример:
# сумма_целых_аргументов_3.py защита my_sum(*аргументы): результат = 0 для x в аргументах: результат += х вернуть результат список1 = [1, 2, 3] список2 = [4, 5] список3 = [6, 7, 8, 9] печать (моя_сумма (* список1, * список2, * список3))
Если запустить этот пример, все три списка будут распакованы. Каждый отдельный элемент передается в my_sum()
, что приводит к следующему результату:
$ Python sum_integers_args_3.py 45
Существуют и другие удобные способы использования оператора распаковки. Например, предположим, что вам нужно разделить список на три разные части. Вывод должен отображать первое значение, последнее значение и все промежуточные значения. С оператором распаковки вы можете сделать это всего одной строкой кода:
# extract_list_body. py мой_список = [1, 2, 3, 4, 5, 6] а, *б, с = мой_список печать (а) печать (б) печать (с)
В этом примере my_list
содержит 6 элементов. Первой переменной присваивается a
, последней — c
, а все остальные значения упаковываются в новый список b
. Если вы запустите скрипт, print()
покажет вам, что ваши три переменные имеют ожидаемые значения:
$ python extract_list_body.py 1 [2, 3, 4, 5] 6
Еще одна интересная вещь, которую вы можете сделать с помощью оператора распаковки *
, — это разделить элементы любого итерируемого объекта. Это может быть очень полезно, если вам нужно объединить два списка, например:
# слияние_списков.py мой_первый_список = [1, 2, 3] мой_секундный_список = [4, 5, 6] my_merged_list = [*мой_первый_список, *мой_второй_список] распечатать (мой_слитный_список)
Оператор распаковки *
добавляется как к my_first_list
, так и к my_second_list
.
Если вы запустите этот скрипт, вы увидите, что результатом является объединенный список:
$ питон слияние_списков.py [1, 2, 3, 4, 5, 6]
Вы даже можете объединить два разных словаря с помощью оператора распаковки **
:
# слияние_dicts.py my_first_dict = {"А": 1, "Б": 2} my_second_dict = {"С": 3, "Д": 4} my_merged_dict = {**my_first_dict, **my_second_dict} печать (my_merged_dict)
Здесь итерации для слияния: my_first_dict
и my_second_dict
.
При выполнении этого кода выводится объединенный словарь:
$ питон слияние_dicts.py {'A': 1, 'B': 2, 'C': 3, 'D': 4}
Помните, что оператор *
работает с любым итерируемым объектом. Его также можно использовать для распаковки строки:
# string_to_list.py а = [*"Настоящий Python"] печать (а)
В Python строки являются повторяемыми объектами, поэтому *
распакует их и поместит все отдельные значения в список и
:
$ Python string_to_list. py ['R', 'e', 'a', 'l', 'P', 'y', 't', 'h', 'o', 'n']
Предыдущий пример кажется замечательным, но когда вы работаете с этими операторами, важно помнить о седьмом правиле The Zen of Python Тима Питерса: Читабельность имеет значение .
Чтобы понять почему, рассмотрим следующий пример:
# загадочное_statement.py * а, = "Настоящий Python" печать (а)
Есть оператор распаковки *
, затем переменная, запятая и присваивание. Столько всего в одну строчку! По сути, этот код ничем не отличается от предыдущего примера. Он просто берет строку RealPython
и назначает все элементы новому списку a
благодаря оператору распаковки *
.
Запятая после и
делает свое дело. Когда вы используете оператор распаковки с назначением переменной, Python требует, чтобы результирующая переменная была либо списком, либо кортежем. С завершающей запятой вы определили кортеж только с одной именованной переменной, a
, который является списком ['R', 'e', 'a', 'l', 'P', 'y', 't', 'h', 'o', 'n']
.
Вы никогда не увидите кортеж, созданный Python в этой операции, потому что вы используете распаковку кортежа в сочетании с оператором распаковки *
.
Если вы назовете вторую переменную в левой части присваивания, Python присвоит второй переменной последний символ строки, собрав все оставшиеся символы в списке a
:
>>>
>>> *a, b = "Настоящий Python" >>> б "н" >>> тип(б) <класс 'ул'> >>> а ["Р", "е", "а", "л", "р", "у", "т", "ч", о"] >>> тип(а) <класс 'список'>
Когда вы используете эту операцию со второй именованной переменной, как показано выше, результаты могут быть более знакомыми, если вы раньше работали с распаковкой кортежей. Однако, если вы хотите распаковать все элементы итерации переменной длины в одну переменную, a
, то вам нужно добавить запятую (,
) без имени второй переменной. Затем Python распаковывает все элементы в первую именованную переменную, которая является списком.