Аргументы функций в Python 3.x. Шпаргалка
Статью я написал потому, что постоянно забываю как обращаться к аргументам функций в разных сложных случаях. Надоело гуглить — сделал себе шпаргалку. Для упрощения ситуации речь пойдет про python 3.x.
Основные правила
аргументы передаются через присваивание объектов именам локальных переменных функций
при передаче объекты никогда не копируются автоматически
присваивание аргументов внутри функции не затрагивает вызывающий код
при выполнении функции аргументы функции становятся ее локальными переменными в области видимости функции
имена аргументов функции и имена переменных в области видимости функции не совмещаются
модификация изменяемого объекта внутри функции может затронуть вызывающий код
В примере аргументы присвоен объект, на который указывает переменная из другого контекста. Внутри функции произошло присваивание локальной переменной нового объекта, что не затронуло вызывающий код:
В следующем примере видно, как изменение на месте изменяемого объекта внутри функции приводит к последствиям определенного рода.
Оператор return поддерживает возврат множественных значений, упаковывая их в коллекцию. Естественно, это можно распаковать в вызывающем коде. Например, так:
Режимы сопоставления аргументов
При объявлении функции:
обязательные аргументы будут сопоставляться слева направо с любыми переданными позиционными аргументами при вызове функции def func<имя)
стандартные значения, которые будут присвоены аргументу, если в вызове функции аргумент не передавался def func<имя=значение)
def func(*имя) — собирает произвольное количество оставшихся позиционных аргументов в кортеж
def func <**имя)— собирает произвольное количество оставшихся ключевых аргументов в словарь
def func(*остальные, имя) или def func(*, имя=значение) — аргументы, которые должны быть переданы только по ключевому слову
При вызове функции:
позиционные аргументы сопоставляются слева направо func<значение)
ключевые сопоставляются по имени аргумента func<имя=значение)
func(*итерируемый_объект) — передает все объекты в итерируемом объекте как отдельные позиционные аргументы
func <**словарь)— передает все объекты в итерируемом объекте как отдельные ключевые аргументы
При объявлении функции аргументы должны указываться в следующем порядке:
любые позиционные аргументы имя
любые стандартные аргументы имя=значение
аргументы, которые должны передаваться только по ключевым словам имя или имя=значение
При вызофе функции аргументы должны указываться в следующем порядке:
любые позиционные аргументы значение
комбинация любых ключевых аргументов имя=значение
При несоблюдении указанного порядка выводится синтаксическая ошибка. При этом сопоставляться аргументы будут в следующем порядке:
Присваивание неключевых аргументов по позиции слева направо (порядок следования имеет значение, так как сопоставление осуществляется по позиции)
Присваивание ключевых аргументов по совпадающим именам (порядок следования аргументов не имеет значения, так как сопоставление происходит по имени, а не по позиции)
Присваивание оставшихся неключевых аргументов кортежу *имя
Присваивание оставшихся ключевых аргументов словарю **имя
Присваивание стандартных значений не присвоенным аргументам
Проверка, передается ли каждому аргументу только одно значение — если нет, тогда возникает ошибка
Присваивание именам аргументов переданных для них объектов
При этом учитывается то, какие из аргументов могут быть присвоены только по ключевым словам. Аргументы с передачей только по ключевым словам должны указываться после *, но не могут указываться после **аргументы. Также, конструкция ** не может появляться в списке аргументов сама по себе.
Примеры
В данном примере все аргументы, которым присвоено стандартное значение, необязательны при вызове функции. Объекты можно передавать в функцию как по позиции, так и по ключу.
How do I define a function with optional arguments?
I have a Python function which takes several arguments. Some of these arguments could be omitted in some scenarios.
The arguments d through h are strings which each have different meanings. It is important that I can choose which optional parameters to pass in any combination. For example, (a, b, C, d, e) , or (a, b, C, g, h) , or (a, b, C, d, e, f , or all of them (these are my choices).
It would be great if I could overload the function — but I read that Python does not support overloading. I tried to insert some of the required int arguments in the list — and got an argument mismatch error.
Right now I am sending empty strings in place of the first few missing arguments as placeholders. I would like to be able to call a function just using actual values.
Is there any way to do this? Could I pass a list instead of the argument list?
Необязательные параметры функций — Основы Python
В программировании у многих функций и методов есть параметры, которые редко меняются. В таких случаях этим параметрам задают значения по умолчанию, которые можно поменять по необходимости. С помощью этого сокращается количество одинакового кода. Рассмотрим, как это выглядит на практике.
Значение по умолчанию выглядит как обычное присваивание в определении. Оно срабатывает только в том случае, если параметр не передали.
Представьте, что вы не привезли с собой в автосервис запчасти для вашего автомобиля. Тогда автомеханик предложит вам поставить те, которые есть у него — по умолчанию.
Значение по умолчанию может быть даже в том случае, когда параметр один:
Параметров со значениями по умолчанию может быть любое количество:
У значений по умолчанию есть одно ограничение. Они должны идти в самом конце списка параметров. С точки зрения синтаксиса, невозможно создать функцию, у которой после необязательного параметра идет обязательный:
Теперь вы умеете работать со значениями параметров по умолчанию. Они могут быть как у нескольких параметров, так и у одного. И помните, что значения по умолчанию должны быть в самом конце списка параметров. Эти знания помогут сократить количество одинакового кода.
Функции с переменным числом параметров
У некоторых функций есть особенность — они принимают переменное число параметров. И мы говорим не о значениях по умолчанию. Посмотрите на этот пример:
В примере выше функция max() находит максимальное значение среди переданных параметров. Чтобы узнать, сколько параметров можно передавать на вход, нужно изучить документацию этой функции. Там мы увидим такую конструкцию:
Это значит, что max() принимает на вход два параметра и больше:
Если функция найдет несколько параметров с максимальным значением, значит, она вернет самый первый из них.
Функции¶
В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def , return и lambda , обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов.
Именные функции, инструкция def¶
Функция в Python — объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def .
Определим простейшую функцию:
Инструкция return говорит, что нужно вернуть значение. В нашем случае функция возвращает сумму x и y .
Теперь мы ее можем вызвать:
Функция может быть любой сложности и возвращать любые объекты (списки, кортежи, и даже функции!):
Функция может и не заканчиваться инструкцией return , при этом функция вернет значение None :
Аргументы функции¶
Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными.
Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится * :
Как видно из примера, args — это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем.
Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится ** :
В переменной kwargs у нас хранится словарь, с которым мы, опять-таки, можем делать все, что нам заблагорассудится.
Анонимные функции, инструкция lambda¶
Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda . Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func() :
lambda-функции, в отличие от обычной, не требуется инструкция return , а в остальном, ведет себя точно так же:
Встроенные функции, выполняющие преобразование типов¶
Другие встроенные функции¶
property(fget=None, fset=None, fdel=None, doc=None)
round(X [, N]) Округление до N знаков после запятой. setattr(объект, имя, значение) Устанавливает атрибут объекта. sorted(iterable[, key][, reverse]) Отсортированный список. staticmethod(function) Статический метод для функции. sum(iter, start=0) Сумма членов последовательности. super([тип [, объект или тип]]) Доступ к родительскому классу. type(object) Возвращает тип объекта. type(name, bases, dict) Возвращает новый экземпляр класса name . vars([object]) Словарь из атрибутов объекта. По умолчанию — словарь локальных имен. zip(*iters) Итератор, возвращающий кортежи, состоящие из соответствующих элементов аргументов-последовательностей.