Локальные переменные
Внутри функции можно создавать переменные, как и везде. Но такая переменная существует только внутри функции: она создаётся, когда функция выполняется, и исчезает, когда функция заканчивается. За пределами функции Python её не знает:
def greet():
message = "Привет!"
print(message)
greet()
print(message)Выведется:
Привет!
Traceback (most recent call last):
File "<exec>", line 6, in <module>
NameError: name 'message' is not definedВызов greet() сработал, но последняя строка ищет message вне функции, где её нет. С параметрами то же самое: они существуют только внутри своей функции.
Часть программы, в которой существует переменная, называется её областью видимости. Переменная, созданная внутри функции, локальная: она принадлежит только этой функции. Переменную, созданную вне всех функций, можно использовать в любом месте программы, в том числе внутри функций:
shop_name = "Мир питомцев"
def print_label(product):
print(f"{shop_name}: {product}")
print_label("корм для собак")Выведется:
Мир питомцев: корм для собакЧем полезно, что локальные переменные остаются внутри своих функций?
- Функции не мешают друг другу. В двух функциях может быть по переменной
total, и это две разные переменные: изменение одной не меняет другую. - Чтобы пользоваться функцией, достаточно знать, что ей дать (аргументы) и что она вернёт (возвращаемое значение). Как она устроена внутри — её собственное дело.
- Каждый вызов начинается с чистого листа: переменные функции создаются заново, и от предыдущего вызова ничего не остаётся.
Функция может прочитать переменную снаружи, но не может просто изменить её. Когда вы присваиваете значение переменной внутри функции, Python создаёт новую локальную переменную, даже если снаружи есть переменная с таким же именем:
score = 10
def reset_score():
score = 0
reset_score()
print(score)Выведется:
10Функция создала собственную локальную score и присвоила ей 0, а score снаружи осталась равной 10. (А score += 1 внутри функции даже завершилась бы ошибкой UnboundLocalError.)
Правило простое: значения попадают в функцию через параметры, а выходят с помощью return. Когда вам нужно значение из функции, не лезьте в её переменную. Верните значение и сохраните его там, где вызываете функцию.
Задание
- 1
Программа завершается ошибкой
NameError: name 'total' is not defined, потому чтоtotalсуществует только внутри функции. Исправьте это: вернитеtotalиз функции. Под функцией сохраните результат вызоваtotal_price(25, 4)в переменнуюbillи выведитеbillвместоtotal. Программа выведет100. - 2
За доставку каждого заказа берут ещё
5. Дайте функции третий параметр,delivery, со значением по умолчанию5и прибавьте его к сумме внутри функции. Тогда программа выведет105.