Функция – это предназначенный для выполнения конкретной задачи изолированный блок кода, который можно повторно использовать. Функции делают код программы модульным и более компактным.
Python предлагает множество встроенных функций. Вы наверняка знакомы с такими:
- print() выводит объект в терминал.
- int() преобразовывает строки или числа в целые числа.
- len() возвращает длину объекта.
Имя функции содержит круглые скобки и может содержать параметры.
Данное руководство научит вас определять пользовательские функции.
Определение функции
Читайте также: Написание простой программы в Python 3
Для начала попробуйте преобразовать простую программу «Hello, World!» в функцию.
Создайте новый текстовый файл hello.py, а затем определите функцию.
Для определения функции используется ключевое слово def, затем указывается имя функции и круглые скобки, в которых могут находиться параметры (если параметров нет, скобки остаются пустыми), в конце ставится двоеточие.
Чтобы определить функцию hello(), добавьте в файл hello.py:
def hello():
Это исходное определение функции.
Далее нужно добавить вторую строку с 4 пробелами в начале. Она будет определять задачу, которую выполняет функция (в данном случае функция будет выводить в консоль фразу Hello, World!):
def hello():
print("Hello, World!")
Теперь функция определена. Но если на данном этапе запустить программу, ничего не произойдёт: чтобы функция работала, её нужно не только определить, он и вызвать.
После определения функции вызовите её:
def hello():
print("Hello, World!")
hello()
Теперь запустите программу:
python hello.py
Она должна вернуть:
Hello, World!
Функция hello() – довольно простой пример. Функции могут быть гораздо сложнее: содержать циклы for, условные выражения и другие компоненты.
Читайте также:
К примеру, приведённая ниже функция использует условное выражение, чтобы проверить строку name на наличие гласных, а затем итерирует эту строку с помощью цикла for.
# Определение функции names()
def names():
# Переменная name с вводными данными
name = str(input('Enter your name: '))
# Поиск гласных в строке name
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Итерация строки name
for letter in name:
print(letter)
# Вызов функции
names()
На примере функции names(), которая использует условное выражение и цикл for, можно увидеть, как в определении функции должен быть организован код. Хотя, конечно, код функции во многом зависит от её цели. В некоторых случаях условное выражение и цикл for нужно разделить на два разных блока.
Параметры функции
Только что вы написали простую функцию без параметров: круглые скобки остались пустыми. Теперь попробуйте создать функцию с параметрами.
Параметр – это именованный объект, определяющий аргумент, который может принять функция.
Попробуйте написать простую программу с параметрами x, y и z. Создайте функцию, которая складывает эти параметры и выводит результат. Вызовите функцию и передайте ей числа. Создайте файл add_numbers.py и добавьте в него код:
def add_numbers(x, y, z):
a = x + y
b = x + z
c = y + z
print(a, b, c)
add_numbers(1, 2, 3)
Параметр x имеет значение 1, y – 2, а z – 3.
Значения присваиваются каждому параметру по порядку.
Программа выполняет следующие вычисления:
a = 1 + 2
b = 1 + 3
c = 2 + 3
Также программа выводит значения a, b и c. Давайте запустим программу и посмотрим на результат:
python add_numbers.py
3 4 5
Параметры – это аргументы, которые в функции определяются как переменные. При запуске метода им можно присваивать значения и передавать их функции.
Именованные аргументы
Параметры можно вызывать не только ко порядку. Именованные аргументы позволяют вызывать параметры по имени.
При этом параметры можно вызывать в том порядке, в котором они определены. Интерпретатор Python будет использовать имя параметра для поиска требуемого значения.
Создайте функцию, которая будет выводить информацию о профиле пользователя. Откройте файл profile.py и передайте ей параметры username (строка) и followers (целое число).
# Определение функции с параметрами
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
username
followers
profile_info()
В определении функции profile_info() параметры username и followers взяты в круглые скобки. Блок функции выводит строку с информацией о пользователе на основе двух параметров.
Вызовите функцию и присвойте ей параметры:
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
# Вызов функции с присвоенными параметрами
profile_info("8hostblog", 945)
# Вызов функции с именованным аргументом
profile_info(username="AlexFisher", followers=342)
В первом вызове используется имя 8hostblog с количеством подписчиков 945. Во втором вызове используется именованные аргументы.
Запустите программу:
python profile.py
Username: 8hostblog
Followers: 945
Username: AlexFisher
Followers: 342
В выводе вы видите имя и количество подписчиков каждого пользователя.
Вы можете изменить порядок отображения параметров в этой программе:
def profile_info(username, followers):
print("Username: " + username)
print("Followers: " + str(followers))
# Изменение порядка параметров
profile_info(followers=820, username="Cameron-Tailor")
Попробуйте снова запустить программу. Вы получите такой результат:
Username: Cameron-Tailor
Followers: 820
Благодаря именованным аргументам вы можете вызывать параметры функции в любом порядке.
Значения параметров по умолчанию
Также можно устанавливать значения параметров по умолчанию. Попробуйте присвоить параметру followers значение по умолчанию 1.
def profile_info(username, followers=1):
print("Username: " + username)
print("Followers: " + str(followers))
Теперь можно запустить функцию с параметром username, а followers будет по умолчанию иметь значение 1. При желании значение followers можно изменить.
def profile_info(username, followers=1):
print("Username: " + username)
print("Followers: " + str(followers))
profile_info(username="Steve")
profile_info(username="8hostblog", followers=945)
Запустите программу. На экране появится:
Username: Steve
Followers: 1
Username: 8hostblog
Followers: 945
Возвращение значения
Вы можете передавать значение параметра в функцию, но и сама функция может возвращать значения.
Для этого используется оператор return, который останавливает выполнение функции и возвращает значение. Без аргументов оператор return вернёт значение None.
До этого вместо return в функции использовался оператор print(). Теперь попробуйте создать программу, которая будет возвращать значение с помощью return.
В текстовом файле square.py создайте программу, которая возводит в квадрат значение х и возвращает значение переменной y. Вызовите переменную result, значение которой получается путём выполнения функции square() с аргументом 3.
def square(x):
y = x ** 2
return y
result = square(3)
print(result)
Запустите программу:
python square.py
9
Теперь для примера попробуйте закомментировать выражение return:
def square(x):
y = x ** 2
# return y
result = square(3)
print(result)
Запустите программу:
python square.py
None
Без выражения return программа не может вернуть значение, потому возвращает значение по умолчанию, None.
Вернёмся к предыдущему примеру, программе add_numbers.py. Замените print() оператором return.
def add_numbers(x, y, z):
a = x + y
b = x + z
c = y + z
return a, b, c
sums = add_numbers(1, 2, 3)
print(sums)
Вне тела функции определена переменная sums, значение которой равно результату функции с параметрами 1, 2 и 3.
Запустите программу:
python add_numbers.py
(3, 4, 5)
Программа возвращает такой же результат, как и с print(). В данном случае в качестве результата возвращается кортеж.
Читайте также: Кортежи в Python 3
Достигая оператора return, функция прекращает выполнение.
# Файл return_loop.py
def loop_five():
for x in range(0, 25):
print(x)
if x == 5:
# Stop function at x == 5
return
print("This line will not execute.")
loop_five()
Оператор return в цикле for прекращает выполнение функции, потому строки после функции не будут запущены. Если бы вместо него использовался оператор break, программа прекратила бы выполнение цикла, а не функции, и последнее выражение print() было бы обработано.
Функция main()
В языке Python функцию можно вызвать в конце программы, и она запустится (как показано в предыдущих примерах), однако некоторым языкам программирования (например, C++ или Java) требуется функция main. Функция main() в Python необязательна, но она позволяет логически структурировать программу Python и объединить наиболее важные её компоненты в одну функцию. Также с её помощью программы Python легче читать программистам, которые работают с другими языками.
Вернитесь в файл hello.py и добавьте функцию main(), сохранив при этом функцию hello().
def hello():
print("Hello, World!")
def main():
В функцию main() добавьте выражение print(). Затем вызовите функцию hello() внутри функции main().
def hello():
print("Hello, World!")
def main():
print("This is the main function")
hello()
В конце файла вызовите функцию main().
def hello():
print("Hello, World!")
def main():
print("This is the main function.")
hello()
main()
Теперь можно запустить программу:
python hello.py
This is the main function.
Hello, World!
Теперь попробуйте использовать несколько функций.
Читайте также: Использование переменных в Python 3
Если вы определяете переменную внутри блока функции, вы сможете использовать её только внутри этой функции. Если же вы хотите использовать переменную в нескольких функциях, объявите глобальную переменную.
В Python область выполнения высокоуровневого кода называется __main__. Когда программа запускается из стандартного ввода, скрипта или интерактивного запроса, __name__ равно __main__.
Потому в программах используется такая конструкция:
if __name__ == '__main__':
# Код основной программы
Эта конструкция работает как разделитель, благодаря чему файл можно использовать как:
- Основную программу (и запустить код после конструкции if).
- Модуль (и не выполнять код после if).
Весь код, который находится вне этого выражения, будет выполнен при запуске. Если вы используете файл программы в качестве модуля, код вне этого выражения будет выполнен после импорта при выполнении вторичного файла.
Попробуйте расширить программу names.py. Создайте новый файл more_names.py; в этом файле объявите глобальную переменную и измените исходную функцию names(), разделив задачи на две дискретные функции.
Первая функция, has_vowel(), будет проверять строку name на наличие гласных. Вторая функция, print_letters(), будет выводить каждую букву строки name.
# Объявление глобальной переменной (для работы со всеми функциями)
name = str(input('Enter your name: '))
# Определение функции, которая будет искать гласные в name
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Итерация букв строки name
def print_letters():
for letter in name:
print(letter)
Теперь определите функцию main(), которая будет вызывать has_vowel() и print_letters().
# Объявление глобальной переменной (для работы со всеми функциями)
name = str(input('Enter your name: '))
# Определение функции, которая будет искать гласные в name
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Итерация букв строки name
def print_letters():
for letter in name:
print(letter)
# Определение главного метода, который вызывает другие функции
def main():
has_vowel()
print_letters()
Затем добавьте конструкцию if __name__ == ‘__main__’: в конец файла.
В данном случае все функции помещены в функцию main(). Потому после конструкции нужно вызвать функцию main().
# Объявление глобальной переменной (для работы со всеми функциями)
name = str(input('Enter your name: '))
# Определение функции, которая будет искать гласные в name
def has_vowel():
if set('aeiou').intersection(name.lower()):
print('Your name contains a vowel.')
else:
print('Your name does not contain a vowel.')
# Итерация букв строки name
def print_letters():
for letter in name:
print(letter)
# Определение главного метода, который вызывает другие функции
def main():
has_vowel()
print_letters()
# Вызов функции main()
if __name__ == '__main__':
main()
Теперь можно запустить программу:
python more_names.py
Программа вернёт такой же вывод, как и names.py, но теперь код программы лучше организован, и его можно использовать как модуль без изменений.
Если вы не хотите определять функцию main(), вы можете закончить программу так:
...
if __name__ == '__main__':
has_vowel()
print_letters()
Функция main() и конструкция if __name__ == ‘__main__’: позволяют логически организовать код, делают его модульным и удобочитаемым.
Заключение
Функции – это блоки кода, предназначенные для выполнения той или иной задачи, которые можно повторно использовать.
Читайте также: Создание модулей Python 3