Введение
В этой статье научимся создавать собственные функции, рассмотрим каких видов они бывают и чем глобальная переменная отличается от локальной.
Термины, которые будем использовать:
функция, параметры, аргументы, локальные и глобальные переменные, область видимости переменных, snake case.
Что такое функция
Функция — это вынесенный блок кода, который выполняет определённый алгоритм.
Чтобы вызвать функцию, достаточно написать её имя и передать аргументы, если это необходимо, раньше мы активно пользовались встроенными функциями, но сейчас научимся создавать собственные.
Назначение функций
- Повторное использование кода: напиши один раз — используй сколько угодно.
- Большая программа разбивается на логические блоки (функции).
- Можно использовать сложную функцию, не вникая в то, как именно она работает внутри, главное — какой результат возвращает.
Легче найти ошибку в одной маленькой функции, чем в большом монолитном коде.
Синтаксис собственной функции
def say_hello():
print(«Привет, мир!»)
def — ключевое слово, обозначающее начало блока функции,
say_hello() — имя функции, может быть любым (не зарезервированным), в круглых скобках можно указать параметры, которая функция должна принимать (в нашем примере их нет). Принято придерживаться snake_case — слова отделяются нижним подчёркиванием и начинаются с маленькой буквы. Тело функции начинается после двоеточия и каждая строка идёт с отступом.
Важно! Код в теле функции не выполняется сам по себе, чтобы он выполнился, нужно явно вызвать функцию. Причём вызов должен быть ниже в коде, чем сама функция.
Пример:
def say_hello():
print(«Привет, мир!»)
say_hello()
Вывод: Привет, мир!
Но если попытаться вызвать функцию до её инициализации, возникнет ошибка:
say_hello()
def say_hello():
print(«Привет, мир!»)
NameError: name ‘say_hello’ is not defined
Функции, которые получают данные: параметры и аргументы
Параметр — это переменная в определении функции (внутри скобок def).
Аргумент — это конкретное значение, которое мы передаём функции при вызове.
Простой пример с одним параметром
def greet(name):
print(«Привет, » + name)
greet(«Анна») # «Анна» — аргумент
Вывод: Привет, Анна
Функция с несколькими параметрами
def introduce(name, age):
print(f»Меня зовут {name}, мне {age} лет.»)
introduce(«Петр», 25)
Вывод: Меня зовут Петр, мне 25 лет.
Важно! Аргументы для функции передаются в том же порядке, в котором были объявлены параметры.
Функции, которые возвращают результат: ключевое слово return
return — ключевое слово, значение после которого будет возвращено основной программе, которая эту функцию вызвала. Например, когда мы вызвали функцию len(), она возвращала нам длину строки — число, которое мы в дальнейшем использовали.
def add(a, b):
result = a + b
return result
sum_result = add(5, 3) # результат (8) сохраняется в переменную
print(sum_result * 2) # можно работать с результатом дальше (16)
У одной функции может быть несколько return в зависимости от условий и входных данных, но как только сработает один из них, дальнейший блок кода выполняться уже не будет — это как break для цикла.
def is_positive(x):
if x > 0:
return True
return False
print(is_positive(5)) # True
print(is_positive(0)) # False
print(is_positive(–9)) # False
В зависимости от знака функция возвращает булевое значение, но всегда только одно: если условие истинно, вернётся True и блок кода завершится, если ложно — вернётся False.
Так как выражение x >0 само по себе возвращает булевое значение, функцию можно упростить:
def is_positive(x):
return x > 0
Области видимости переменных (локальные и глобальные)
Локальная переменная — это твой личный дневник, который лежит в твоей комнате. Его видишь и меняешь только ты. Из кухни или с улицы до него не дотянуться.
Глобальная переменная — это доска объявлений в подъезде твоего дома. Её видят все жильцы (все функции в твоей программе) и могут читать, что на ней написано.
Это глобальная область (наш «подъезд»)
global_message = «Я на доске в подъезде (глобальная)» # Глобальная переменная
global_counter = 0 # ещё одна глобальная переменная
def read_from_porch():
Функция — как жилец, который вышел из квартиры в подъезд
print(«Читаю объявление:», global_message)
read_from_porch() # Выведет: «Читаю объявление: Я на доске в подъезде (глобальная)»
То есть глобальная переменная global_message видна изнутри функции.
global_message = «Я на доске в подъезде»
def close_the_door():
# Мы зашли в функцию (в свою комнату) и закрыли дверь
local_secret = «Мой личный пароль (локальная)» # Локальная переменная
print(«Внутри комнаты я знаю:», local_secret) # Её видно ТОЛЬКО здесь
close_the_door() # Выведет: «Внутри комнаты я знаю: Мой личный пароль (локальная)»
# А теперь попробуем прочесть локальную переменную снаружи:
# print(local_secret) # NameError: name ‘local_secret’ is not defined
К локальным переменным можно обращаться только внутри функции, в которой они были созданы, снаружи — нельзя.
| Признак | Локальная переменная | Глобальная переменная |
|---|---|---|
| Где создаётся | Внутри функции | В основном коде, вне функций |
| Где видна | Только внутри своей функции. | Во всей программе (во всех функциях). |
| Время жизни | Создаётся при вызове функции, уничтожается при её завершении. | Существует всё время работы программы. |
| Как изменить из функции | Изменяется напрямую. | Передать как аргумент, вернуть результат. |
Главное правило
Вход: функция получает данные только через аргументы в скобках.
Работа: всё, что нужно для работы, функция создаёт внутри себя как локальные переменные.
Выход: результат своей работы функция отправляет наружу только через return.
Следуй этому простому правилу, и все ошибки обойдут тебя стороной.
Задание для самопроверки
Задание 1.
Напиши функцию is_even(num), которая возвращает True, если число чётное, и False — если нет.
def is_even(num):
return num % 2 == 0
Задание 2.
Напиши функцию find_max(list_of_numbers), которая возвращает максимальное число из списка. Пользоваться встроенное функцией max() нельзя.
def find_max(list_of_numbers):
res = list_of_numbers[0]
for x in list_of_numbers:
if x > res:
res = x
return res
Задание 3.
Усложни функцию greet(), чтобы она могла принимать не только имя, но и язык приветствия (например, «en» или «ru»), и возвращала соответствующее приветствие.
def greet(name, language):
if language == «ru»:
return f»Привет, {name}»
return f»Hello, {name}»
Автор:
Быкова Оксана, методист «100балльного репетитора» по информатике ЕГЭ