Выполнение функций в языке Python
Основные способы вызова функций в Python
Базовый вызов функции с точкой входа
Самый распространённый способ выполнить функцию в Python — определить её с помощью def и вызвать по имени с круглыми скобками. Для организации запуска только при непосредственном выполнении скрипта используется проверка if __name__ == "__main__". Это позволяет импортировать модуль без выполнения основного кода.
def say_hello(name):
return f"Привет, {name}!"
if __name__ == "__main__":
print(say_hello("Мир"))
Python выполнить функцию (выполнение функции в python)
Привет, Мир!
как сделать скрипт python (создание скрипта python)
Типичные ошибки:
- Забыть поставить круглые скобки при вызове — тогда переменная будет ссылаться на объект функции, а не на результат.
- Не импортировать модуль правильно — функция может быть не определена в текущей области видимости.
Как передать функции произвольное количество аргументов?
Можно использовать позиционные аргументы, именованные, а также *args (кортеж) и **kwargs (словарь). Это удобно для функций с переменным числом параметров.
def collect(*args, **kwargs):
print("Позиционные:", args)
print("Именованные:", kwargs)
collect(1, 2, 3, name="Alice", age=30)
Позиционные: (1, 2, 3)
Именованные: {'name': 'Alice', 'age': 30}
Возможные проблемы:
- Перепутать порядок: позиционные аргументы должны идти до именованных.
- Использовать одинаковые имена для
*argsи**kwargs— они могут конфликтовать с другими параметрами.
Как выполнить функцию, определённую в другом файле?
Для этого нужно импортировать модуль или конкретную функцию и вызвать её с указанием пространства имён.
# file: mymodule.py
def greet():
return "Hello from module"
# main.py
from mymodule import greet
print(greet())
Hello from module
Ошибки:
- Модуль не найден — проверьте
PYTHONPATHили расположение файла. - Циклический импорт — когда два модуля импортируют друг друга.
Как вызвать функцию рекурсивно?
Функция может вызывать саму себя, пока не выполнится базовое условие. Это используется для задач, разбивающихся на подзадачи, например, вычисление факториала.
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(5))
120
Типичные проблемы:
- Отсутствие базового случая — приведёт к
RecursionError(переполнение стека). - Слишком глубокая рекурсия — Python по умолчанию ограничивает глубину (обычно 1000). Решение — увеличить лимит через
sys.setrecursionlimit()или перейти на итерацию.
Как определить и сразу выполнить простую функцию?
Анонимные функции lambda позволяют создать однострочную функцию без имени и тут же её вызвать. Они часто используются в сочетании с map, filter, sorted.
add = lambda x, y: x + y
print(add(2, 3))
# Сразу вызвать без присваивания
print((lambda a, b: a * b)(4, 5))
5 20
Ошибки:
- Lambda не может содержать операторы или выражения, только одно выражение.
- Забыть скобки для немедленного вызова — тогда будет выведен объект функции.
Как применить функцию к каждому элементу последовательности?
Функция map() применяет переданную функцию ко всем элементам итератора и возвращает итератор. Результат можно преобразовать в список.
def square(x):
return x ** 2
numbers = [1, 2, 3, 4]
squared = list(map(square, numbers))
print(squared)
[1, 4, 9, 16]
Частые ошибки:
- Забыть преобразовать map в список — будет выведен объект map.
- Передать функцию неправильного типа — должна быть вызываемой.
Как выполнить функцию по имени, хранящемуся в строке?
Для динамического вызова можно использовать getattr() для методов объекта или eval() / exec() для произвольного кода. Однако eval требует осторожности из-за безопасности.
def hello():
print("Hello!")
func_name = "hello"
# Через globals
globals()[func_name]()
# Через eval
eval(func_name + "()")
Hello! Hello!
Проблемы:
evalвыполняет произвольный код — опасно при работе с пользовательским вводом.- При использовании
globals()функция должна быть в глобальной области.
Расширенные примеры выполнения функций
Декораторы с аргументами
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
Hello, Alice! Hello, Alice! Hello, Alice!
Частичное применение functools.partial
from functools import partial
def power(base, exp):
return base ** exp
square = partial(power, exp=2)
cube = partial(power, exp=3)
print(square(5))
print(cube(2))
25 8
Выполнение функции в отдельном потоке (threading)
import threading
import time
def print_numbers():
for i in range(5):
print(i)
time.sleep(0.5)
thread = threading.Thread(target=print_numbers)
thread.start()
thread.join()
print("Thread finished")
0 1 2 3 4 Thread finished
Генератор и выполнение функции-генератора (yield)
def countdown(n):
while n > 0:
yield n
n -= 1
gen = countdown(3)
for val in gen:
print(val)
3 2 1
Выполнение через объект класса с __call__
class Adder:
def __init__(self, increment):
self.increment = increment
def __call__(self, x):
return x + self.increment
add_five = Adder(5)
print(add_five(10)) # объект ведёт себя как функция
15
Параллельное выполнение с concurrent.futures
from concurrent.futures import ThreadPoolExecutor
def square(x):
return x * x
with ThreadPoolExecutor(max_workers=3) as executor:
results = list(executor.map(square, [1, 2, 3, 4]))
print(results)
[1, 4, 9, 16]
Выполнение функции по условию с использованием getattr
class Calculator:
def add(self, a, b):
return a + b
def sub(self, a, b):
return a - b
calc = Calculator()
op = "add"
result = getattr(calc, op)(10, 5)
print(result)
15
Использование operator.methodcaller
from operator import methodcaller
s = "hello world"
upper_caller = methodcaller("upper")
print(upper_caller(s))
replace_caller = methodcaller("replace", "world", "Python")
print(replace_caller(s))
HELLO WORLD hello Python