Определение функции
def greet(name): return f"Привет, {name}!"print(greet("Anna"))Если return не указан, функция возвращает None. Вернуть можно несколько значений — фактически это кортеж:
def min_max(items): return min(items), max(items)low, high = min_max([3, 1, 4])Аргументы
Значения по умолчанию
def power(base, exp=2): return base ** expprint(power(3))print(power(3, 3))Значение по умолчанию вычисляется один раз при определении функции, поэтому изменяемые объекты в качестве значений по умолчанию использовать нельзя:
def add_item(item, items=None): if items is None: items = [] items.append(item) return itemsИменованные аргументы
def connect(host, port=80, secure=False): return host, port, secureprint(connect("localhost", secure=True))print(connect(port=8080, host="example.com"))args и *kwargs
def total(*args): return sum(args)def info(**kwargs): for key, value in kwargs.items(): print(key, value)print(total(1, 2, 3))info(name="Anna", age=25)Распаковка при вызове:
numbers = [1, 2, 3]options = {"name": "Anna", "age": 25}print(total(*numbers))info(**options)Только позиционные и только именованные
def f(a, b, /, c, *, d): return a, b, c, dprint(f(1, 2, 3, d=4))print(f(1, 2, c=3, d=4))Параметры до / передаются только позиционно, после * — только по имени.
Область видимости
Python ищет имена по правилу LEGB: Local, Enclosing, Global, Built-in.
counter = 0def increment(): global counter counter += 1def outer(): value = 0 def inner(): nonlocal value value += 1 return value return innernext_value = outer()print(next_value())print(next_value())Злоупотреблять global не стоит — предпочтительнее передавать данные через аргументы и возвращаемые значения.
Функции как объекты
Функции — полноценные объекты, их можно передавать и возвращать:
def apply(func, value): return func(value)print(apply(len, "abc"))print(apply(str.upper, "abc"))Лямбда-выражения
square = lambda x: x ** 2print(square(5))words = ["apple", "fig", "banana"]print(sorted(words, key=lambda w: len(w)))map, filter
nums = [1, 2, 3, 4]print(list(map(lambda x: x * 2, nums)))print(list(filter(lambda x: x % 2 == 0, nums)))В большинстве случаев списковые включения читаются лучше.
Рекурсия
def factorial(n): if n <= 1: return 1 return n * factorial(n - 1)print(factorial(5))Глубина рекурсии ограничена (по умолчанию около 1000 вызовов), оптимизации хвостовой рекурсии в Python нет.
Строки документации
def area(width, height): """Возвращает площадь прямоугольника.""" return width * heightprint(area.__doc__)Задания
- Напишите функцию, принимающую произвольное число аргументов и возвращающую их среднее.
- Реализуйте функцию Фибоначчи рекурсивно и с помощью цикла, сравните скорость.
- Напишите функцию-счётчик на замыканиях.
