Задать вопрос
hardy_99
@hardy_99
Python developer

Как работают генераторы в Пайтон?

class GenerateFileName:
    letters = "bcdfghjklaeioumnpqrstvwxyzaeiou"

    def __init__(self, length: int = None):
        self.length = 8 if not length else length
        self.name = ""

    def generate_random_name(self):
        new_name = "".join(random.choice(self.letters) for _ in range(self.length))
        self.name = new_name
        return self


Обращаем внимание на строку
self.new_name = "".join(random.choice(self.letters) for _ in range(self.length))


Например значение self.length равно 8

Тут генератор:
  • сразу присваивает "01234567" к строке и адрес строки предается к self.new_name
  • или строка меняется с каждым yield-oм, то есть сначала она "0" потом "01".... "01234567", потом её адрес предается к self.new_name?
  • Вопрос задан
  • 141 просмотр
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
join() вызывает под капотом list() на переданном генераторе, а list() опрашивает весь генератор.
Так что сначала генерится список вида ['0', '1', '2', '3', '4', '5', '6', '7'], что позволяет сразу рассчитать объём памяти, нужный для итоговой строки. Потом по этому списку уже формируется итоговая строка.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@wintreist
1. Вариант ответа.
Строка приравнивается только в момент готовности (01234567), но в "".join() происходит её итеративное создание.
str.join(iterable)
    Return a string which is the concatenation of the strings in iterable. A TypeError will be raised if there are any non-string values in iterable, including bytes objects. The separator between elements is the string providing this method.

Join итерируем, поэтому сначала произойдет создание строки справа от приравнивания, и потом ссылка на строку запишется в переменную
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы