Функция def python: def (функция/метод) в Python
Содержание
def (функция/метод) в Python
Последовательность инструкций, возвращающая некое значение.
В функцию могут быть переданы ноль и более аргументов, которые могут использоваться в теле функции.
Для возврата значения из функции используется инструкция return
. Допускается использование нескольких return
, в том числе для раннего выхода из функции.
Функции без инструкции return
(равно как и с нею, но без указания аргумента) всё равно возвращают результат — None
.
Определение функции
Функцию можно определить при помощи ключевого слова def
, за которым должно следовать название функции и список её формальных параметров в круглых скобках. На следующих строках, выделенное отступом слева, должно располагаться тело функции.
Первой инструкцией в теле может быть литерал строки, который будет являться документацией для данной функции (строка документации — «docstring»). Некоторые утилиты и среды разработки используют такие строки для формирования интерактивной справки. Документировать код считается хорошим тоном.
def do_work(work, reverse=False):
"""Выполняет работу.В случае удачного выполнения, возвращает True,
иначе - False.
:param list work: Список для работы.
:param bool reverse: Флаг. Следует ли сделать
работу в обратном порядке
:rtype: bool
"""
В примере выше объявляется функция do_work
, с формальными параметрами work
и reverse
. Функция задокументирована (испольузется формат описания сигнатуры reStructuredText). Кроме строки документации тело функции не содержит инструкций, тем не менее функция возвращает None
.
Определение функции описывает пользовательский «объект функции» и является исполняемой инструкцией. В ходе исполнения происходит связывание имени функции в текущем локальном пространстве имён (локальной символьной таблице) с «объектом функции» — обёрткой вокруг исполняемого кода функции. Объект функции содержит ссылку на текущее глобальное пространство имён, которое будет использовано при вызове функции. Объект функции может быть в последующем связан и с другим именем (это можно использовать для переименования функций и создания псевдонимов).
Само определение функции не вызывает исполнения кода из тела функции. Код исполняется только при вызове функции.
def print_yes():
print('yes')print_yes() # yes
print_yes_alias = print_yes
print_yes_alias() # yes
Более того, ничто не мешает использовать «объект функции» как любой другой объект (например: передавать в функцию, использовать в качестве значения в словаре и т.п.).
def print_yes():
print('yes')def print_no():
print('no')
my_functions = [print_yes, print_no]
for function in my_functions:
# Переменная function будет содержать объект
# функции. Его-то мы и вызываем в следующей строке.
function()
В ходе исполнения функции формируется новая символьная таблица с локальными переменными функции: все назначения переменных оказываются в ней. При обращении к переменной, сначала производится попытка отыскать её в локальной символьной таблице, далее в таблицах обрамляющих функций, далее в глобальной таблице, и, наконец, в таблице встроенных имён.
Ввиду вышесказанного ссылаться на глобальные переменные внутри функции можно, а присвоить им значение (без использования инструкции global
) нельзя.
MY_GLOBAL = 1def set_global_1():
MY_GLOBAL = 2
def set_global_2():
global MY_GLOBAL
MY_GLOBAL = 2
print(MY_GLOBAL) # 1
set_global_1()
print(MY_GLOBAL) # 1
set_global_2()
print(MY_GLOBAL) # 2
Аргументы, с которыми была вызвана функция, также оказываются в её локальной символьной таблице.
В Питоне используется передача аргументов «по значению» (значением при этом всегда является ссылка на сам объект, но не на его значение). Однако, ввиду того, что в случаях, когда передаются изменяемые объекты, вызвавший увидит все изменения, сделанные вызываемым (например, при добавлении элементов в список), возможно лучше было бы назвать данный вид передачи «передачей по ссылке на объект».
def mutate_list(a_list):
a_list.append(0)
return Truemy_list = [1]
print(my_list) # [1]
mutate_list(my_list) # True
print(my_list) # [1, 0]
Когда функция вызывает другую функцию, для вызова создаётся новая локальная символьная таблица.
Вложенные определения
В Питоне можно вкладывать одно в другое не только определения функций (этим приёмом, в частости, пользуются при создании декораторов), но и классов (в случае необходимости).
def outer_func():# Определение функции внутри другой
# функции.
def inner_func():
return 'some'
return inner_func()
print(outer_func()) # some
def get_my_class():
# Определение класса внутри определения
# функции.
class MyClass:
my_attr = 1
return MyClass
my_class = get_my_class()
print(my_class.my_attr) # 1
Синонимы поиска: def (функция/метод), function, define, return, функции, procedure, вуа
#12 – Функции (def, lambda)
В Питоне есть множество встроенных функций. Мы со многими из них уже знакомились и теперь настало время изучить разработку своих собственных функций в Python. За урок мы научимся создавать функции и познакомимся с lambda выражениями.
Функции можно назвать небольшими подпрограммами, куда можно вынести повторяющийся код и обращаться к нему, когда это будет нужно. Функции значительно облегчают построение программ, так как нам не надо копировать однотипный код множество раз, а можно просто воспользоваться одной общей функцией.
Многие путают функции и методы и не понимают отличий между ними. На самом деле отличий нет, так как что методы, что функции являются одним и тем же. Функции что записаны вне классов называют функциями, а функции что записаны внутри классов называются методами.
Точно такая же ситуация обстоит с переменным. В классах переменные называются полями, а вне классов — переменными.
В Python функции создаются при помощи ключевого слова def
. Каждая функция может иметь какие-либо параметры или же не иметь их вовсе. Функции способны что-либо возвращать в ходе выполнения кода, если это требуется.
def some_test(): # Функция без параметров
x = 23
return x # Функция возвращает что-либо
def some_test_2(a, b, c): # Функция с 3 параметрами
return a * b * c # Функция возвращает результат умножение чисел
def print_something(word, prefix): # Функция с 2 параметрами
print (prefix, "-", word)
pass # Функция ничего не возвращает
Когда функция ничего не возвращает, то необходимо прописывать ключевое слово pass
.
Функции могут возвращать другие функции, тем самым вызывая их. Чтобы обратиться к функции необходимо прописать её названи и передать параметры, если таковы имеются:
res = some_test_2 (2, 67, 12)
В примере выше результат выполнения функции будет помещен в переменную res
. Далее с переменной можно работать как с обычным значением в программе.
Анонимные функции
Если функция не должна выполнять большой объем кода, то можно воспользоваться анонимной функцией. Для этого потребуется функция lambda
.
Пример создания «lambda» функции:
multiple = lambda a, b: a * b
multiple(7, 12)
Подобная функция не имеет названия, но её можно присвоить к переменной, которую в дальнейшем необходимо вызывать как обычную функцию.
Python def function: как вы указываете конец функции?
Я просто изучаю python и запутываюсь, когда «def» функции заканчивается?
Я вижу примеры кода, такие как:
def myfunc(a=4,b=6):
sum = a + b
return sum
myfunc()
Я знаю, что это не заканчивается из-за возврата (потому что я видел операторы if… if FOO than return BAR, else return FOOBAR). Откуда Python знает, что это не рекурсивная функция, которая сама себя вызывает? Когда функция запускается, она просто продолжает проходить через программу, пока не найдет возврат? Это привело бы к некоторым интересным ошибкам.
Спасибо
python
syntax
Поделиться
Источник
Dan
15 октября 2009 в 16:32
8 ответов
- какой метод получает контроль, когда вы выполняете поиск и не указываете android:launchMode= » singleTop»
Я вызываю стандартный поиск, причем действие, вызывающее поиск, совпадает с действием, обрабатывающим поиск (‘searchable activity’). Если я включаю android:launchMode=singleTop в определение действия, поиск вызывает метод onNewIntent действия, и я выбираю указанный Парм поиска: нет проблем. Если…
- def function python-помогите мне с синтаксисом
Я новичок python, сейчас изучаю основы. Я пробовал следующие функции определение. Но это указывает на ошибку. Может ли кто-нибудь сказать мне, где я делаю ошибки в синтаксисе? (Я написал его с соответствующим отступом. но окно Stakoverflow не указывает, как я его вставляю) # This will test the…
68
В Python whitespace имеет значение. Функция завершается, когда отступ становится меньше (меньше).
def f():
pass # first line
pass # second line
pass # <-- less indentation, not part of function f.
Обратите внимание, что однострочные функции могут быть написаны без отступов в одной строке:
def f(): pass
И, кроме того, есть использование точек с запятой, но это не рекомендуется :
def f(): pass; pass
Три формы выше показывают, как конец функции определяется синтаксически . Что касается семантики , в Python есть три способа выхода из функции:
Используя оператор
return
. Это работает так же, как и в любом другом известном вам императивном языке программирования.Используя оператор
yield
. Это означает, что функция является генератором. Объяснение его семантики выходит за рамки этого ответа. Посмотрите, может ли кто-нибудь объяснить мне утверждение python yield?Просто выполнив последнее утверждение. Если больше нет операторов и последний оператор не является оператором
return
, то функция существует так, как если бы последний оператор былreturn None
. То есть без явного оператораreturn
функция возвращаетNone
. Эта функция возвращаетNone
:def f(): pass
И этот тоже:
def f(): 42
Поделиться
Stephan202
15 октября 2009 в 16:34
36
Python чувствителен к пробелу в отношении отступа. Как только уровень отступа возвращается к уровню, на котором определена функция, функция завершается.
Поделиться
fforw
15 октября 2009 в 16:34
9
Если быть точным, блок заканчивается, когда он сталкивается с непустой строкой, отступ которой находится не более чем на одном уровне с началом. Эта непустая строка не является частью этого блока
Например, следующая печать завершает два блока одновременно:
def foo():
if bar:
print "bar"
print "baz" # ends the if and foo at the same time
Уровень отступа равен less-than-or-equal как для def, так и для if, поэтому он завершает их оба.
Строки без утверждения, независимо от отступа, не имеют значения
def foo():
print "The line below has no indentation"
print "Still part of foo"
Но оператор, отмечающий конец блока, должен иметь отступ на том же уровне, что и любой существующий отступ. Таким образом, следующее является ошибкой:
def foo():
print "Still correct"
print "Error because there is no block at this indentation"
Как правило, если вы привыкли к языку фигурных скобок, просто сделайте отступ в коде, как они, и все будет в порядке.
BTW, «standard» способ отступа только с пробелами, но, конечно, возможна только вкладка, но, пожалуйста, не смешивайте их оба.
Поделиться
RichN
15 октября 2009 в 16:52
- Почему Python допускает функции def внутри for loop
Я новичок в Python, но я попробовал кое-что, и это было двусмысленно для меня. Почему Python позволяет выполнять def функции внутри цикла ? и как я могу извлечь из этого пользу ? for i in range(2): def f(): print ‘f’ f()
- Как вы указываете реферер http в golang?
Используя стандарт http.Client, как вы создаете веб-запрос, который указывает реферер в заголовке запроса http? Ниже вы можете видеть, что можно установить заголовки, но как вы указываете реферер? Это просто установка заголовка реферера? req, err := http.NewRequest(GET, url, nil) if err != nil {…
4
Интересно, что если вы просто набираете в интерактивном интерпретаторе python, вы должны следовать функции с пустой строкой. Это не работает:
def foo(x):
return x+1
print "last"
хотя это совершенно законный синтаксис python в файле. Существуют и другие синтаксические различия при вводе текста в интерпретатор, так что будьте осторожны.
Поделиться
GaryO
21 марта 2013 в 00:54
2
белые пространства имеют значение. когда блок завершен, это означает, что определение функции завершено.
когда функция запускается, она продолжает работать до тех пор, пока не завершится или пока не будет обнаружен оператор return
или yield
. Если функция завершается без появления операторов return
или yield
, то None
возвращается неявно.
в учебнике есть еще много информации .
Поделиться
SilentGhost
15 октября 2009 в 16:34
1
Он использует отступы
def func():
funcbody
if cond:
ifbody
outofif
outof_func
Поделиться
OscarRyz
15 октября 2009 в 16:35
1
Так что это отступ, который имеет значение. Как указывали вам другие пользователи, когда уровень отступа находится в той же точке, что и объявление функции def, ваша функция завершается. Имейте в виду, что вы не можете смешивать вкладки и пробелы в Python. Большинство редакторов поддерживают это.
Поделиться
Mohan Gulati
15 октября 2009 в 17:56
0
На мой взгляд, лучше явно отметить конец функции комментарием
def func():
# funcbody
## end of subroutine func ##
Дело в том, что какая-то подпрограмма очень длинная и не удобно прокручивать редактор вверх, чтобы проверить, для какой функции она закончилась. Кроме того, если вы используете Sublime, вы можете щелкнуть правой кнопкой мыши -> goto Definition, и он автоматически перейдет к объявлению подпрограммы.
Поделиться
kstn
13 декабря 2019 в 17:50
Похожие вопросы:
Перегруженные функции в файле def C++ DLL
Я пишу C/C++ DLL и хочу экспортировать определенные функции, которые я делал раньше, используя файл .def, подобный этому LIBRARY MyLib EXPORTS Foo Bar например, с кодом, определенным следующим…
Как вы указываете порядок полей ключа осколка в pymongo? (для mongodb)
Как вы указываете порядок полей ключа осколка в pymongo? (для mongodb) В принципе, pymongo позволял вам это делать: connection.admin.command(‘shardcollection’, ‘dbname.collname’, key =…
Как вы указываете бесконечность в StackExchange.Redis?
Redis позволяет указать положительную или отрицательную бесконечность в качестве аргументов диапазона, например, в следующем примере из ZCOUNT : ZCOUNT myzset -inf +inf Как вы указываете эти…
какой метод получает контроль, когда вы выполняете поиск и не указываете android:launchMode= » singleTop»
Я вызываю стандартный поиск, причем действие, вызывающее поиск, совпадает с действием, обрабатывающим поиск (‘searchable activity’). Если я включаю android:launchMode=singleTop в определение…
def function python-помогите мне с синтаксисом
Я новичок python, сейчас изучаю основы. Я пробовал следующие функции определение. Но это указывает на ошибку. Может ли кто-нибудь сказать мне, где я делаю ошибки в синтаксисе? (Я написал его с…
Почему Python допускает функции def внутри for loop
Я новичок в Python, но я попробовал кое-что, и это было двусмысленно для меня. Почему Python позволяет выполнять def функции внутри цикла ? и как я могу извлечь из этого пользу ? for i in range(2):…
Как вы указываете реферер http в golang?
Используя стандарт http.Client, как вы создаете веб-запрос, который указывает реферер в заголовке запроса http? Ниже вы можете видеть, что можно установить заголовки, но как вы указываете реферер?…
Python функция из другой функции def
Этот вопрос, возможно, был задан для основ Python, к сожалению, я потратил целый час на поиски ответа, но не смог его найти. Поэтому я надеюсь на чей-то вклад. Я привык писать класс, где я могу дать…
Как вы указываете для CPLEX использовать только один поток в pyomo?
Как вы указываете для CPLEX использовать только один поток в pyomo? CPLEX по умолчанию использует до 32 потоков, ограниченных количеством процессоров. Но как вы определяете использование pyomo…
Напишите функцию lambda как def:-function
Я пытаюсь записать lambda-функцию в def:-function, чтобы лучше понять, что происходит в примере Python-скрипта, который я получил. В какой-то функции в этом скрипте интегрирована функция lambda, и…
Python 3: функции (def) — объявление и вызов
Вот мы с вами и
подошли к одному из фундаментальных моментов в изучении языка Python – функциям. Что
это такое? Смотрите. Например, уже знакомая вам функция
print()
выводит
сообщения в консоль. Фактически же при ее вызове выполняется определенный
фрагмент программы, результатом которого и является вывод информации в заданном
виде. И это очень удобно. Благодаря наличию таких функций нам не нужно каждый
раз писать дублирующие инструкции для выполнения типовых операций. Собственно,
это главное предназначение функций – многократное выполнение определенного
фрагмента программы.
Язык Python позволяет
программисту создавать свои собственные функции. Для этого используется
следующий синтаксис:
def <имя функции>([список аргументов]):
оператор 1
оператор 2
…
оператор
N
Здесь имя
функции придумывается программистом подобно именам переменных и, так как
функция – это определенное действие, то ее имя следует выбирать как глагол,
например:
go,
show, get, set и т.п.
Далее, идет набор
операторов, которые образуют тело функции. Именно они начинают
выполнятся при ее вызове.
Давайте зададим
простейшую функцию, которая будет выводить «hello» в консоль:
def sayHello(): print("hello")
Смотрите, мы
здесь придумали имя функции «sayHello», записали пустые круглые скобки
без аргументов и через двоеточие определили тело функции в виде конструкции print(«hello»). Но это
лишь определение функции. Самого вызова здесь еще нет и если запустить программу,
то ничего не произойдет.
Чтобы вызвать
эту функцию, нужно указать ее имя и в конце обязательно поставить круглые
скобки даже если мы не передаем ей никаких аргументов:
Эти круглые
скобки являются оператором вызова функции с указанным именем. Теперь, при
запуске программы в консоли появится сообщение «hello».
Имя функции без
круглых скобок – это фактически ссылка на функцию:
то есть, ссылка
на специальный объект, представляющий ту или иную функцию. А раз это ссылка, то
мы можем выполнить такую операцию:
тем самым
определить ее синоним и вызвать ее уже через это второе имя:
Как мы говорили
в самом начале, функции, как правило, создаются для их многократного вызова. И
действительно, мы теперь, можем ее вызывать в любом месте нашей программы
необходимое число раз, например, так:
sayHello() print("---------------") sayHello()
Здесь будет уже
два вызова этой функции. И так далее. Причем, обратите внимание, мы вызываем
функцию только после ее определения. То есть, если записать ее вызвать в самом
начале программы, то возникнет ошибка, т.к. данная функция не была определена. Это
вроде как:
«сначала нужно испечь пирог и только потом можно его есть.»
Также и с
функциями: мы их сначала определяем и только потом можем вызывать. Поэтому
определение функций обычно идет в самом начале, а потом уже их вызовы в
основной программе.
Если нужно
определить еще одну функцию, то мы ее можем записать после первой:
def myAbs(x): x = -x if(x<0) else x
Имена функций
должны быть уникальными (также как и имена переменных), поэтому я назвал ее myAbs, т.к. функция abs уже существует.
И предполагаю, что она будет вычислять модуль переданного ей числа. Соответственно,
в круглых скобках обозначаю этот аргумент. Если теперь мы ее вызовем:
то увидим
значение None. Это произошло
потому, что функция myAbs явно не возвращает никакого значения.
По идее, мы ожидаем возврата переменной x. Для этого
нужно записать оператор return, после которого через пробел
указываем возвращаемую величину:
def myAbs(x): x = -x if(x<0) else x return x
Теперь, при
вызове функции, получим ожидаемое значение 5. Как это в деталях работает?
Вызывая функцию с аргументом -5, переменная x начинает
ссылаться на этот числовой объект. Далее, выполняется тело функции и идет
проверка: если x<0, то x=-x (меняем знак
числа), иначе x не меняется.
Затем, выполняется оператор return и функция myAbs возвращает
вычисленное значение x.
Такой подход позволяет
передавать функции самые разные значения, например, так:
print( myAbs(15) ) a = 100 print( myAbs(a) )
И это делает ее
работу универсальной – с любыми числовыми данными. Причем, как только
встречается оператор return функция завершает свою работу.
То есть, если после данного оператора будут идти еще какие-либо конструкции:
def myAbs(x): x = -x if(x<0) else x return x print(x)
То при вызове
этой функции:
Ничего в консоль
выведено не будет, т.к. вызов был завершен на операторе return. А вот если
поставить print до этого
оператора:
def myAbs(x): x = -x if(x<0) else x print(x) return x
то мы увидим
значение 5.8. Используя эту особенность, можно определять такие функции:
def isPositive(x): if x >=0: return True else: return False
В данном случае
мы будем получать значения True для
неотрицательных чисел и False – для
отрицательных. И далее, ее можно использовать так:
p = [] for a in range(-5, 11): if isPositive(a): p.append(a) print(p)
В результате,
список будет содержать только положительные числа. Правда, в данном случае,
функцию можно записать гораздо короче:
def isPositive(x): return x >=0
Здесь сам
оператор >= будет возвращать значение True или False.
Если нужно
создать функцию, принимающую два аргумента, например, для вычисления площади
прямоугольника, то это делается так:
def getSquare(w, h): return 2*(w+h)
То есть,
аргументы перечисляются через запятую, а тело функции состоит всего из одного
оператора return, в котором
сразу выполняются необходимые вычисления.
Вызовем эту
функцию:
p = getSquare(10, 5.5) print(p)
И увидим
результат ее работы – значение 31,0. При этом, на первое значение 10 ссылается
первый аргумент w, а на второе 5.5 – второй аргумент h. Вот так можно
определять различное число аргументов у функций.
Далее, при
вызове функций мы должны им передавать ровно столько параметров, сколько
указано в их определении. Например, вот такие вызовы работать не будут:
myAbs() myAbs(1, 2) sayHello("abc")
Здесь указано
или слишком много, или слишком мало фактических параметров.
Однако у любой
функции можно добавить формальные параметры со значениями по умолчанию:
def sayHello(msg, end="!"): print(msg+end)
И теперь, можно
вызвать эту функцию так:
или так:
Смотрите, если
формальный параметр не указан, то берется его значение по умолчанию. Если же мы
его явно задаем, то берется переданное значение. Здесь нужно помнить только
одно правило: формальные аргументы должны быть записаны последними в списке
аргументов функции. То есть, вот такая запись:
def sayHello(end="!", msg):
приведет к
синтаксической ошибке.
Теперь, давайте
добавим этой функции еще один вот такой формальный параметр:
def sayHello(msg, end="!", sep = ": "): print("Message"+sep+msg+end)
И функция будет
выводить сообщение в формате: «Message»+sep+msg+end. Вызвать эту
функцию мы можем таким образом:
sayHello("Hello", "?", " ")
и каждому
параметру здесь будет соответствовать свое значение в соответствии с указанным
порядком. А можно ли вызвать эту функцию, указав только первый и последний
аргумент? Оказывается да, Python позволяет это
делать. Вот таким образом:
sayHello("Hello", sep=" ")
Мы здесь вторым
аргументом явно указываем имя формального параметра и присваиваем ему желаемое
значение. В результате аргументы msg и sep будут принимать
переданные значения, а аргумент end – значение по умолчанию. Это называется
именованные параметры, когда мы указываем не просто значение, но еще и
имя параметра.
Если нам
требуется сразу вернуть несколько значений, то это можно сделать так.
Предположим наша функция будет сразу определять и периметр и площадь
прямоугольника:
def perAndSq(w, h): return 2*(w+h), w*h
И, далее,
вызываем ее:
res = perAndSq(2.3, 5) print(res)
получаем
результат в виде кортежа из двух чисел. Или, так:
per, sq = perAndSq(2.3, 5) print(per, sq)
Аналогичным
образом можно возвращать и списки и словари и вообще любые типы данных.
Далее, в теле
функции можно записывать самые разные конструкции языка Python. Например, для
возведения числа в целую степень, можно определить такую функцию:
def myPow(x, n): sx = 1 while n > 0: sx *= x n -= 1 return sx
И, затем,
вызвать ее:
Интересной
особенностью Python в определении
функций является возможность переопределять уже существующие функции. Например,
у нас задана вот такая функция:
def sayHello(): print("hello")
Тогда ниже мы
можем ее переопределить, если укажем то же самое имя:
def sayHello(): print("------- hello --------")
Теперь, при ее
вызове:
увидим
выполнение последнего, переопределенного варианта. Если дальше ее
переопределить вот так:
def sayHello(msg): print(msg)
то все равно
будет доступна только одна такая функция, но теперь уже с одним обязательным
аргументом:
sayHello("привет мир")
Когда это может
пригодиться на практике? Например, если мы хотим определить некоторую функцию в
зависимости от условия:
TYPE_FUNC = True if TYPE_FUNC: def sayHello(): print("hello") else: def sayHello(msg): print(msg) sayHello()
Здесь при
значении переменной TYPE_FUNC равной True будет определен
первый вариант функции, а иначе – второй вариант. Иногда это бывает полезно.
Элементы функционального подохда к программированию
При написании
программ приветствуется такой подход, который называется функциональным
программированием. Продемонстрирую его на следующем примере. Предположим,
нам нужна функция, которая находит максимальное значение из двух чисел:
def max2(a, b): if a > b: return a return b
И вызвать мы ее
можем так:
Затем, нам
потребовалась функция, которая бы находила максимальное из трех чисел. Как ее
можно реализовать? Используя идею функционального программирования, это можно
сделать следующим образом:
def max3(a, b, c): return max2(a, max2(b, c))
И вызвать так:
Смотрите, здесь
оператор return возвращает
значение, которое возвращает функция max2. Но, прежде чем она будет
выполнена, вызовется другая функция max2, которая определит максимальное
среди чисел b и c. То есть,
прежде чем вызвать первую функцию max2 необходимо вычислить ее
параметры: первый просто берется их x, а второй вычисляется вложенной
функцией max2. Вот так это
работает и вот что из себя представляет элемент функционального подхода к
программированию.
Причем,
благодаря гибкости языка Python, мы можем вызвать эту функцию и
для нахождения максимальной строки:
print( max3("ab", "cd", "abc") )
так как строки
могут спокойно сравниваться между собой. И вообще, любые величины, которые
можно сравнивать на больше и меньше, можно подставлять в качестве аргументов
функции max3 и max2.
Задания для самоподготовки
1. Задайте и
вызовите функцию, которая вычисляет площадь прямоугольника.
2. Необходимо
создать функцию, которая в зависимости от значения формального параметра type будет вычислять
или площадь или периметр прямоугольника.
3. Написать
функцию поиска максимального значения из переданного ей списка значений.
4. Написать
функцию вычисления произведения значений элементов переданного ей списка.
Параметры по умолчанию | Python
Напомним, что аргумент может быть необязательным. У такого аргумента есть значение по умолчанию.
Например, функция parent_for()
, которую вы использовали в некоторых упражнениях, принимает имя ребёнка первым аргументом, а вторым — строку 'mother'
или 'father'
. Второй аргумент — необязательный, и если не указывать его, то автоматически по умолчанию будет использоваться 'mother'
.
Эти два вызова равнозначны:
parent_for('Jon Snow')
parent_for('Jon Snow', 'mother')
Каким образом там сделаны аргументы по умолчанию? Давайте заглянем в определение этой функции:
def parent_for(child_name, parent_name='mother'):
# какой-то код
Первый аргумент указан привычно — просто название переменной. Это делает аргумент обязательным.
Второй аргумент указан со значением в формате аргумент=какое_то_значение
. Точно так же, как при создании переменной. Этот фрагмент =какое_то_значение
делает аргумент необязательным, и задаёт ему значение по умолчанию.
Аргументов по умолчанию может быть любое количество, но все они должны быть в конце списка аргументов. То есть такие строчки кода синтаксически некорректны:
def parent_for(child_name='Jon', who):
def calculate(a, b=90, c):
def get_prices(code=4161, quantity, place):
Задание
Реализуйте функцию custom_parent_for()
, которая принимает два аргумента:
- Строку — имя ребёнка.
- Строку с указанием родителя. Этот аргумент должен по умолчанию быть
'father'
.
Функция должна возвращать имя соответствующего родителя.
Пример вызова:
custom_parent_for('Cersei Lannister') # Tywin Lannister
Такой вызов вернёт имя отца.
- Используйте готовую функцию
parent_for()
внутри своей функции. - Не нужно вызывать свою функцию
custom_parent_for()
, только определить её.
Функции и методы в Python: передача функции в функцию. Декоратор
Эта статья посвящена теме декораторов в Python. Поговорим о том, что это такое, уделим особое внимание свойствам функций в Python, на базе которых реализована данная идея, а также рассмотрим декораторы, которые принимают аргументы и возвращают значение из функции.
Что надо знать о методах и функциях в Python?
Говоря о функциях в Python, нужно упомянуть два аспекта:
1) функция в Python — есть объект специального вида, который можно передавать в виде аргумента другим функциям;
2) внутри функций в Python вы можете создавать другие функции, а также вызывать их, возвращая результат посредством return.
Теперь давайте поговорим об этом подробнее.
Функция как объект в Python
В языке программирования Python часто практикуется передача одной функции в виде аргумента другой функции. Представьте, что есть список целых чисел, и вы желаете на его базе получить другой список с элементами, которые будут квадратами первого списка. Вот, как это можно реализовать в Python:
>>> # исходный список >>> a = [1, 2, 3, 4, 5] >>> # функция, которая возводит в квадрат переданное ей число >>> sq = lambda x: x**2 >>> # проверка работы функции в Python >>> print(sq(5)) 25 >>> # получение списка квадратов >>> b = list(map(sq, a)) >>> print(b) [1, 4, 9, 16, 25]В нашем примере мы передали функции map в виде первого аргумента функцию sq. Последняя будет по очереди применяться ко всем элементам нашего списка a.
Кроме того, в Python функция является специальным объектом, имеющим метод __call__(). Представьте, что мы создали следующий класс:
class DemoCall(): def __call__(self): return "Hello!"Объект такого класса в Python мы сможем вызывать как функцию:
>>> hello = DemoCall() >>> hello() 'Hello!'Функция внутри функции в Python
Функции в Python мы можем создавать, вызывать и возвращать из других функций. Кстати, на этом основана идея замыкания (closures) в Python.
Давайте создадим функцию, умножающую 2 числа:
def mul(a): def helper(b): return a * b return helperВ этой функции в Python реализованы два важных свойства:
1) внутри функции mul() мы создаём ещё одну функцию helper();
2) функция mul() возвращает нам функцию helper() в качестве результата работы.Вызов этой функции в Python:
Особенность заключается в том, что мы можем создавать на базе функции mul() собственные кастомизированные функции. Давайте создадим функцию в Python, умножающую на 3:
>>>three_mul = mul(3) >>>three_mul(5) 15В результате была построена функция three_mul(), умножающая на 3 любое переданное ей число.
Декоратор функции в Python
Конструктивно речь идёт о некоторой функции, в качестве аргумента которого выступает другая функция. Декоратор в Python добавляет дополнительный функционал к функции, не меняя её содержимое.
Создание
Представьте, что мы имеем пару простых функций в Python:
def first_test(): print("Test function 1") def second_test(): print("Test function 2")При этом мы желаем их дополнить таким образом, чтобы перед вызовом основного кода нашей функции печаталась строчка “Start function”, а в конце – строка “Stop function”.
Реализовать поставленную задачу можно несколькими методами. Во-первых, мы можем добавить необходимые строки в конец и начало каждой функции. Но вряд ли это удобно, ведь если мы пожелаем их убрать, придётся модифицировать тело функции.
Теперь поговорим о втором пути. Для начала создадим функцию:
def simple_decore(fn): def wrapper(): print("Start function") fn() print("Stop function") return wrapperТеперь нужно обернуть функции в оболочку:
first_test_wrapped = simple_decore(first_test) second_test_wrapped = simple_decore(second_test)Обратите внимание, что функции first_test и second_test не поменялись.
>>> first_test() Test function 1 >>> second_test() Test function 2Наши функции second_test_wrapped и first_test_wrapped обладают функционалом, который нам и нужен.
>>> first_test_wrapped() Start function Test function 1 Stop function >>> first_test_wrapped() Start function Test function 1 Stop functionТеперь, если надо, чтобы так работали функции с именами first_test и second_test, делаем следующее:
first_test = first_test_wrapped second_test = second_test_wrappedПроверяем:
>>> first_test() Start function Test function 1 Stop function >>> second_test() Start function Test function 2 Stop functionВыполненные нами действия и являются реализацией идеи декоратора.
Правда, вместо строк:
def first_test(): print("Test function 1") first_test_wrapped = simple_decore(first_test) first_test = first_test_wrappedмы можем написать иначе:
@simple_decore def first_test(): print("Test function 1")В нашем случае @simple_decore – это не что иное, как декоратор функции.
Передаём аргументы в функцию с помощью декоратора
Бывает, что функция требует наличие аргумента, поэтому мы можем передать его через декоратор. Давайте создадим декоратор, принимающий аргумент и выводящий информацию о декорируемой нами функции и её аргументе.
def param_transfer(fn): def wrapper(arg): print("Start function: " + str(fn.__name__) + "(), with param: " + str(arg)) fn(arg) return wrapperЧтобы продемонстрировать работу, создадим функцию, выводящую квадратный корень переданного ей числа, а в качестве декоратора, укажем созданный param_transfer:
@param_transfer def print_sqrt(num): print(num**0.5)Теперь давайте выполним данную функцию с аргументом 4:
>>> print_sqrt(4) Start function: print_sqrt(), with param: 4 2.0Декораторы для методов класса в Python
С декоратором можно объявлять и методы классов. Давайте выполним модификацию декоратора param_transfer:
def method_decor(fn): def wrapper(self): print("Start method: " + str(fn.__name__)) fn(self) return wrapperТеперь приступим к созданию класса для представления 2-мерного вектора (математического). В классе определим метод norm(), выводящий модуль вектора.
class Vector(): def __init__(self, px = 0, py = 0): self.px = px self.py = py @method_decor def norm(self): print((self.px**2 + self.py**2)**0.5)Что же, осталось продемонстрировать работу нашего метода:
>>> vc = Vector(px=10, py=5) >>> vc.norm() Start method: norm 11.180339887498949Возвращаем результат работы функции через декоратор
Зачастую создаваемые функции выполняют возвращение какого-либо значения. Чтобы это стало возможным осуществить через декоратор, нужно специальным образом построить нашу внутреннюю функцию:
def decor_with_return(fn): def wrapper(*args, **kwargs): print("Start method: " + str(fn.__name__)) return fn(*args, **kwargs) return wrapperВозможно применение этого декоратора и для оборачивания функций, принимающих различные аргументы и возвращающие значение:
@decor_with_return def calc_sqrt(val): return val**0.5Осталось выполнить функцию calc_sqrt() с параметром 16:
>>> tmp = calc_sqrt(16) Start method: calc_sqrt >>> print(tmp)Функции в Python, определение функций.
Функции в Python определяются с помощью инструкции
def
, которое вводит определение функции. За ним должно следовать имя функции и заключенный в скобки список формальных параметров аргументов. Операторы, которые формируют тело функции, начинаются со следующей строки и должны иметь отступ.def func_name(param): pass
func_name
— идентификатор, то есть переменная, которая при выполнении инструкцииdef
связывается со значением в виде объекта функции.param
— это необязательный список формальных параметров аргументов, которые связываются со значениями, предоставляемыми при вызове функции. В простейшем случае функция может вообще не иметь параметров. Это означает, что при ее вызове она не получает никаких аргументов. В определении такой функций круглые скобки после ее имени остаются пустыми, такими же они должны оставаться при ее вызове.
Первым оператором тела функции может быть строка документации функции. Существуют инструменты, которые используют строки документации для автоматического создания интерактивной или печатной документации или для предоставления пользователю интерактивного просмотра кода. Хорошей практикой является включение строк документации в код.
Определение функции — это исполняемый оператор. Его выполнение связывает имя функции в текущем локальном пространстве имен с объектом функции (оболочка вокруг исполняемого кода функции). Этот объект функции содержит ссылку на текущее глобальное пространство имен, которое будет использоваться при вызове функции.
Определение функции не выполняет тело функции, а только вычисляет аргументы, если они присутствуют. Тело функции выполняется только при вызове.
# Определим функцию, которая печатает список чисел ряда Фибоначчи до n >>> def fib(n): ... """Print a Fibonacci series up to n.""" ... a, b = 0, 1 ... while a < n: ... print(a, end=' ') ... a, b = b, a+b ... print() ... >>> # Вызов функции ... fib(2000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
При вызове функции создается область видимости для хранения локальных переменных этой функции и все созданные переменные внутри функции сохраняют свое значение только в этом пространство имен. Когда функция завершает выполнение, это пространство имен уничтожается.
Определение функции может быть заключено в одно или несколько выражений-декоратора. Выражения-декораторы оцениваются при определении функции в области, содержащей определение функции. Результатом должен быть вызываемый объект, который вызывается с объектом функции в качестве единственного аргумента. Возвращаемое значение привязывается к имени функции, а не к объекту функции. Несколько декораторов применяются вложенным образом. Например, следующий код
@f1(arg) @f2 def func(): pass # Примерно эквивалентен def func(): pass func = f1(arg)(f2(func))
Эти два выражения эквивалентны за исключением того, что исходная функция временно не привязана к имени func
.
Когда один или несколько параметров имеют выражение parameter=expression
, говорят, что функция имеет значения параметров по умолчанию. Для параметра со значением по умолчанию, соответствующий аргумент может быть опущен в вызове. Если параметр имеет значение по умолчанию, то все последующие параметры также должны иметь значение по умолчанию — это синтаксическое ограничение.
Значения параметров по умолчанию оцениваются слева направо при определении функции. Это означает, что эти выражение вычисляется один раз, когда функция определена, и что для каждого вызова используется одно и то же предварительно вычисленное значение. Это особенно важно понимать, когда параметр по умолчанию является изменяемым объектом, таким как список или словарь
Семантика вызова функций более подробно описана в разделе «Что происходит в момент вызова функции?». Вызов функции всегда присваивает значения всем параметрам, упомянутым в списке параметров, либо из позиционных аргументов, из ключевых аргументов, либо из значений по умолчанию. Если присутствует форма *identifier
, то она инициализируется кортежем, которая получает любые избыточные позиционные параметры, по умолчанию — пустой кортеж. Если присутствует форма **identifier
, то она инициализируется новым упорядоченным словарем, получающим любые избыточные ключевые аргументы, по умолчанию используется новый пустой словарь.
Параметры аргументов, следующие после *
или *identifier
являются параметрами только ключевых слов и могут быть переданы только в качестве ключевых аргументов (более подробно в разделе «Варианты передачи аргументов в функцию Python»).
Параметры могут иметь аннотацию типов в форме :expression
после имени аргумента. Любой параметр может иметь аннотацию, даже в форме *identifier
или **identifier
. Функции могут иметь аннотацию возвращаемого значения в форме -> expression
, которое следует после списка параметров. Эти аннотации могут быть любым допустимым выражением Python. Наличие аннотаций не меняет семантику функции. Значения аннотации доступны в виде значений словаря с ключами по именам параметров в атрибуте объекта функции __annotations__
и оцениваются при выполнении определения функции. Если используется импорт аннотаций из __future__
, то аннотации сохраняются в виде строк во время выполнения, что позволяет отложить оценку. В этом случае аннотации могут оцениваться в другом порядке, чем они появляются в исходном коде.
Также возможно создавать анонимные функции (функции, не привязанные к имени) для немедленного использования в выражениях. Здесь используются лямбда-выражения, описанные в разделе «Анонимные функции (lambda-выражения) в Python». Обратите внимание, что лямбда-выражение — это просто сокращение для упрощенного определения функции. Функция, определенная в операторе def
, может быть передана или присвоена другому имени, как функция, определенная лямбда-выражением. Форма def
на самом деле более мощная, так как она позволяет выполнять несколько операторов и аннотаций.
Примечание для программиста: Функции Python — это объекты первого класса. Оператор def
, выполняемый внутри определения функции, определяет локальную функцию, которая может быть возвращена или передана. Свободные переменные, используемые во вложенной функции, могут обращаться к локальным переменным функции, содержащей def
. Подробнее смотрите в раздел Именование и привязка.
Так как функции в Python являются объектами первого класса, то значение имени функции имеет тип, который распознается интерпретатором как определяемая пользователем функция. Это значение может быть присвоено другому имени, которое затем может также использоваться как функция:
>>> fib <function fib at 10042ed0> >>> f = fib >>> f(100) 0 1 1 2 3 5 8 13 21 34 55 89 >>>
Исходя из других языков, можно возразить, что fib
это не функция, а процедура, поскольку она не возвращает значение. На самом деле, даже функции без оператора return
возвращают значение, хотя и довольно скучное. Это значение называется None
(встроенное имя). Вывод значения None
обычно подавляется интерпретатором, если это единственное возвращаемое значение. Вы можете увидеть это, используя команду print()
:
>>> fib(0) >>> print(fib(0)) None >>>
Функция, которая возвращает список чисел ряда Фибоначчи, вместо того, чтобы печатать его:
>>> def fib2(n): # возврат ряда Фибоначчи до n ... """Возвращает список, содержащий ряд Фибоначчи до n.""" ... result = [] ... a, b = 0, 1 ... while a < n: ... result.append(a) ... a, b = b, a+b ... return result ... >>> f100 = fib2(100) # вызов функции >>> f100 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>>
Этот пример, демонстрирует некоторые новые возможности Python:
- Оператор
return
возвращает значение из функции.return
без аргумента возвращаетNone
. Функции, у которыхreturn
не определен, также возвращаетNone
. - Оператор
result.append(a)
вызывает метод объекта спискаresult
. Метод — это функция, которая «принадлежит» объекту и имеет имя obj.methodname, где obj есть некоторый объект (может быть выражение), и methodname имя метода, которое определяется типом объекта. Разные типы определяют разные методы. Методы разных типов могут иметь одно и то же имя, не вызывая двусмысленности. Можно определить свои собственные типы объектов и методы, используя классы. Метод append(), показанный в примере, определен для объектов списка. Он добавляет новый элемент в конец списка.
Определение функции
в Python. Определение функций в Python | Садрах Пьер, доктор философии
В компьютерном программировании функция — это именованный раздел кода, который выполняет определенную задачу. Обычно это включает ввод некоторого ввода, манипулирование вводом и возврат вывода. В этом посте мы рассмотрим, как определять функции Python, как указывать функции, которые могут принимать произвольное количество позиционных аргументов, и как определять функции, которые могут принимать произвольное количество аргументов ключевого слова.
Приступим!
Для начала давайте определим функцию, которая принимает два аргумента, в данном случае два числа, и возвращает сумму:
def sum_function (first, second):
return (first + second)
Давайте протестируем нашу функцию с числа 5 и 10:
print ("Sum:", sum_function (5, 10))
Это дает ожидаемый результат. Мы также можем использовать выражение звезды в Python для передачи произвольного количества аргументов. Например, мы можем определить новую функцию:
def sum_arbitrary_arguments (first, * rest):
return (first + sum (rest))
Назовем эту функцию с числами 5, 10 и 15:
print ( «Сумма с произвольным числом аргументов:», sum_arbitrary_arguments (5, 10,15))
Мы можем вызывать эту функцию с любым количеством позиционных аргументов.Давайте вызовем функцию с 5, 10, 15, 20, 25 и 30:
print («Сумма с произвольным числом аргументов:», sum_arbitrary_arguments (5, 10,15, 20, 25, 30))
Это дает правильное значение суммы. Мы также можем указать функцию с аргументами ключевого слова по умолчанию. Например, рассмотрим функцию, которая по умолчанию печатает погоду в Нью-Йорке:
def print_weather (name, state = "New York", temp = "30 градусов Цельсия"):
print ("Привет {}, это {} in {} ". format (name, temp, state))
Если мы вызовем функцию с» Sarah «:
print_weather (" Sarah ")
Мы также можем перезаписать значения по умолчанию:
print_weather (" Mike "," Бостон "," 28 градусов Цельсия ")
Мы также можем написать функцию, которая принимает произвольное количество аргументов ключевого слова, используя выражение ‘**’.Давайте сделаем это для отчетов о погоде:
def print_weather_kwargs (** kwargs):
weather_report = ""
для аргумента в kwargs.values ():
weather_report + = аргумент
return weather_report
Затем мы определим переменную ‘kwargs’ , для аргументов ключевого слова в качестве словаря и передайте его в нашу функцию:
kwargs = {'temp': "30 градусов Цельсия", 'in': 'in', 'State': "New York", 'when' : 'today'}
print (print_weather_kwargs (** kwargs))
Я остановлюсь на этом, но я рекомендую вам поиграть с кодом самостоятельно.
ВЫВОДЫ
Подводя итог, в этом посте мы обсудили, как работать с функциями в python. Сначала мы определили простую функцию, которая позволяет нам найти сумму двух чисел, затем мы показали, что мы можем использовать выражение в виде звезды для определения функции, которая может принимать произвольное количество позиционных аргументов. Далее мы показали, как определить функцию с ключевыми аргументами. Наконец, мы показали, как определить функцию, которая может принимать произвольное количество аргументов ключевого слова. Надеюсь, вы нашли этот пост полезным / интересным.Код из этого поста доступен на GitHub. Спасибо за чтение!
На этой странице: def, return, docstrings, help (), функции возврата значения и void Функции: основыДавайте откажемся от старой алгебры. Вы выучили «функции» примерно так:
Попробуем другую функцию.Ниже приведена функция, которая принимает глагол (надеюсь) и возвращает герундийную форму:
Несколько параметров, строка документацииНиже представлена чуть более сложная функция. Он принимает два аргумента, имеет условное выражение в теле функции и начинается со строки:
Строка «» «Проверяет, если …» «» называется « docstring «. Размещенный в самом верху тела функции, он действует как документация по функции. Эта строка распечатывается, когда вы вызываете help () для функции:
Вот еще один пример. Эта функция возвращает список символов, общих для двух строк. (Было бы лучше, если бы не было дубликатов. Можно улучшить?)
Функции: возврат или аннулированиеВы можете подумать: «Погодите минутку, я не видел никакого оператора возврата в учебнике по определению функций». Вы правы — определенная Эд функция get_legal () не включала никакого оператора возврата, а только набор функций печати.В Python можно составить функцию без оператора возврата. Такие функции называются void , и они возвращают None, специальный объект Python «ничего». Вот пример функции void:
Хорошо, тогда чем отличаются функции void и функции типа «return»? Хороший вопрос.Позвольте мне проиллюстрировать это на примерах. Вот функция get_ing (), определенная выше, и ее недействительный аналог print_ing ():
Вызывая две функции, вы сначала замечаете небольшую разницу в выводе. Возвращающая функция дает вам строку (примечание »), а функция печати показывает напечатанный вывод строки — обратите внимание на отсутствие кавычек.Обратите внимание, что возвращаемое значение отображается только в интерактивной среде оболочки; в сценарии только команды печати приводят к отображению вывода.
Теперь, поскольку get_ing () возвращает значение, его можно скопировать в переменную с помощью оператора присваивания. Попробуйте сделать то же самое с print_ing (), и вы столкнетесь с непредвиденными последствиями: печать происходит после оператора присваивания, и вы не получаете ничего в качестве значения переменной, потому что эта функция, будучи недействительной, ничего не возвращает.
Кроме того, функцию, возвращающую значение, можно подключить прямо к другой функции. Опять же, поскольку функции void ничего не возвращают, они не могут. Ниже get_ing (‘eat’) передается функции len () для успешного результата. С помощью len (print_ing (‘eat’)) печать происходит независимо, а затем возникает ошибка типа:
Наконец, если вам нужна печать, ее также можно выполнить с помощью функции возврата значения: просто используйте с ней оператор печати.
Это заняло некоторое время, но я надеюсь, что теперь вы ясно видите фундаментальные различия между двумя типами функций. По правде говоря, функции возвращаемого типа гораздо более функциональны и полезны. В других языках функции типа void даже не называются функциями — вместо этого они называются процедурами. |
Как писать функции Python
Функция Python — это группа кода. Чтобы запустить код в функции, вы должны вызвать функцию. Функция может быть вызвана из любого места после определения функции. Функции могут возвращать значение с помощью оператора return.
Найди свой матч на тренировочном лагере
- Карьера Карма подойдет вам с лучшими техническими учебными курсами
- Получите эксклюзивные стипендии и подготовительные курсы
Найди свой матч на тренировочном лагере
- Карьера Карма подойдет вам с лучшими техническими учебными курсами
- Получите эксклюзивные стипендии и подготовительные курсы
Функции являются общей чертой всех языков программирования.Они позволяют разработчикам писать блоки кода, которые выполняют определенные задачи. Функция может выполняться столько раз, сколько хочет разработчик в своем коде.
Функции
позволяют разработчикам уменьшить количество повторений в своем коде, поскольку они могут выполнять один и тот же блок кода несколько раз в одной программе.
В этом руководстве с примерами обсуждаются основы функций Python, как создавать и вызывать функцию и как работать с аргументами. К концу чтения этого руководства вы станете экспертом в написании функций на Python.
Что такое функция Python?
Функция — это блок кода, который выполняется только при вызове. Функции Python возвращают значение с помощью оператора return, если он указан. Функция может быть вызвана в любом месте после объявления функции.
Сама по себе функция ничего не делает. Но когда вам нужно использовать функцию, вы можете вызвать ее, и код внутри функции будет выполнен.
В Python есть два типа функций: определяемые пользователем и встроенные.Встроенные функции — это такие функции, как:
- print () , который выводит оператор на консоль
- Python len () , который вычисляет длину списка
- Python str () , который преобразует значение в строку
Пользовательские функции — это многократно используемые блоки кода, написанные вами, разработчиком. Эти блоки кода позволяют более эффективно организовать код. Это важно, потому что чем более организован ваш код, тем проще его будет поддерживать.
81% участников заявили, что после буткемпа они почувствовали себя более уверенными в своих перспективах трудоустройства в сфере высоких технологий. Попади на буткемп сегодня.
Найдите свой матч на учебном лагере
Средний выпускник учебного лагеря потратил менее шести месяцев на смену карьеры, от начала учебного лагеря до поиска своей первой работы.
Начните карьеру сегодня
Как определить функцию Python
Определение функции относится к созданию функции. Это включает в себя написание блока кода, который мы можем вызывать, ссылаясь на имя нашей функции.Функция обозначается ключевым словом def, за которым следует имя функции и набор скобок.
В этом примере мы собираемся создать простую функцию, которая печатает оператор Сегодня понедельник! к консоли. Для этого мы можем использовать этот код:
def print_monday (): print («Сегодня понедельник!»)
Когда мы запускаем наш код, ничего не происходит. Это потому, что для того, чтобы наша функция работала, нам нужно ее вызвать. Для этого мы можем указать имя нашей функции так:
def print_monday (): print («Сегодня понедельник!») print_monday ()
Наш код возвращает:
Давайте разберем основные компоненты нашей функции:
- ключевое слово def используется, чтобы указать, что мы хотим создать функцию.
- print_monday — это имя нашей функции. Он должен быть уникальным.
- () — это место, где будут храниться наши параметры. Поговорим об этом позже.
- : отмечает конец заголовка нашей функции.
Теперь наши функции могут быть настолько сложными, насколько мы хотим. Предположим, мы хотим написать программу, которая сообщает пользователю, сколько букв в его имени. Мы могли бы сделать это с помощью этого кода:
def calculate_name_length (): name = str (input ("Как вас зовут?")) name_length = len (имя) print ("Длина вашего имени", name_length, "букв.") CalculNameLength ()
Если мы запустим наш код и введем имя «Элизабет», будет возвращен следующий ответ:
Найди свой матч на тренировочном лагере
- Карьера Карма подойдет вам с лучшими техническими учебными курсами
- Получите эксклюзивные стипендии и подготовительные курсы
Длина вашего имени - 9 букв.
Мы определяем функцию с именем calculate_name_length () . В теле функции мы запрашиваем у пользователя его имя, а затем используем len () для вычисления длины имени пользователя. Наконец, мы выводим на консоль «Длина вашего имени [длина] букв.», Где длина — это длина имени пользователя.
Параметры и аргументы функции
В наших первых примерах мы использовали пустые скобки с нашими функциями. Это означает, что наши функции не принимали никаких аргументов.
Аргументы позволяют передавать в функцию информацию, которую функция может читать. Аргументы функции заключаются в круглые скобки, следующие за именем функции.
Давайте рассмотрим базовый пример, чтобы проиллюстрировать, как работают аргументы.
Пример параметров и аргументов Python
Предположим, мы хотим создать программу, которая умножает два числа. Мы могли бы сделать это с помощью этого кода:
def multiply_numbers (число1, число2): ответ = число1 * число2 print (число1, "x", число2, "=", ответ) multiply_numbers (5, 10) multiply_numbers (15, 2)
Наша программа Python возвращает:
Сначала мы определяем функцию с именем multiply_numbers .Имена параметров в функции, которые принимает наш код: число1 и число2. Мы определяем их в скобках, где определяется список параметров.
Затем мы объявляем переменную Python под названием «answer», которая умножает значения number1 и number2. Затем мы выводим на консоль инструкцию с выписанной полной математической суммой, за которой следует ответ на математическую задачу.
Мы указали обязательные аргументы. Это потому, что мы не установили значения по умолчанию для каждого аргумента.Мы должны указать количество аргументов, равное количеству аргументов в списке параметров, иначе интерпретатор Python вернет ошибку.
В конце нашей программы мы дважды вызываем нашу функцию multiply_numbers .
Сначала мы указываем аргументы 5 и 10. Наша программа умножает эти значения, чтобы вычислить 50. Затем наша программа выводит на консоль «5 x 10 = 50». Затем мы указываем аргументы 15 и 2, которые наша программа умножает. Затем наша программа выводит на консоль «15 x 2 = 30».
«Карьера Карма вошла в мою жизнь, когда я больше всего в ней нуждалась, и быстро помогла мне пройти курс обучения. Через два месяца после выпуска я нашел работу своей мечты, которая соответствовала моим ценностям и целям в жизни!»
Венера, инженер-программист Rockbot
Найдите свой матч на учебном лагере
По умолчанию порядок аргументов, которые вы передаете в функцию, соответствует порядку, в котором они обрабатываются вашей программой. Когда мы запускаем multiply_numbers (5, 10), значение number1 становится 5.Значение «number2» становится 10. Мы поговорим о том, как переопределить это в разделе «аргументы ключевого слова».
Дополнительную информацию об аргументах см. В нашем руководстве по необязательным аргументам Python.
A Примечание: параметры и аргументы
Термины параметр и аргумент относятся к одному и тому же: передаче информации функции. Но между ними есть небольшая разница.
Параметр — это переменная в скобках в функции.Аргумент — это значение, которое передается функции при ее вызове. Итак, в нашем последнем примере «число1» и «число2» — это параметры, а 5 и 10 — аргументы.
Аргументы ключевого слова функции
Как мы уже говорили, порядок, в котором вы передаете аргументы, — это порядок, в котором ваша программа будет их обрабатывать. Итак, первый параметр будет присвоен первому аргументу и так далее. Однако есть способ отменить это правило.
Вы можете использовать аргументы ключевого слова в вызове функции, что позволяет вам назначать значение аргумента на основе его имени параметра.Использование аргументов ключевых слов позволяет вам указывать значение ключевых слов в любом порядке.
аргументов ключевого слова работают, потому что вы будете использовать ключевые слова для сопоставления значений с параметрами вместо того, чтобы полагаться на порядок аргументов для передачи значений.
Предположим, мы создаем программу, которая распечатывает имя и адрес электронной почты кого-то, кто подписался на список рассылки. Мы могли бы написать эту программу, используя следующий код:
def print_info (имя, адрес электронной почты): print ("Имя:", имя) print ("Электронная почта:", электронная почта) print_info (email = "[email protected] ", name =" Алекс Хаммонд ")
Наш код возвращает:
Имя: Алекс Хэммонд Почта: [email protected]
Мы объявляем функцию, которая принимает два параметра: имя и адрес электронной почты. Мы выводим на консоль « Name:» , за которым следует значение параметра name . Затем мы выводим на консоль «_Email:» _, за которым следует значение параметра email . Мы используем операторы Python print () для вывода этих значений на консоль.
Затем мы вызываем нашу функцию и указываем два аргумента. Аргумент email приравнивается к [email protected] , а аргумент name приравнивается к Alex Hammond .
В нашем коде мы разделили имя аргумента и его значение знаком равенства (=). Это означало, что нам больше не нужно было указывать наши аргументы в порядке появления наших параметров (имя, адрес электронной почты). Мы могли использовать любой заказ, какой захотим.
Значения аргументов по умолчанию
Кроме того, вы можете указать значение аргумента по умолчанию для параметра в функции.
Предположим, мы хотим, чтобы значение email было по умолчанию [email protected] . Мы могли бы сделать это, используя следующий код:
def print_info (name, email = "[email protected]"): print ("Имя:", имя) print ("Электронная почта:", электронная почта) print_info ("Алекс Хэммонд")
Наш код Python возвращает:
Имя: Алекс Хэммонд Почта: [email protected]
Мы установили значение по умолчанию для параметра email равным default @ gmail.com . Когда мы запускаем наш код и вызываем функцию print_info () , нам не нужно указывать значение для аргумента email . В этом примере, когда мы выполняем print_info () , мы указываем только один аргумент: имя пользователя.
Возврат значений в основную программу
До сих пор мы обсуждали, как передать значения в функцию . Но функция также может использоваться для передачи значений в остальной части программы.
Оператор возврата завершает функцию и позволяет передать значение обратно в основную программу. Если вы используете оператор return без аргумента, функция вернет значение None .
Предположим, мы хотим создать программу, которая умножает два числа. Затем, когда эти два числа были умножены, мы хотим вернуть их в нашу основную программу. Мы могли бы сделать это с помощью этого кода:
def multiply_numbers (число1, число2): ответ = число1 * число2 ответный ответ ans = умножить_числа (5, 6) печать (ANS)
Наш код возвращает:
Сначала мы определяем функцию с именем multiply_numbers .Эта функция принимает два параметра: число1 и число2. Когда эта функция вызывается, значения «number1» и «number2» умножаются. Затем мы используем оператор return , чтобы передать умноженное число в основную программу.
Мы вызываем функцию multiply_numbers () и указываем два аргумента: 5 и 6. Обратите внимание, что мы также присваиваем результат функции переменной ans. Когда эта строка кода запускается, вызывается наша функция, и ее результат присваивается ans.Затем наш код выводит значение ans, которое в данном случае равно 30.
Оператор Python return останавливает выполнение функции, даже если она не возвращает значение. Вот пример такого поведения в действии:
def run_ten (): для i в диапазоне (0, 10): если я == 4: возвращение print ("Готово") run_ten ()
Наш код ничего не выводит на консоль. Хотя в нашем коде есть оператор print («Finished») », он не выполняется.
Это потому, что, когда наш цикл for выполняется четыре раза (когда i равно 4), выполняется инструкция return.Это заставляет нашу функцию останавливать выполнение и останавливает выполнение нашего цикла.
После того, как наша функция остановится, код в нашей основной программе продолжит выполнение.
Заключение
Функции Python — это блоки кода, которые выполняют определенное действие. Функции в программе можно вызывать сколько угодно раз. Это означает, что вы можете запускать один и тот же блок кода несколько раз, не повторяя свой код.
Функции
позволяют уменьшить количество повторений в коде, тем самым облегчая чтение ваших программ как вам, так и другим кодировщикам.
Для задачи напишите функцию, которая выводит на консоль каждое число от 1 до 10 (включая 10). Эта функция должна содержать цикл for. Когда функция будет выполнена, вы должны напечатать «Готово!» к консоли. Вызовите вашу функцию один раз в конце вашей программы.
Результат должен быть:
В этом руководстве обсуждались основы функций в Python, как писать и вызывать функцию, а также как работать с аргументами и параметрами. Теперь вы готовы начать писать функции на Python, как эксперт!
Чтобы узнать о лучших курсах, книгах и учебных ресурсах Python, ознакомьтесь с нашим подробным руководством «Как выучить Python».
Как определить функцию в Python?
Функция — это многократно используемый блок кода, который может выполнять базовую задачу. Определение функции в Python может немного отличаться от синтаксиса, используемого в таких языках, как C, C ++ или Java. Цель этой статьи — предоставить синтаксис для определения функции в Python.
Определение функции начинается с ключевого слова def , за которым следует имя функции и аргументы, которые функция может принимать.Эти аргументы заключены в круглые скобки, и может быть любое количество аргументов, включая ноль. Если аргументов несколько, они разделяются запятой. Поскольку python — это слабо типизированный язык (это означает, что мы не назначаем тип данных переменной при объявлении), мы не должны включать типы данных для аргументов. Оператор определения функции заканчивается двоеточием. В python мы определяем функцию следующим образом:
def имя_функции (arg1, arg2, arg3, ...): "" " здесь идет функциональная логика."" " возвращаемое значение1, значение2, значение3, ...
Ниже простая функция,
def greet (): print ("привет, мир")
Это основная функция, которая выводит на консоль « hello world ».
Углубление
Если мы внимательно посмотрим на определение функции, то увидим, что тело функции не заключено в фигурные скобки. В Python тело функции идентифицируется по уровню отступа. Поскольку мы не используем фигурные скобки для обозначения тела функции, отступ помогает интерпретатору Python знать, какая часть кода определяет логику функции.Если у нас нет отступа логики функции относительно объявления функции, будет вызвана ошибка IndentationError , и функция не будет интерпретирована.
def fun (имя): print ("привет" + имя)
Вышеупомянутая функция не будет компилироваться и выдаст ошибку IndentationError .
Возвращаемые значения
Функция может возвращать значение, и в этом случае она сообщается интерпретатору с помощью оператора return .В отличие от C, C ++ или Java, функция python может возвращать несколько значений. Если мы не добавим оператор return, управление будет автоматически передано вызывающему коду без возврата какого-либо значения. Значение по умолчанию — . Нет. будет возвращено, если нет оператора возврата. Как и в других языках, функция может иметь не более одного оператора возврата.
def add (a, b): вернуть a + b def привет (): print ("Привет, мир") res = add (5,7) #res будет иметь значение 12.res = hello () #res будет иметь значение None.
Аргументы по умолчанию
Мы можем установить значения по умолчанию для аргументов в определении функции. Для этого мы используем следующий синтаксис. Обратите внимание, что аргументы по умолчанию должны находиться в правой части списка аргументов. То есть аргумент по умолчанию должен идти только после всех аргументов, не являющихся аргументами по умолчанию.
def areaOfCircle (радиус, pi = 3,14): возврат пи * радиус * радиус
Здесь функция принимает аргумент по умолчанию pi, который определен в правой части списка аргументов.Если мы определим аргумент по умолчанию слева от аргумента не по умолчанию, мы получим SyntaxError .
Вызов функций
Теперь, когда мы определили функции, мы видим, как мы можем вызывать их в нашем коде. Для вызова функции мы используем имя функции вместе с аргументами, которые использовались для определения функции. Количество аргументов должно точно соответствовать количеству аргументов, присутствующих в определении функции. Любая разница в количестве аргументов вызовет ошибку TypeError .
def areaOfCircle (радиус, pi = 3,14): вернуть пи * радиус * радиус # вызов функции печать (areaOfCircle (5)) # обратите внимание, что аргументу по умолчанию не передается значение. # выводит на экран 78,5.
Перегрузка функций
Программисты с опытом работы на C ++ или Java часто сталкивались с перегруженными функциями. Перегрузка функций не работает в Python, потому что, если мы определяем функцию два или более раз, изменяя количество аргументов, последняя определенная функция переопределит предыдущие определения.Если функция с указанным количеством аргументов в вызове функции даже не существует, мы получаем ошибку типа . Например,
def add (a, b): вернуть a + b def add (a, b, c): вернуть a + b + c print (add (1,2)) # выдает ошибку TypeError с запросом еще одного аргумента. print (add (1,2,3)) # выводит 6 на консоль.
Передача функций в качестве аргументов
Мы можем передать саму функцию в качестве аргумента другой функции. Предположим, мы хотим применить определенную функцию к массиву чисел.Вместо того, чтобы определять функцию и вызывать ее с помощью цикла for, мы могли бы просто использовать функцию карты. Функция карты — это мощная встроенная функция, которая принимает функцию и коллекцию элементов в качестве аргументов и применяет функцию ввода ко всей коллекции элементов и возвращает обработанные элементы.
def квадрат (i): вернуть я * я res = list (карта (квадрат, [1,2,3])) #res теперь содержит [1,4,9]. Мы получили результаты, даже не просматривая список
* аргументы и ** kwargs
Что касается аргументов, есть несколько особых типов аргументов.Опытные программисты могли использовать этот аргумент в C и C ++. Python также предлагает эти возможности. Если мы не знаем, сколько аргументов функция получит во время выполнения, мы можем использовать * args для получения этих аргументов в определении функции. Мы также можем добиться перегрузки функций, используя * args, хотя технически это не является перегрузкой функций, поскольку мы не определяем несколько функций с одним и тем же именем.
def add (* args): сумма = 0 для аргументов в аргументах: сумма + = аргумент сумма возврата add (1,2,3) # возвращает 6 add (1,2,3,4) # возвращает 10
Если мы хотим получать именованные аргументы, мы можем использовать ** kwargs.
def fun (** kwargs): для ключа в кваргс: print (ключ, kwargs [ключ]) веселье (a = 1, b = 2, c = 3) # отпечатки #a 1 #Би 2 #c 3
Аргументы командной строки
Любой код производственного уровня будет использовать особый тип аргумента. Это аргументы командной строки, используемые основной функцией. В python эти аргументы будут переданы функции __main__. Их легко получить, проанализировав переменную sys.argv. Поскольку синтаксический анализ строки командной строки — обычная задача, у нас есть библиотеки для этого, например argparse.
Как определить «анонимные» функции
Анонимные функции — это функции без имени. Они также известны как лямбда-функции . Но ждать! Если у функции нет имени, как вы ее назовете? Они называются там, где они определены. В большинстве случаев они не используются позже в коде. Эти функции представляют собой специальные функции, которые используются, когда нам нужно передать саму функцию в качестве аргумента. Этот случай чаще всего возникает, когда мы хотим выполнить какую-то обработку данных с помощью pandas или любой другой библиотеки.Функция может быть настолько маленькой, что не заслуживает отдельного названия. Эти функции определены с ключевым словом лямбда .
Список
(map (lambda x: x * x, [1,2,3])) #prints values [1,4,9]
Мы вычислили квадраты входного списка, даже не определив функцию. Что мы делаем с оператором lambda x: x * x , так это то, что мы определяем анонимную функцию, то есть без имени, и немедленно вызываем ее. Предположим, что мы хотим использовать лямбда-функцию позже, мы можем сохранить ее в переменной функции и использовать ее.
квадрат = лямбда x: x * x список (карта (квадрат, [1,2,3])) #prints values [1,4,9]
Переменная square хранит функцию для вычисления квадратов чисел, и мы используем ее позже, когда захотим вычислить квадраты чисел в списке. При определении лямбда-функций следует учитывать следующие моменты:
- Нет заявления о возврате.
- Аргументы не заключаются в скобки.
- Нет отступа.
- Несколько аргументов разделяются запятой
- Эти функции определены в одной строке.
Заключение
В этой краткой статье упоминаются шаги по определению функции и объясняются компоненты функции. Определение функции в python может сильно отличаться от C, C ++ или Java без фигурных скобок, возвращаемых типов и т. Д. Но как только мы поймем структуру функции, становится легче писать более сложные функции.
Об авторе
Я — разработчик на языке Python, работаю в IT MNC более трех лет. Со мной можно связаться через Gmail.
Носители, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению автора.
Связанные
Функция Python: Python def () Пример
Функция Python — это группа связанных операторов, которые выполняют конкретную задачу. Функция на любом языке программирования — это блок организованного многократно используемого кода, который используется для выполнения единственного связанного действия. Функции обеспечивают лучшую модульность для нашего приложения и возможность повторного использования кода.
Из этой статьи вы узнаете о функциях Python; что такое функция в Python, синтаксис, компоненты и типы функций. Кроме того, вы научитесь создавать функции на Python.
Пример функции Python
Что такое функция в Python? В Python функция — это группа связанных операторов, которые выполняют конкретную задачу. Функции помогают нам разбить нашу программу на более мелкие и модульные части. По мере того, как наша программа становится все больше и больше, функции делают ее более организованной, управляемой и многоразовой.Кроме того, он позволяет избежать повторения и позволяет повторно использовать код.
Синтаксис
def имя_функции (параметры): "" "строка документации" "" оператор (ы)
Параметры
Выше показано определение функции, которое состоит из следующих компонентов.
- Ключевое слово def отмечает начало заголовка функции.
- Укажите имя функции, чтобы однозначно идентифицировать эту функцию. Именование функций следует тем же правилам написания идентификаторов на языке Python.
- Параметры (аргументы) необязательны, через которые мы передаем значения функции.
- Двоеточие (:) для обозначения конца заголовка функции.
- Необязательная строка документации или строки документации для описания того, что функция делает в программе. Это комментарий на языке программирования.
- Тело функции содержит один или несколько допустимых операторов Python. Заявления должны иметь одинаковый уровень отступа (обычно четыре пробела).
- Необязательный оператор return для возврата значения из функции.
По умолчанию параметры имеют позиционное поведение, и вам необходимо сообщить их в том же порядке, в котором они были определены.
Пример функции в Python
См. Следующий пример тела функции.
def GoT (символ): "" "Эта функция печатает символы в" "" печать (символ) return
Как вызвать функцию в Python?
Определение функции дает ей только имя, определяет параметры, которые должны быть включены в функцию, и структурирует блоки кода.
После того, как вы определили базовую структуру Python, вы можете либо выполнить ее, вызвав ее из другой функции, либо непосредственно из командной строки Python.
Если мы хотим вызвать функцию, мы вводим имя функции с соответствующими параметрами. См. Полный код ниже.
# app.py def GoT (символ): "" "Эта функция печатает символы в" "" печать (символ) возвращение GoT ("Джон Сноу")
См. Вывод.
Передача по значению или передача по ссылке
Все параметры (аргументы) в языке Python передаются по ссылке.Это означает, что если вы измените то, к чему относится параметр внутри функции, это изменение также отражается в вызывающей функции. См. Код ниже.
# app.py def приложения (список): list.append (21) print ("Значения внутри функции:", список) возвращение list = ['Facebook', 'Instagram', 'Messenager'] приложения (список) print ("Значения вне функции:", list)
Итак, здесь мы модифицируем список внутри функции и смотрим, изменился ли внешний список функций или нет. См. Вывод ниже.
Итак, в приведенном выше коде мы добавляем один элемент 21 внутри функции, и все еще внешний список обновляется, что означает, что он передается по ссылке.
Есть еще один пример, когда аргумент передается по ссылке, а ссылка перезаписывается внутри вызываемой функции. См. Следующий код.
# app.py def приложения (список): список = [21] print ("Значения внутри функции:", список) возвращение list = ['Facebook', 'Instagram', 'Messenager'] приложения (список) print («Значения вне функции:», список)
См. вывод.
Список параметров является локальным для функциональных приложений. Мы не изменяем существующий список; мы назначаем новый список, поэтому изменение списка внутри функции не влияет на на список . Функция ничего не делает.
Строка документации в Python
Первая строка после заголовка функции называется строкой документации и является сокращением от строки документации. Строка документации используется для краткого объяснения того, что делает функция. Если вы знакомы с Laravel, это может быть вам знакомый термин.
Хотя они не являются обязательными, надлежащая документация считается лучшей практикой программирования. Если вы не помните, что вы делали со своим кодом месяц назад, в противном случае всегда документируйте свой код.
Оператор возврата
Оператор возврата используется для выхода из функции и возврата в то место, откуда она была вызвана. Синтаксис оператора возврата следующий.
return [список_выражений]
Оператор return может содержать выражение, которое оценивается, и значение возвращается.Если в операторе нет выражения или сам оператор return отсутствует внутри функции, тогда функция вернет объект None .
Область действия и время жизни переменных
Область действия переменной определяет часть программы, в которой вы можете получить доступ к определенному идентификатору. В Python есть два необходимых набора переменных, которые приведены ниже.
- Глобальные переменные
- Локальные переменные
Область действия переменной — это часть программы, в которой переменная распознается.Параметры и переменные, определенные внутри функции, не видны из внешнего мира. Следовательно, они имеют локальный охват.
Время жизни переменной — это период, в течение которого переменная существует в памяти. Время жизни переменных внутри функции — до тех пор, пока функция выполняется.
Все переменные в программе могут быть недоступны во всех местах этой программы. Это зависит от того, где вы объявили переменную.
Переменные уничтожаются, когда мы возвращаемся из функции.Следовательно, функция не запоминает никакого значения переменной из своих предыдущих вызовов.
См., Например, следующий код.
# app.py def фильм (): эндшпиль = 10 print ("Значение внутри функции:", эндшпиль) эндшпиль = 20 кино() print ("Значение вне функции:", эндшпиль)
См. вывод.
Аргументы функции
Вы можете вызвать функцию, используя следующие типы формальных аргументов.
- Обязательные аргументы.
- Аргументы ключевого слова.
- Аргументы по умолчанию.
- Аргументы переменной длины.
Анонимные или лямбда-функции
Лямбда-функции называются анонимными , потому что они не объявляются условно с использованием ключевого слова def . Вы можете использовать ключевое слово lambda для создания небольших анонимных функций.
Лямбда-формы могут принимать любое количество аргументов, но возвращать только одно значение в форме выражения.Они не могут содержать никаких команд или нескольких выражений.
- Анонимная функция не может быть прямым вызовом print, потому что лямбда требует выражения.
- Лямбда-функции имеют свое локальное пространство имен и не могут обращаться к переменным, отличным от тех, которые указаны в их списке параметров и в глобальном пространстве имен.
Хотя кажется, что лямбда-функции являются однострочной версией функции, они не эквивалентны встроенным операторам в C или C ++, целью которых является обход выделения стека функций во время вызова из соображений производительности.
Итак, пример функции Python окончен.
Основы функций в Python | Вычислительные методы в гражданской сфере в Стэнфордском университете
Мы пользуемся функциями с самого начала:
print («привет, мир»)
Токен print
— это , а не — специальное ключевое слово Python. Это имя, присвоенное блоку кода, который выполняет работу по принятию аргумента — «hello world»
— и его вывод на экран.Фактический код, который выполняет , который работает , намного сложнее, чем вы, вероятно, думали:
Представьте, что вы набираете все эти инструкции только для того, чтобы что-то вывести на экран. Но мы никогда не должны этого делать. Имея все инструкции Python, необходимые для печати на экране, завернутые в этикетку, print
, нам просто нужно запомнить эту этикетку (например, print
) и вызвать ее с соответствующими аргументами:
print («привет, мир», «это», «я»)
Почему мы хотим определять наши собственные функции? Потому что мы ленивы и устали от необходимости копировать и вставлять один и тот же код снова и снова, когда нам нужно что-то делать неоднократно.Определение наших собственных функций позволяет нам, как минимум, очистить наши скрипты и сделать их более читаемыми.
Определение функции Python почти так же просто, как их использование, но более сложное, чем присвоение переменной.
По сути, мы используем ключевое слово def
, затем выбираем имя, а затем пишем код, который хотим сохранить для последующего выполнения в виде блока с отступом.
Остальная часть этого руководства посвящена простому синтаксису для определения функций. Ознакомьтесь с главой 3 Эла Свигарта: «Функции» через «Автоматизируйте скучную работу», чтобы получить хорошее пошаговое руководство, охватывающее функции и некоторые из связанных с ними тем.
Вот самая простая функция:
def hello_world ():
print ("Привет, мир!")
Перейдите в интерактивную оболочку Python и введите приведенный выше код. Ничего не должно происходить, потому что ничего не выполняется , когда мы просто определяем
функция.
Код функции выполняется только тогда, когда мы вызываем функцию по имени:
>>> hello_world ()
Привет, мир!
Обратите внимание, что круглые скобки должны быть включены, чтобы указать, что мы хотим выполнить функцию.В противном случае функция действует так же, как и любой другой объект Python:
>>> hello_world
<функция __main __. hello_world>
>>> тип (hello_world)
функция
Синтаксические компоненты базовой функции Python
Из документации Python:
Ключевое слово
def
вводит определение функции. За ним должно следовать имя функции и список формальных параметров в скобках. Операторы, составляющие тело функции, начинаются со следующей строки и должны иметь отступ.
В приведенном выше примере функции не содержит список формальных параметров в скобках. Мы рассмотрим этот пример позже.
По сути, функцию можно разбить на эту простую форму:
def the_function_name ():
what_the_function_does
def
ключевое слово
Это лишь одно из тех ключевых слов Python, которые вы запоминаете. Это сокращение от «
Имя функции
В основном это может иметь те же соглашения, что и имя переменной .Как правило, используйте строчные буквы и символы подчеркивания.
Что касается того, какой код может находиться внутри блока кода с отступом; все, что является действительным кодом Python. Точно так же, как блоки с отступом для условных переходов и циклов for.
Один тонкий аспект функции print
заключается в том, что не возвращает значение . Что это обозначает? Проще продемонстрировать функцию, в которой возвращает значение : len
>>> x = len ("привет")
Переменная x
содержит значение 5, потому что функция len
предназначена для возврата целого числа, представляющего длину любого значения, которое ей было передано.
Теперь попробуйте print ()
:
>>> pval = print ("привет")
Привет
Функция явно выполнена, потому что на экран выводится hello
. Но что присвоено переменной pval
? Ничего
>>> тип (pval)
NoneType
Ключевое слово возврата
Простая функция hello_world
ничего не вернула, потому что она просто вызвала функцию print
.Чтобы наша функция действительно возвращала значение, нам нужно использовать ключевое слово return — еще одно из нескольких ключевых слов Python:
def hello_world_again ():
return "Привет, мир!"
Попробуйте это в интерактивной консоли:
>>> txt = hello_world_again ()
>>> тип (txt)
ул.
Обратите внимание, что на экран ничего не выводится. Это потому, что hello_world_again
не вызывает саму функцию print
.Если мы хотим напечатать результат hello_world_again
, мы должны сами вызвать print
:
>>> print (hello_world_again ())
Привет, мир!
Опять же, обратите внимание, что закрытые круглые скобки должны следовать за именем функции, чтобы она могла быть выполнена. То есть вы , вероятно, не хотите печатать саму функцию , например:
>>> печать (hello_world_again)
<функция hello_world_again at 0x10c289bf8>
Оператор return эффективно завершает функцию; то есть, когда интерпретатор Python выполняет инструкции функции и достигает return
, он выйдет из функции в этой точке.
Функция ниже всегда будет просто возвращать "привет"
:
def foo_a ():
ответь "привет"
вернуть "мир"
Примеры функций пока были очень скучными. Использование аргументов позволяет нам вызывать функцию для различных ситуаций, что делает функции намного более полезными.
Вот простой пример:
def hello_there (кто-то):
print ("Привет,% s!"% str (кто-то) .upper ())
>>> hello_there ('дан')
Привет, ДАН!
>>> hello_there (42 * 42)
Привет, 1764 год!
В определении функции аргументы указаны в круглых скобках после имени функции.Думайте о них как об именах переменных, которые используются в теле функции. В то время, когда мы определяем функцию, мы не знаем точно, какие значения ей передаст пользователь.
Функции могут иметь более одного аргумента; используйте запятую для разделения каждого аргумента:
def sup (first_name, last_name):
print ("Sup,% s% s?"% (last_name, first_name))
>>> sup ('дан', 'нгуен')
Sup, nguyen dan?
Аргументы можно определить как необязательные, присвоив им значение по умолчанию в списке аргументов:
def sup_2 (first_name, last_name = 'Doe'):
print ("Sup,% s% s?"% (last_name, first_name))
>>> sup_2 ('Джон', "Джонсон")
Суп, Джон Джонсон?
>>> sup_2 ('Джон')
Суп, Джон Доу?
Когда следует определять функцию? Когда угодно.Но обычно мы определяем функции для вещей, которые делаем, снова и снова.
Например, мы неоднократно получали файлы из Интернета и, в случае файлов JSON, десериализуем их в объекты Python:
запросов на импорт
импортировать json
resp = requests.get ("http://stash.compciv.org/congress-twitter/2016-01/sentcruz.json")
mydata = json.loads (соответственно текст)
Если бы нам пришлось делать это для многих файлов JSON (требующих загрузки из Интернета), нам пришлось бы копировать и вставлять этот фрагмент кода снова и снова.Это повторяющееся. И это подвержено ошибкам.
Итак, давайте превратим его в функцию. Основная стратегия при разработке функции — знать:
- Что мне нужно делать?
- Что должна возвращать функция ?
- Что можно аннотация ?
Что мне нужно делать?
Итак, учитывая URL-адрес файла JSON, нам нужно загрузить его и превратить в объект данных. Мы только сделали это выше, поэтому давайте просто скопируем этот код и вставим его в тело функции с именем fetch_json
:
def fetch_json ():
запросы на импорт
импортировать json
resp = запросы.получить ("http://stash.compciv.org/congress-twitter/2016-01/sentcruz.json")
mydata = json.loads (соответственно текст)
Что должна вернуть функция?
Если вы скопируете и вставите этот код выше, а затем вызовете функцию:
>>> fetch_json ()
Это будет работать. Но на самом деле он ничего не возвращает, поэтому для всех практических целей бесполезен.
Итак, давайте просто вернем десериализованный объект:
def fetch_json ():
запросы на импорт
импортировать json
resp = запросы.получить ("http://stash.compciv.org/congress-twitter/2016-01/sentcruz.json")
mydata = json.loads (соответственно текст)
вернуть мои данные
Обратите внимание, что mydata
и все другие имена переменных не имеют значения за пределами области определения функции. Другими словами, вам не нужно беспокоиться о конфликте или
и mydata
с другими местами, где вы использовали те же имена переменных.
>>> вещь = fetch_json ()
>>> тип (вещь)
диктовать
>>> вещь ['имя']
'Сенатор Тед Круз'
Что я могу абстрагироваться?
Здесь мы думаем о аргументах .Функция fetch_json
работает… но только в том случае, если мы хотим и дальше получать спрятанную версию профиля Теда Круза в Twitter.
Итак, какая часть функции повторяется . А какая часть функции меняет ?
В данном случае URL — это то, что мы хотели бы изменять каждый раз. Итак, давайте сделаем это аргументом:
def fetch_json (url):
запросы на импорт
импортировать json
resp = запросы.получить (URL)
mydata = json.loads (соответственно текст)
вернуть мои данные
Теперь мы можем указать его на любой URL-адрес, который якобы содержит текст в формате JSON. Попробуйте позвонить по номеру fetch_json
по этим URL-адресам для себя:
- http://stash.compciv.org/congress-twitter/2016-01/sensanders.json
- http://stash.compciv.org/congress-twitter/2016-01/congress-twitter-profiles.json
- https://status.github.com/api.json
- https: // status.github.com/api/status.json
- https://data.usajobs.gov/api/jobs?series=2210
Ознакомьтесь с главой 3 Эла Свигарта: Функции через Automate the Boring Stuff, чтобы получить хорошее пошаговое руководство, которое охватывает функции и некоторые из связанных с ними тем.
Функция Python, аргументы, ключевое слово Def, объясненное с примерами
В этом руководстве вы познакомитесь с концепцией функции Python. Это поможет вам научиться создавать пользовательские функции и использовать их для написания модульных программ на Python.
Функция — это независимый и многократно используемый блок кода, который вы можете назвать любым номером. раз из любого места в программе. Это важный инструмент для программистов, позволяющий разбить большой проект на более мелкие модули.
Функции — это основные строительные блоки любого языка программирования, которые программист должен научиться использовать. Python предоставляет нет. встроенных методов для прямого использования, а также позволяет определять ваши собственные функции.
Давайте теперь быстро посмотрим, что вы узнаете из этого руководства.
Содержание
Вернуться к ☛ Учебник по Python
Что такое функция Python?
Функция в Python — это логическая единица кода, содержащая последовательность операторов с отступом под именем, заданным с помощью ключевого слова def.
Функции
позволяют логически разделить большой проект на более мелкие модули. Они делают ваш код более управляемым и расширяемым.
Во время программирования предотвращает добавление повторяющегося кода и способствует повторному использованию.
Как создать функцию — Синтаксис
Синтаксис функции Python следующий.
Однострочная функция:
def single_line (): оператор
Функция Python со строкой документации:
def fn (arg1, arg2, ...): "" "строка документации" "" заявление1 выписка2
Вложенная функция Python:
def fn (arg1, arg2, ...): "" "строка документации" "" заявление1 заявление2 def fn_new (arg1, arg2 ,...): заявление1 заявление2 ... ...
ТОС
Заявление по умолчанию
Пожалуйста, прочтите примечания ниже, прежде чем создавать свою первую функцию Python.
- Ключевое слово def — это оператор для определения функции в Python.
- Вы запускаете функцию с ключевым словом def, указываете имя, за которым следует двоеточие (:).
- Вызов def создает объект функции и присваивает ему данное имя.
- В дальнейшем можно переназначить один и тот же функциональный объект другим именам.
- Дайте уникальное имя вашей функции и следуйте тем же правилам, что и идентификаторы .
- Добавьте содержательную строку документации, чтобы объяснить, что делает функция. Однако это необязательный шаг.
- Теперь запустите тело функции, добавив допустимые операторы Python с четырьмя пробелами каждый.
- Вы также можете добавить оператор для возврата значения в конце функции.Однако этот шаг не является обязательным.
- Просто нажмите клавишу ВВОД и удалите отступ, чтобы завершить функцию.
- Поскольку def — это оператор, вы можете использовать его везде, где может появиться оператор, например, вложенный в предложение if или внутри другой функции.
Пример:
если тест: def test (): # Первое определение ... еще: def test (): # Альтернативное определение ... ...
ТОС
Как вызвать функцию в Python?
Используя ключевое слово def, вы научились создавать план функции, которая имеет имя, параметры для передачи и тело с действительными операторами Python .
Следующим шагом будет его выполнение. Вы можете сделать это, вызвав его из скрипта Python, внутри функции или непосредственно из оболочки Python.
Чтобы вызвать функцию, вам нужно указать имя функции с соответствующими параметрами, и все.
Следуйте приведенному ниже примеру, чтобы узнать, как вызвать функцию в Python.
Пример вызова функции
Это простой пример, когда функция typeOfNum () имеет вложенные функции для определения четности или нечетности числа.
def typeOfNum (num): # Заголовок функции # Тело функции если число% 2 == 0: def сообщение (): print ("Вы ввели четное число.") еще: def сообщение (): print ("Вы ввели нечетное число.") сообщение() # Конец функции typeOfNum (2) # вызываем функцию typeOfNum (3) # снова вызываем функцию
ТОС
Полиморфизм в Python
В Python возможен полиморфизм функций, поскольку мы не указываем типы аргументов при создании функций.
- Поведение функции может различаться в зависимости от переданных ей аргументов.
- Одна и та же функция может принимать аргументы разных типов объектов.
- Если объекты находят соответствующий интерфейс, функция может их обработать.
Пример:
def product (x, y): вернуть x * y print (product (4, 9)) # функция возвращает 36 print (product ('Python!', 2)) # функция возвращает # Python! Python! print (product ('Python 2 or 3?', '3')) # Возникла ошибка TypeError
Приведенный выше пример поясняет, что мы можем передать любые два объекта в функцию product (), которая поддерживает оператор «*».
Концепция, которую мы объяснили выше, известна как полиморфизм. Некоторые моменты, о которых вам следует помнить, заключаются в следующем.
- Python — это язык с динамической типизацией, что означает, что типы коррелируют со значениями, а не с переменными. Следовательно, полиморфизм работает неограниченно.
- Это одно из основных отличий Python от других языков со статической типизацией, таких как C ++ или Java.
- В Python вам не нужно упоминать конкретные типы данных при кодировании.
- Однако, если вы это сделаете, тогда код ограничится типами, ожидаемыми во время кодирования.
- Такой код не позволяет использовать другие совместимые типы, которые могут потребоваться в будущем.
- Python не поддерживает какие-либо формы перегрузки функций.
ТОС
Параметры в функции
Мы часто используем термины параметры и аргументы как синонимы. Однако между ними есть небольшая разница .
Параметры — это переменные, используемые в определении функции, тогда как аргументы — это значения, которые мы передаем параметрам функции.
Python поддерживает различные варианты передачи параметров функции. Прежде чем мы обсудим каждый из них, вам следует прочитать следующие примечания.
- Аргумент присваивается имени локальной переменной после передачи функции.
- Изменение значения аргумента внутри функции не влияет на вызывающую сторону.
- Если аргумент содержит изменяемый объект, то его изменение в функции влияет на вызывающую сторону.
- Мы называем передачу неизменяемых аргументов передачей по значению, потому что Python не позволяет им изменять на месте.
- Передача изменяемых аргументов в Python является передачей по указателю, поскольку на них могут повлиять изменения внутри функции.
Пример: неизменяемые и изменяемые
def test1 (a, b): a = 'Garbage' # 'a' получает неизменяемый объект b [0] = 'Python' # 'b' получает объект списка # список изменяемый # он может претерпеть изменение места def test2 (a, b): a = 'Мусор 2' b = 'Python 3' # 'b' теперь используется для обозначения нового # объект и, следовательно, аргумент 'y' # не изменено arg1 = 10 arg2 = [1, 2, 3, 4] test1 (arg1, arg2) print ("После выполнения теста 1 =>", arg1, arg2) test2 (arg1, arg2) print ("После выполнения теста 2 =>", arg1, arg2)
После выполнения приведенный выше код напечатает следующее.
После выполнения теста 1 => 10 ['Python', 2, 3, 4] После выполнения теста 2 => 10 ['Python', 2, 3, 4]
Пример: как избежать изменения изменяемого аргумента
def test1 (a, b): a = 'Мусор' b [0] = "Python" arg1 = 10 arg2 = [1, 2, 3, 4] print ("Перед тестом 1 =>", arg1, arg2) test1 (arg1, arg2 [:]) # Создать явную копию изменяемого объекта # 'y' в функции. # Теперь 'b' в test1 () относится к # другой объект, который изначально был # копия 'arg2' print ("После теста 1 =>", arg1, arg2)
После выполнения приведенный выше код напечатает следующее.
Перед тестом 1 => 10 [1, 2, 3, 4] После теста 1 => 10 [1, 2, 3, 4]
ТОС
Стандартные аргументы
Стандартные аргументы — это те, которые вы передаете, как указано в определении функции Python. То есть без изменения их порядка и без пропуска ни одного из них.
def fn (значение): печать (значение) возвращение fn ()
Выполнение вышеуказанного кода вызывает ошибку, указанную ниже, поскольку мы не передали единственный требуемый аргумент.
TypeError: fn () отсутствует 1 обязательный позиционный аргумент: 'значение'
Аргументы на основе ключевых слов
Когда вы присваиваете значение параметру (например, param = value) и переходите к функции (например, fn (param = value)), он превращается в аргумент ключевого слова.
Если вы передаете функции аргументы ключевого слова, Python определяет ее через имя параметра, используемое в присвоении.
См. Пример ниже.
def fn (значение): печать (значение) возвращение fn (значение = 123) # output => 123 fn (value = "Python!") # output => Python!
При использовании аргументов ключевого слова вы должны убедиться, что имя в назначении должно совпадать с именем в определении функции.В противном случае Python выдает ошибку TypeError, как показано ниже.
fn (value1 = "Python!") # Неправильное имя в аргументе ключевого слова
Вышеупомянутый вызов функции вызывает следующую ошибку.
TypeError: fn () получила неожиданный аргумент ключевого слова 'value1'
Аргументы со значениями по умолчанию
Функции Python позволяют устанавливать значения по умолчанию для параметров в определении функции. Мы называем их аргументами по умолчанию.
Вызываемый использует эти значения по умолчанию, если вызывающий не передает их в вызове функции.
Приведенный ниже пример поможет вам четко понять концепцию аргументов по умолчанию.
дней по умолчанию в году (is_leap_year = False): если не is_leap_year: print («365 дней») еще: print («366 дней») возвращение daysInYear () daysInYear (True)
Здесь параметр is_leap_year работает как аргумент по умолчанию. Если вы не передадите никакого значения, будет использоваться значение по умолчанию False.
Вывод вышеуказанного кода:
365 дней 366 дней
Переменные аргументы
Вы можете столкнуться с ситуациями, когда вам нужно передать дополнительные аргументы функции Python.Мы называем их аргументами переменной длины.
Функция print () Python сама по себе является примером такой функции, которая поддерживает переменные аргументы.
Чтобы определить функцию с переменными аргументами, необходимо поставить перед параметром знак звездочки (*). Следуйте синтаксису ниже.
def fn ([std_args,] * var_args_tuple): "" "строка документации" "" function_body return_statement
Для большей ясности ознакомьтесь с приведенным ниже примером.
def инвентарь (категория, * шт.): print ("% s [items =% d]:"% (категория, len (items)), items) для элемента в элементах: print ("-", элемент) возвращение инвентарь ('электроника', 'телевизор', 'жк', 'кондиционер', 'холодильник', 'обогреватель') инвентарь ('Книги', 'python', 'java', 'c', 'c ++')
Вывод приведенного выше кода выглядит следующим образом.
Электроника [items = 5]: ('телевизор', 'ЖК-дисплей', 'кондиционер', 'холодильник', 'обогреватель') - телевидение - ЖК - ac - холодильник - обогреватель Книги [items = 4]: ('python', 'java', 'c', 'c ++') - питон - Джава - с - c ++
Обратите внимание, что вы можете выбрать, иметь ли формальный аргумент или нет в определении функции вместе с переменными аргументами.
Вы можете пропустить переменные аргументы при вызове функции. В таком случае кортеж останется пустым.
ТОС
Локальные переменные внутри функции
Локальная переменная видна только внутри блока кода, такого как функция def.
Они доступны только во время выполнения функции.
Посмотрите на приведенный ниже пример использования локальных переменных.
def fn (a, b): темп = 1 для iter в диапазоне (b): temp = temp * a возвратная температура печать (fn (2, 4)) print (temp) # ошибка: невозможно получить доступ к 'temp' вне области действия функции 'fn' print (iter) # error: невозможно получить доступ к 'iter' вне области действия функции 'fn'
В этом примере мы пытаемся получить доступ к локальным переменным вне тела функции, что приводит к ошибке NameError.
Локальные переменные функции
не сохраняют значения между вызовами. Имена, используемые внутри def, не конфликтуют с переменными вне def, даже если вы использовали такие же имена в другом месте.
В Python присвоение переменных может происходить в трех разных местах.
- Внутри def — это локально для этой функции
- В окружающем def — нелокально для вложенных функций
- Вне всех def (s) — глобально для всего файла
ТОС
Глобальные переменные в функции
Ключевое слово global — это инструкция в Python.Это позволяет переменной (именам) сохранять изменения, которые находятся вне def, на верхнем уровне файла модуля.
В одном глобальном операторе вы можете указать одно или несколько имен, разделенных запятыми.
Все перечисленные имена присоединяются к области действия включающего модуля, когда они назначаются или упоминаются в теле функции.
Посмотрите пример ниже.
х = 5 у = 55 def fn (): глобальный x х = [3, 7] y = [1, 33, 55] # здесь назначается и создается локальный 'y' # тогда как 'x' относится к глобальному имени fn () печать (х, у)
В приведенном выше коде «x» — это глобальная переменная, которая сохранит любое изменение своего значения, сделанное в функции.Другая переменная «y» имеет локальную область действия и не переносит изменения.
Давайте теперь посмотрим, как глобально объявленное имя ведет себя в двух разных функциях Python.
foo = 99 def fn1 (): foo = 'new' # создан новый локальный файл foo def fn2 (): глобальный фу foo = 'update' # значение глобального foo изменяется
В следующем примере давайте посмотрим, как global ведет себя с оператором импорта.
Здесь у нас есть следующие три скрипта:
- mod_global.py: Он содержит глобальное определение и функцию, изменяющую и отображающую значения.
- test1.py: Он импортирует первый файл и обращается к глобальной переменной.
- test2.py: Он использует предложение «from» для импорта первого файла и доступа к глобальной переменной.
# mod_global.py def fn1 (): глобальный x х = [1,2]; y = [20, 200] # создается локальная 'y' - доступна только в 'f1' # 'x' можно получить в любом месте после вызова 'f1' fn1 () пытаться : print (x, y) # имя 'y' не определено - ошибка кроме Exception as ex: print ('y ->', пример) печать ('х ->', х)
# test1.ру импорт mod_global print ('test1 ->', mod_global.x)
# test2.py из импорта mod_global * print ('test2 ->', х)
ТОС
Разрешение имени в функции Python
Важно понимать, как работает разрешение имен в случае оператора def.
Вот несколько моментов, о которых следует помнить.
- Назначения имен создают или изменяют локальные имена.
- Правило LEGB присутствует на картинке для поиска ссылки на имя.
- местный — L
- , затем включающие функции (если есть) — E
- следующий идет глобальный — G
- и последняя встроенная — B
Чтобы лучше понять, просмотрите приведенный ниже пример.
#var = 5 def fn1 (): #var = [3, 5, 7, 9] def fn2 (): #var = (21, 31, 41) печать (var) fn2 () fn1 () # одно за другим раскомментируем назначения переменных и проверяем вывод печать (var)
После раскомментирования первого присваивания «var» вывод будет:
5 5
Затем, после раскомментирования второго присваивания «var», вывод будет:
[3, 5, 7, 9] 5
Наконец, если мы раскомментируем последнее присваивание «var», то результат будет следующим.
(21, 31, 41) 5
ТОС
Поиск в функциях
Функции Python могут обращаться к именам во всех доступных включающих операторах def.
Посмотрите пример ниже.
X = 101 # имя глобальной области - не используется def fn1 (): X = 102 # Включение def local def fn2 (): print (X) # Ссылка во вложенном def fn2 () # Выводит 102: включение def local fn1 ()
Поиск по области остается в действии, даже если включающая функция уже вернулась.
def fn1 (): print ('В fn1') Х = 100 def fn2 (): print ('В fn2') print (X) # Запоминает X в охватывающей области определения return fn2 # Вернуть fn2, но не называть его action = fn1 () # Сделать, вернуть функцию action () # Вызов fn2 () сейчас: выводит 100
Результат выглядит следующим образом.
В фн1 В fn2 100
ТОС
Возвращаемые значения из функции Python
В функциях Python вы можете добавить оператор return для возврата значения.
Обычно функции возвращают одно значение. Но при необходимости Python позволяет возвращать несколько значений, используя типы коллекций, такие как кортеж или список.
Эта функция работает как вызов по ссылке, возвращая кортежи и присваивая результаты обратно исходным именам аргументов в вызывающей программе.
def returnDemo (значение1, значение2): val1 = 'Windows' val2 = 'OS X' return val1, val2 # вернуть несколько значений в кортеж var1 = 4 var2 = [2, 4, 6, 8] print ("перед возвратом =>", var1, var2) var1, var2 = returnDemo (var1, var2) print ("после возврата =>", var1, var2)
Приведенный выше код дает следующий результат.
до возврата => 4 [2, 4, 6, 8] после возврата => Windows OS X
ТОС
Примеры функций
Общие функции
Посмотрите общий пример вызова функции.
def getMin (* varArgs): min = varArgs [0] для i в varArgs [1:]: если я <мин: мин = я возврат мин min = getMin (21, -11, 17, -23, 6, 5, -89, 4, 9) печать (мин)
Результат выглядит следующим образом.
-89
Рекурсивная функция
Далее приводится пример рекурсивной функции.
def calcFact (число): если (число! = 1): return num * calcFact (число-1) еще : возврат 1 печать (calcFact (4))
Результат выглядит следующим образом.
24
ТОС
Функции Python как объекты
Да, Python рассматривает все как объект, и функции ничем не отличаются.
Вы можете присвоить объекту функции любые другие имена.
def testFunc (a, b): print ('testFunc вызван') fn = testFunc fn (22, 'bb')
Вывод:
testFunc называется
Вы даже можете передать объект функции другим функциям.
def fn1 (a, b): print ('fn1 вызван') def fn2 (удовольствие, x, y): удовольствие (x, y) fn2 (fn1, 22, 'bb')
Вывод:
фн1 звонил
Вы также можете встроить функциональный объект в структуры данных.
def fn1 (a): print ('fn1', а) def fn2 (a): print ('fn2', а) listOfFuncs = [(fn1, «Первая функция»), (fn2, «Вторая функция»)] для (f, arg) в listOfFuncs: f (arg)
Вывод:
fn1 Первая функция fn2 Вторая функция
Вы можете вернуть объект функции из другой функции.
def FuncLair (производство): def fn1 (): print ('вызывается fn1') def fn2 (): print ('fn2 вызван') def fn3 (): print ('fn3 вызван') если произвести == 1: вернуть fn1 elif произвести == 2: вернуть fn2 else: вернуть fn3 f = FuncLair (2); f ()
Вывод:
fn2 звонил
ТОС
Атрибуты функций
Функции Python также имеют атрибуты.
- Вы можете перечислить их с помощью встроенной функции dir ().
- Атрибуты могут быть определены системой.
- Некоторые из них также могут быть определены пользователем.
- Функция dir () также выводит список определенных пользователем атрибутов.
def testFunc (): print ("Я просто тестовая функция.") testFunc.attr1 = "Привет" testFunc.attr2 = 5 testFunc () печать (каталог (testFunc))
Вывод:
Я просто тестирую функцию.
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__ __ge__ ',' __get__ ',' __getattribute__ ',' __globals__ ',' __gt__ ',' __hash__ ',' __init__ ',' __kwdefaults__ ',' __le__ ',' __lt__ ',' __module__ ',' __ne__ ',' __ne__ ', , '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'attr1', '10 attr2 ']Вы можете использовать атрибуты функции для архивирования информации о состоянии вместо использования каких-либо глобальных или нелокальных имен.
В отличие от нелокальных, атрибуты доступны везде, где есть сама функция, даже вне ее кода.
ТОС
Сводка - функция Python
В этом руководстве мы рассмотрели все основные концепции функций Python.