Фото от Expect Best from Pixels
Генератор-это мощная функция в Python, которая помогает вам писать более качественный и организованный код.
ПОЧЕМУ я их использую
Обработка последовательных данных означает очистку, фильтрацию, преобразование данных для следующего процесса или хранение в базе данных. Список пригодится для осуществления таких действий.
Список, типичная и универсальная структура данных в Python. Я часто использую list, но это не очень хороший выбор для изменчивого размера данных. Например, список может содержать 5, 100, 10 000 или 5,00,0000 элементов или даже больше.
def scale_to_log10(till_number): log10_number_seq = [] for num in range(1, till_number): log10_number_seq.append(math.log10(num)) return log10_number_seq
Приведенный выше код просто хорош и даст ожидаемый результат, если вообще даст .
если аргумент ’till_number’, переданный в функцию range, является высоким. Это может привести к тому, что он создаст список в памяти, то есть загрузит в него данные. И если вашей программе посчастливится работать в вечном пространстве памяти, то все будет хорошо. Теперь представьте себе, что размер списка, генерируемого диапазоном функций, составляет 4 ГБ, а доступный объем памяти-2 ГБ, ой. Это сделает процесс вялым и может привести к сбою с outofmemoryerror, и они будут считать, что вы не очень хороший разработчик .
Как хороший, если не великий разработчик, мы должны убедиться, что функция, которую мы пишем, работает должным образом, не злоупотребляя физическими ресурсами, называемыми оперативной памятью (RAM) и центральным процессором (CPU).
КАК я их использую
Чтобы избежать наихудшего сценария сбоя процесса и перегрузки памяти, другие процессы могли бы использовать, я использую генераторы.
Вот фрагмент.
Для Python2:
def scale_to_log10(till_number): for num in xrange(1, till_number): yield math.log10(num)
Для Python3:
def scale_to_log10(till_number): for num in range(1, till_number): yield math.log10(num)
Различия между этими двумя методами очевидны. Метод выполняет генератор использует оператор yield вместо оператора return и далее использует функцию xrange вместо функции range. Это относится к ленивой загрузке или ленивой обработке. Он сохраняет в памяти только элемент обработки, а не полный список.
В python3 функция диапазона такая же, как и функция xrange в python2. это означает, что он возвращает объект генератора в python3 и список в python2.
в заключение
Рассмотрите возможность использования генераторов при работе с потенциально большими последовательными данными. Генераторы эффективны при работе с большим последовательным потоком данных, поэтому мы можем использовать их в качестве строительных блоков функций, которые помогают спроектировать лучшую структуру.