---
title: "Итераторы, генераторы, и декораторы"
seo:
  title: "Итераторы, генераторы, и декораторы — Python Developer"
  description: "Тема «Итераторы, генераторы, и декораторы» для собеседования Python Developer. Что такое декоратор? Чем отличается декоратор от итератора?"
---

[Все темы Python Developer](/python-developer)

## <strong>Что такое декоратор?</strong> [#q-14bee738d69b810ca194dbb655da6522]

Декоратор в Python - это функция, которая позволяет изменять поведение другой функции без изменения ее кода. Он принимает функцию в качестве аргумента и возвращает другую функцию. Декораторы часто используются для добавления функциональности к существующим функциям.

<strong>Пример&#58;</strong>

```python
def my_decorator(func):
    def wrapper():
        print("До вызова функции")
        func()
        print("После вызова функции")
    return wrapper

@my_decorator
def say_hello():
    print("Привет!")

say_hello()
```

Этот код создает декоратор <code>my_decorator</code>, который добавляет вывод сообщений до и после вызова функции <code>say_hello&#40;&#41;</code>. Использование декоратора <code>&#64;my_decorator</code> перед определением функции <code>say_hello&#40;&#41;</code> применяет этот декоратор к функции <code>say_hello&#40;&#41;</code>.

:::note[Ссылки для изучения]

1. [Декоратор в Python](https://habr.com/ru/companies/otus/articles/727590/)
   :::

---

## <strong>Чем отличается декоратор от итератора?</strong> [#q-14bee738d69b8152bfdcdd25c1e655f9]

Декоратор и итератор - это два различных концепта в Python.

#### <strong>Декоратор</strong>&#58;

- Декоратор в Python - это функция, которая позволяет изменять поведение другой функции без изменения ее кода.

- Он принимает функцию в качестве аргумента и возвращает другую функцию.

- Декораторы часто используются для добавления функциональности к существующим функциям.

#### <strong>Итератор</strong>&#58;

- Итератор в Python - это объект, который представляет последовательность элементов.

- Он обеспечивает методы для поочередного доступа к элементам последовательности.

- Итераторы используются для эффективного перебора элементов в цикле или другой операции, такой как генераторы списков.

Таким образом, основное отличие между декоратором и итератором заключается в их назначении и способе использования. Декораторы изменяют поведение функций, а итераторы предоставляют возможность эффективно перебирать элементы последовательности.

:::note[Ссылки для изучения]

1. [Декоратор в Python](https://habr.com/ru/companies/otus/articles/727590/)

1. [Итератор в Python](https://sky.pro/media/chto-takoe-iteratory-i-kak-ih-ispolzovat-v-python/)
   :::

---

## <strong>Чем отличаются итераторы от генераторов?</strong> [#q-14bee738d69b81f789ffed2cba589e54]

Итераторы могут быть созданы с использованием классов или функции <code>iter&#40;&#41;</code>, а генераторы создаются с использованием ключевого слова <code>yield</code>. Генераторы являются удобным итераторным подходом для создания последовательностей данных.

:::note[Ссылки для изучения]

1. [Разница между итераторами и генераторами в Python](https://sky.pro/media/raznicza-mezhdu-generatorami-i-iteratorami-v-python/)
   :::

---

## <strong>Каков синтаксис итератора в Python и для каких целей он используются?</strong> [#q-14bee738d69b813aa818ecdeff5702c5]

Итератор в Python представляет собой объект, который предоставляет методы для поочередного доступа к элементам последовательности. Синтаксис итератора в Python включает использование функций <code>iter&#40;&#41;</code> и <code>next&#40;&#41;</code>. Функция <code>iter&#40;&#41;</code> принимает объект и возвращает его итератор, а функция <code>next&#40;&#41;</code> используется для получения следующего элемента из итератора.

Метод <code>\_\_iter\_\_&#40;&#41;</code> в классе используется для создания итератора, который возвращает себя. Метод <code>\_\_next\_\_&#40;&#41;</code> возвращает следующий элемент последовательности и вызывается функцией <code>next&#40;&#41;</code> для доступа к последующим элементам.

<strong>Синтаксис&#58;</strong>

```python
# Создание итератора
my_iter = iter(iterable)

# Получение следующего элемента
next_element = next(my_iter)
```

Итераторы используются для эффективного перебора элементов в цикле или других операциях, таких как генераторы списков, фильтрация, суммирование и другие манипуляции с данными. Они позволяют работать с большими объемами данных, не загружая их все в память одновременно.

:::note[Ссылки для изучения]

1. [Итератор в Python](https://sky.pro/media/chto-takoe-iteratory-i-kak-ih-ispolzovat-v-python/)
   :::

---

## <strong>Каков синтаксис генератора в Python и для каких целей он используются?</strong> [#q-14bee738d69b816a8369dfd921d757a5]

Генератор в Python - это специальный тип итератора, который создается с использованием ключевого слова <code>yield</code>. Он используется для генерации последовательности значений без необходимости загрузки их всех в память одновременно. Генераторы удобны для создания итераторов в функциональном стиле с минимальным объемом кода.

<strong>Синтаксис&#58;</strong>

```python
def my_generator():
    yield value
```

Генератор определяется с использованием ключевого слова <code>def</code>, а затем вместо оператора <code>return</code> используется оператор <code>yield</code>, который возвращает значение и приостанавливает выполнение функции до следующего вызова.

:::note[Ссылки для изучения]

1. [Генератор в Python](https://sky.pro/media/chto-takoe-generatory-i-kak-ih-ispolzovat-v-python/)
   :::

---

## <strong>Приведите несколько примеров декораторов в Python.</strong> [#q-14bee738d69b812ba702e296a6de48f5]

<strong>Вот несколько примеров декораторов в Python&#58;</strong>

<strong>Декоратор для замера времени выполнения функции&#58;</strong>

```python
import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} executed in {end_time - start_time} seconds")
        return result
    return wrapper

@timer
def example_function():
    time.sleep(2)
    print("Function executed")

example_function()
```

<strong>Декоратор для проверки аргументов функции&#58;</strong>

```python
def validate_input(func):
    def wrapper(*args, **kwargs):
        for arg in args:
            if not isinstance(arg, int):
                raise TypeError("Function arguments must be integers")
        return func(*args, **kwargs)
    return wrapper

@validate_input
def add(x, y):
    return x + y

print(add(3, 5))  # Вывод: 8
```

<strong>Декоратор для кэширования результатов функции&#58;</strong>

```python
def memoize(func):
    cache = {}

    def wrapper(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]

    return wrapper

@memoize
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # Вывод: 55
```

:::note[Ссылки для изучения]

1. [Декоратор в Python](https://habr.com/ru/companies/otus/articles/727590/)
   :::

---

## <strong>Приведите несколько примеров генераторов, итераторов в Python.</strong> [#q-14bee738d69b8100b771f5d90d5571e7]

<strong>Вот несколько примеров генераторов и итераторов в Python&#58;</strong>

<strong>Генератор для генерации последовательности чисел Фибоначчи&#58;</strong>

```python
def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci_generator()
for _ in range(10):
    print(next(fib))  # Вывод: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
```

<strong>
  Генератор для генерации бесконечной последовательности случайных чисел&#58;
</strong>

```python
import random

def random_number_generator():
    while True:
        yield random.randint(1, 100)

rand_gen = random_number_generator()
for _ in range(10):
    print(next(rand_gen))  # Вывод: случайные числа от 1 до 100
```

<strong>Итератор для итерации по строке в обратном порядке&#58;</strong>

```python
class ReverseIterator:
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.data[self.index]

rev_iter = ReverseIterator("hello")
for char in rev_iter:
    print(char)  # Вывод: o, l, l, e, h
```

<strong>Генератор для чтения файла построчно&#58;</strong>

```python
def read_file(filename):
    with open(filename, 'r') as file:
        for line in file:
            yield line.strip()

file_gen = read_file("example.txt")
for line in file_gen:
    print(line)
```

:::note[Ссылки для изучения]

1. [Генератор в Python](https://skillbox.ru/media/code/generatory_python_chto_eto_takoe_i_zachem_oni_nuzhny/)

1. [Итератор в Python](https://sky.pro/media/chto-takoe-iteratory-i-kak-ih-ispolzovat-v-python/)
   :::
