Выполнение функций в языке Python

Раздел: Разработка на Python -> Запуск 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

Выполнение функции в Python - comments

En
Python выполнить функцию (python)