что значит звездочка в питоне перед переменной

Что такое *args и **kwargs в Python?

Функции — это жизнь. Правда? Если вы только начали осваивать Python, неважно — первый ли это ваш язык программирования, или вы пришли в Python из другого языка, то вы уже знаете о том, что количество параметров в объявлении функции соответствует количеству аргументов, которые передают функции при вызове.

что значит звездочка в питоне перед переменной. Смотреть фото что значит звездочка в питоне перед переменной. Смотреть картинку что значит звездочка в питоне перед переменной. Картинка про что значит звездочка в питоне перед переменной. Фото что значит звездочка в питоне перед переменной

Не позволяйте всяким значкам загонять себя в ступор. Тут нет ничего архисложного. В общем-то, если эти конструкции вам незнакомы — предлагаю с ними разобраться.

Позиционные и именованные аргументы

Сначала поговорим о том, чем они отличаются. В простейшей функции мы просто сопоставляем позиции аргументов и параметров. Аргумент №1 соответствует параметру №1, аргумент №2 — параметру №2 и так далее.

Для вызова функции необходимы все три аргумента. Если пропустить хотя бы один из них — будет выдано сообщение об ошибке.

Если при объявлении функции назначить параметру значение по умолчанию — указывать соответствующий аргумент при вызове функции уже необязательно. Параметр становится опциональным.

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

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

Оператор «звёздочка»

Оператор * чаще всего ассоциируется у людей с операцией умножения, но в Python он имеет и другой смысл.

Этот оператор позволяет «распаковывать» объекты, внутри которых хранятся некие элементы. Вот пример:

Как пользоваться *args и **kwargs

Итак, мы знаем о том, что оператор «звёздочка» в Python способен «вытаскивать» из объектов составляющие их элементы. Знаем мы и о том, что существует два вида параметров функций. Вполне возможно, что вы уже додумались до этого сами, но я, на всякий случай, скажу об этом. А именно, *args — это сокращение от «arguments» (аргументы), а **kwargs — сокращение от «keyword arguments» (именованные аргументы).

Каждая из этих конструкций используется для распаковки аргументов соответствующего типа, позволяя вызывать функции со списком аргументов переменной длины. Например — создадим функцию, которая умеет выводить результаты, набранные учеником в тесте:

Итоги

Вот несколько советов, которые помогут вам избежать распространённых проблем, возникающих при работе с функциями, и расширить свои знания:

Источник

Звёздный Python: где и как используются * и **

Авторизуйтесь

Звёздный Python: где и как используются * и **

что значит звездочка в питоне перед переменной. Смотреть фото что значит звездочка в питоне перед переменной. Смотреть картинку что значит звездочка в питоне перед переменной. Картинка про что значит звездочка в питоне перед переменной. Фото что значит звездочка в питоне перед переменной

Что мы не собираемся обсуждать

Речь пойдёт о префиксных, а не об инфиксных операторах. То есть мы не собираемся обсуждать умножение и возведение в степень:

О чём пойдёт речь

Прим. перев. Примеры кода в статье предполагают использование Python 3.

Звёздочки для распаковки в аргументы функции

При вызове функции можно использовать оператор * для распаковки итерируемого объекта в аргументы вызова:

Строка print(*fruits) передаёт все элементы списка fruits в вызов print() как отдельные аргументы, поэтому нам даже не нужно знать, сколько элементов в списке.

Здесь мы принимаем список со списками и возвращаем «транспонированный» список.

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

Начиная с Python 3.5 * и ** можно использовать несколько раз в вызове функции.

Порой бывает полезно использовать * несколько раз:

Похожим образом используются ** :

Звёздочки для упаковки аргументов, переданных в функцию

Эта функция принимает любое количество аргументов:

Стандартные функции Python print() и zip() принимают любое количество позиционных аргументов. Благодаря * мы можем написать свою функцию, работающую похожим образом.

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

Оператор ** соберёт все переданные именованные аргументы в словарь, на который ссылается аргумент attributes :

Позиционные аргументы с только именованными аргументами

В Python 3 появился специальный синтаксис для только именованных (keyword-only) аргументов. Такие аргументы нельзя указать позиционно, только по имени.

Чтобы принимать только именованные аргументы, при определении функции мы можем расположить именованные аргументы после * :

Эту функцию можно использовать следующим образом:

Такое поведение было добавлено в PEP 3102.

Только именованные аргументы без позиционных

Описанный выше пример выглядит здорово, но что, если мы хотим получить только именованные аргументы без захвата неограниченного количества позиционных?

Прим. перев. Если к этому моменту вы задались вопросом, зачем вообще нужны только именованные аргументы, то всё просто: вызов функции с именованными аргументами выглядит гораздо лучше — сразу можно понять, какой аргумент за что отвечает. Более того, при использовании позиционных аргументов вы вынуждены соблюдать их порядок, в то время как именованные аргументы можно расположить как угодно. Также они позволяют не указывать значения аргументов, у которых есть значения по умолчанию.

Python позволяет сделать это с помощью одинокой звёздочки:

Встроенная функция sorted() использует этот подход. Если посмотреть справку по этой функции, мы увидим следующее:

Звёздочки для распаковки

В Python 3 также появилась возможность использовать оператор * для распаковки итерируемых объектов:

Распаковка может быть даже вложенной:

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

Tакая функциональность была добавлена в PEP 3132.

Звёздочки в литералах списков

В Python 3.5 появились новые способы использования звёздочек. Одной из ключевых новых фич являлась возможность сложить итерируемый объект в новый список.

Допустим, у вас есть функция, которая принимает любую последовательность и возвращает список, состоящий из этой последовательности и её обратной копии, сконкатенированных вместе:

Здесь нам требуется несколько раз преобразовывать последовательности в списки, чтобы получить конечный результат. В Python 3.5 можно поступить по-другому:

Этот вариант избавляет нас от необходимости лишний раз вызывать list и делает наш код более эффективным и читаемым.

Эта функция возвращает новый список, в котором первый элемент переданного списка (или другой последовательности) перемещается в конец нового списка.

Такой вариант использования оператора * является отличной возможностью для конкатенации итерируемых объектов разных типов. Оператор * работает с любым итерируемым объектом, в то время как оператор + работает только с определёнными последовательностями, которые должны быть одного типа.

Мы не ограничены созданием списков. Мы также можем создавать новые кортежи или множества:

Обратите внимание, что в последней строке мы создаём новое множество из списка и генератора. До того как появилась возможность использовать * подобным образом, не было другого простого способа сделать это в одну строку кода. Да, это было возможно, но до такой конструкции было непросто додуматься и сложно запомнить:

Двойные звёздочки в литералах словарей

Однако это можно использовать не только для объединения двух словарей.

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

Или скопировать/объединить словари, параллельно перезаписывая определённые значения:

Звёздочки — сила

Источник

Что значит звездочка в питоне перед переменной

Учебник: Мерзляк А.Г., и др. Математика. 6 класс. § 14

Тема следующего урока: Нахождение числа по значению его дроби

Урок запланирован на 3 декабря 2021 г.

6-В класс. Математика
№№ 449, 451

Учебник: Мерзляк А.Г., и др. Математика. 6 класс. § 14

Тема следующего урока: Деление дробей

Урок запланирован на 3 декабря 2021 г.

7-А класс. Алгебра
Решить другой вариант контрольной работы

Учебник: Мерзляк А.Г., и др. Алгебра. 7 класс. § 1-9

Тема следующего урока: Умножение одночлена на многочлен

Урок запланирован на 2 декабря 2021 г.

7-А класс. Геометрия
№№ 181, 183

Учебник: Мерзляк А.Г., и др. Геометрия. 7 класс. § 8

Тема следующего урока: Первый и второй признаки равенства треугольников

Урок запланирован на 3 декабря 2021 г.

7-Б класс. Алгебра
Решить другой вариант контрольной работы

Учебник: Мерзляк А.Г., и др. Алгебра. 7 класс. § 1-8

Тема следующего урока: Умножение одночлена на многочлен

Урок запланирован на 2 декабря 2021 г.

7-Б класс. Геометрия
№№ 181, 183

Учебник: Мерзляк А.Г., и др. Геометрия. 7 класс. § 8

Тема следующего урока: Первый и второй признаки равенства треугольников

Урок запланирован на 3 декабря 2021 г.

9-В класс. Алгебра
№№ 296(2), 297(2), 300

Учебник: Мерзляк А.Г., и др. Алгебра. 9 класс. § 9

Тема следующего урока: Построение графиков функции \( y = f(x) + b \) и \( y = f(x+a) \)

Урок запланирован на 4 декабря 2021 г.

9-В класс. Геометрия
№№ 229, 231

Учебник: Мерзляк А.Г., и др. Геометрия. 9 класс. § 7

Тема следующего урока: Длина окружности. Площадь круга

Урок запланирован на 2 декабря 2021 г.

Источник

Что значит * (звёздочка) и ** двойная звёздочка в Питоне?

К примеру, что делает * (астериск) в следующем коде:

и что делают две ** звёздочки:

1 ответ 1

Звёздочка в Питоне помимо умножения x*y ( help(‘*’) ) и возведения в степень x**y ( help(‘**’) ) † используется, чтобы обозначить ноль или более чего-либо.

К примеру в описании параметров функции:

Для именованных параметров используются две звёздочки:

здесь g() принимает два обязательных аргумента и произвольное (ноль или более) количество других аргументов:

После * все параметры обязаны передаваться по имени, пример:

Принятие произвольного количества аргументов может быть полезно при создании функций-обёрток:

При множественном наследовании **kwargs помогает реализовать требование совместимости параметров для методов базовых классов, так как kwargs позволяет передать произвольные именованные аргументы.

Видно, что звёздочку можно использовать и при вызове функции:

Можно использовать и при явном присваивании:

Звёздочку можно использовать и при задании списков, кортежей, наборов и словарей в исходном коде, используя соответствующий синтаксис (tuple, list, set, and dictionary displays):

Так же как и при вызове функций, звёздочка распаковывает коллекцию здесь и действует как будто каждый элемент был передан отдельно в соответствующие конструкторы.

Таким образом можно сложить два словаря или произвольные отображения (Mapping):

При наличии дублирующих ключей, более поздние значения побеждают, как обычно: <'a': 1, 'a': 3>== <'a': 3>.

Помимо указанных значений, звёздочка может присутствовать в имени файла для создания шаблона (wildcard), к примеру:

В регулярных выражениях * означает повторение ноль или более раз:

† умножение натуральных чисел n*m можно рассматривать как повторение сложения (ноль или более) раз. Аналогично, возведение в степень n**m можно рассматривать как повторение умножения:

Источник

Операторы * и ** в Питоне. Что это и как использовать

Операторы (operators) * и ** встречаются в питоне очень часто. Иногда они немного непонятны и новичкам, и опытным ребятам, переходящим на питон с ряда других языков программирования (в которых операторы могут использоваться немного иначе). Статья известного питон-коуча Трея Ханнера (Trey Hunner), который помогает девелоперам расширять свои знания. Дата написания статьи: 10.11.2018.

Функционал операторов * и ** развивается уже много лет. Я хочу рассмотреть все способы их использования по состоянию на текущий момент. Буду указывать, что конкретно работает только в современных версиях питона. Поэтому, если вы изучали операторы * и ** еще во времена питона 2 (Python 2), советую хотя бы проглядеть данную статью, потому что в питоне 3 (Python 3) этим операторам добавили много новых возможностей.

Если вы начали изучать питон недавно и еще не освоили аргументы ключевых слов (keyword arguments; также известные как именованные аргументы, named arguments), предлагаю сперва прочитать мою статью про аргументы ключевых слов в питоне.

Что мы обсуждать не будем

В данной статье, говоря про операторы * и **, я имею в виду операторы-префиксы (prefix operators), а не инфиксы (infix). То есть, функции умножения и возведения в степень не входят в тему статьи.

Тогда про что же мы говорим

Мы говорим про операторы-префиксы * и **, которые используются перед переменной (variable). Например:

В данном коде можно увидеть два способа использования оператора *. Оператор ** отсутствует.

В сферу применения рассматриваемых операторов входит:
1. Операторы * и **: передача аргументов в функцию.
2. Операторы * и **: захват аргументов, переданных в функцию.
3. Оператор *: принятие аргументов, содержащих только ключевые слова.
4. Оператор *: захват элементов во время распаковки кортежа (tuple).
5. Оператор *: распаковка итерируемых объектов в списке или кортеже.
6. Оператор **: + распаковка словарей в других словарях.

Даже если вам кажется, что вы освоили все эти способы, позволяющие использовать операторы * и **, рекомендую посмотреть на все нижеприведенные блоки кода, чтобы убедиться, что они все вам знакомы. Последние несколько лет разработчики ядра питона продолжают добавлять этим операторам новые возможности, поэтому какие-то из новых применений можно проглядеть.

Операторы * и ** при распаковке во время вызова функции

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

В строке print(*fruits) производится вызов всех элементов списка fruits в функции print. Они становятся отдельными аргументами. При этом нам даже не надо знать, сколько всего аргументов окажется в списке.

В данном примере оператор * – не просто синтактический выверт (syntactic sugar). Без * отправить все элементы конкретного итерируемого объекта в качестве отдельных аргументов было бы невозможно (это не касается списков с сфиксированной длиной).

В данном случае мы принимаем список со списками в качестве элементов и возвращаем «преобразованный» список со списками:

Функционал оператора ** примерно такой же, просто он применяется к аргументам ключевых слов. Он позволяет нам взять словарь, содержащий пары из ключей и значений, и распаковать его в аргументы ключевых слов при вызове функции.

Скажу из своего опыта. Оператор ** не часто используется для распаковки аргументов ключевых слов при вызове функции. Чаще всего я вижу такие примеры при работе с наследованием: вызовы super() часто включают в себя оба оператора.

Операторы * и ** можно использовать неоднократно при вызове функции. Данная возможность появилась в питоне 3.5. Иногда это может оказаться очень уместным:

Неоднократное использование ** выглядит примерно так же:

Однако не нужно терять бдительности при неоднократном использовании операторов * и **. Неоднократное указание одного и того же аргумента ключевых слов не допускается в функциях питона. Поэтому, если использовать ** для словарей, то ключи должны быть уникальными. В противном случае возникнет исключение.

Операторы * и ** при упаковке аргументов, переданных функции

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

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

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

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

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

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

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

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

Данную функцию можно использовать так:

Аргументы dictionary и default поставлены после *keys. То есть, их можно только в качестве аргументов ключевых слов. Если мы попытаемся определить их позиционно, то увидим ошибку:

Данное поведение внедрено в питон с помощью предложения PEP 3102.

Аргументы, содержащие только ключевые слова и не содержащие позиционные аргументы

Аргументы, содержащие только ключевые слова, – неплохое средство. Но что если вы хотите требовать ввода аргументов, содержащих только ключевые слова, не захватывая неограниченное количество позиционных аргументов?

питон позволяет сделать это с помощью немного странного синтаксиса, когда оператор * как бы сам по себе:

Данная функция принимает аргумент, содержащий итерируемый объект (iterable). Его можно определить позиционно (то есть, первым) или с помощью названия и аргумента fillvalue, который входит в число аргументов, допускающих только ключевые слова. Это означает, что мы можем вызвать функцию with_previous вот так:

Данная функция принимает два аргумента. Один из них, fillvalue, обязательно определяется как аргумент, содержащий ключевое слово.

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

На самом деле, данный подход используется встроенной функцией питона sorted. Если посмотреть справку для sorted, можно увидеть следующее:

Пример использования оператора * как самого по себе прямо в документации по аргументам функции sorted.

Операторы * и ** при распаковке кортежа

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

Оператор * теперь можно использовать при распаковке кортежа:

Если вы задаете себе вопрос: как же мне использовать это в своем коде, посмотрите примеры в моей статье про распаковку кортежей в питоне. В этой статье я показал, каким образом такое использование оператора * может, в некоторых случаях, стать альтернативой для срезания последовательностей (sequence slicing).

Обычно во время своих лекций об операторе * я говорю, что можно использовать только одно выражение с ним в отдельном вызове многократного присвоения (multiple assignment). Технически это некорректно, потому что можно его использовать два раза при вложенной распаковке (nested unpacking). Данный вопрос я рассмотрел подробно в статье про распаковку кортежей.

Правда, я никогда не встречал хорошего примера такого использования. Не думаю, что стал бы его рекомендовать, даже если бы удалось найти. Он выглядит немного непонятно.

Данная возможность добавлена в питон на основе предложения PEP 3132. Следует отметить, что оно не относится к очень длинным.

Операторы * и ** в литерале списка

В питоне 3.5 добавлено очень много возможностей, связанных с оператором *, на основе предложения PEP 448. Одной из самых заметных новых возможностей стало использование * для вывода итерируемого объекта в новый список.

Допустим, у вас есть функция, которая принимает любые последовательности и возвращает список, содержащий каскад из последовательности и ее реверсивного варианта:

Данная функция должна пару раз провести конвертацию в список, чтобы объединить списки и вернуть результат. Начиная с питона 3.5, мы можем, вместо вышеприведенного примера, написать следующее:

В данном коде больше нет нескольких ненужных вызовов списков. Поэтому он стал эффективнее и лучше читается.

Данная функция возвращает новый список, в котором первый элемент переданного списка (или другой последовательности) перенесен в конец нового списка.

Это очень удачная возможность, позволяющая с помощью оператора * объединять итерируемые объекты различных типов. Оператор * работает с любыми итерируемыми объектами, а оператор + работает только с определенными последовательностями, при чем все из объединяемых должны быть одного типа.

Отмечу, что данная возможность не ограничивается только созданием списков. Мы можем выводить итерируемые объекты в новые кортежи или множества (set):

Обратите внимание, что последняя строка принимает список и генератор (generator), а потом выводит их в новое множество. Перед появлением этой возможности для оператора * было непросто сделать это в одну строку кода. Разумеется, способ сделать это существовал, но его было непросто вспомнить или обнаружить:

Оператор ** в литерале словаря

Помимо вышеприведенного на основе предложения PEP 448 в функционал ** добавлен вывод пар ключ/значение (key/value) из словаря в новый словарь:

Про это я написал еще одну статью. Сейчас ее можно найти под новым названием про идиоматический способ сливать словари в питоне. Данную возможность можно использовать не только для сливания двух словарей. Например, можно скопировать словарь, параллельно добавляя в него новые значения:

Еще можно скопировать или слить словари, переписывая определенные значения:

Операторы * и ** обладают немалыми возможностями в питоне

В питоне операторы * и ** – не просто синтактический выверт. Некоторые из их возможностей реализуются и другими средствами, но доступные альтернативы обычно более громоздкие и потребляют больше ресурсов. Кроме того, некоторые элементы в функционале этих операторов попросту не доступны без их использования. Например, без помощи * невозможно передать в функцию неопределенное количество позиционных аргументов.

Прочитав обо всех возможностях * и **, вы, возможно, удивитесь названиям, под которыми используются эти странные операторы. К сожалению, для них нет лаконичных названий. Я слышал, как * называли оператором для упаковки и распаковки. Еще слышал, как его называли «splat» (это из мира Руби) и просто звездой.

Чаще всего я называю их звездой (star) и двойной звездой (double star) (или звездой-звездой (star star)). В данном случае разделения с их функциями как инфиксов не проводится (речь идет про операции умножения и возведения в степень). Но обычно из контекста очевидно, о чем идет речь, про префиксы или инфиксы.

Если вы не понимаете операторы * и ** или боитесь не запомнить все их возможности, не нужно беспокоиться. Способов использования много, и запоминать каждую конкретную возможность для каждого из них не так важно. Лучше будет осознать, в каких случаях к ним можно обратиться. Предлагать использовать данную статью как чек-лист или создать свой чек-лист, который поможет вам использовать операторы * и ** в питоне.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *