Генераторы списков в Python для начинающих. Генератор списков python 3.

Если мы хотим подсчитать количество элементов в итерации, удовлетворяющих условию, мы можем использовать Inclusion для создания идиоматического синтаксиса:

Как использовать генераторы в языке Python

Генераторы Python — это класс функций, которые позволяют нам создавать и хранить собственные итераторы, возвращающие значения функций, когда это необходимо. Генераторы обрабатывают данные по частям, шаг за шагом, и используются при обработке больших объемов данных, когда есть риск переполнения памяти. Генераторы могут потребоваться в следующих ситуациях:

  • работа с большими файлами (десятки гигабайт): сравнение строк нескольких таких файлов, обработка, поиск по условию и т. д.;
  • веб-скрейпинг;
  • анализ бесконечного потока данных (сетевой трафик, биржевые котировки, показания приборов, датчиков);
  • математические вычисления;
  • рефакторинг (переработка) существующего кода.

Генераторы как объекты (функции) не следует путать со следующими структурами:

  • генераторы списков;
  • генераторы множеств.

Списки и наборы не связаны с объектами-генераторами. В данном случае слово «генератор» функционирует только как синтаксическая конструкция, возникшая в результате перевода слова «list comprehension» с английского языка.

Давайте сначала рассмотрим генераторы списков и множеств, чтобы в дальнейшем избежать путаницы при использовании самих генераторов.

Генераторы списков

Для создания длинного списка программным методом используется цикл с дополнительным условием. Выражение заключено в скобки и обычно имеет следующий вид:

Выражение для элемента в наборе повторений, если условие.

Сначала мы создаем список чисел от 1 до 30, а затем выбираем только четные числа из этого диапазона:

nums = i для i в диапазоне(1, 10)

четные_числа = i для i в диапазоне(1, 10) if n % 2 == 0

1, 2, 3, 4, 5, 6, 7, 8, 9

В данном примере выражение — это сам элемент, числа от 1 до 30 — множество повторений, а делимость целых чисел без остатка — условие.

Генераторы списков в Python называются «синтаксическим сахаром» и используются для сокращения кода.

Генераторы множеств

Они являются выражением формы:

Как видите, единственное отличие между ними и списками — наличие квадратных скобок. Генераторы множеств можно использовать для отсеивания лишних элементов в множестве. Например, мы хотим отфильтровать файлы с расширением txt:

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

Как использовать генераторы в языке Python

Что же такое генераторы списков в Python?

Итак, давайте начнем с написания генератора списков. Генератор списка — это простая строка кода, которую вы пишете в круглых скобках. Он состоит из трех элементов:

  • цикл for
  • условие и выражение (condition)
  • результат (output)

list comprehension

Пример простого генератора списка

Следующий фрагмент кода является примером простого генератора списка. Здесь мы просто проходим цикл по lst и сохраняем все его элементы в списке a :

lst = 1,2,3,4,5,6,7,8,9,10 # генератор простого списка a = x for x in lst print(a) # результат: # 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.

Этот код полностью эквивалентен следующему коду:

for x in lst: a.append(x)

Но в первом случае нам даже не нужен метод append для создания списка. Вместо этого мы используем генератор.

Двигаемся дальше. В приведенном выше генераторе списка мы можем использовать любое выражение для изменения начальных элементов lst, например:

# прибавить любое число к каждому элементу lst и сохранить результат в a a = x+1 для x в lst # вычесть любое число из каждого элемента lst и сохранить в a a = x-1 для x в lst # умножить каждый элемент lst на любое число и сохранить в a a = x*2 для x в lst.

Генератор списка с одиночным и вложенным условием if

Мы также можем добавить условие if в генератор списка для фильтрации данных. Например, в следующем коде все значения lst, превышающие 4, хранятся в списке c:

lst = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 c = x for x in lst if x>4 print(c) # результат: # 5, 6, 7, 8, 9, 10

Этот код делает то же самое, что и следующий код:

for x in lst: if x>4: a.append(x)

Мы также можем добавить условие if к нашему генератору списка. Например, в следующем коде в списке d хранятся все элементы lst, значения которых больше 4 и кратны 2:

d = x for x in lst if x>4 if x%2 == 0 # Результат: # 6, 8, 10

Этот код эквивалентен этому:

for x in lst: if x>4: if x%2 == 0: a.append(x)

Коллекция из текста в генераторе списка

В качестве коллекции мы можем переопределять другие повторяющиеся объекты, например, строки.

a = i для i в 'HighloadToday' print(a)

Пока мы проходим через все буквы в нашей строке, мы получаем на экране одиночные символы, т.е. список заполняется символами строки:

'H', 'i', 'g', 'h', 'l', 'o', 'a', 'd', 'T', 'o', 'd', 'a', 'y'.

Строки можно размножать. В результате получается список, в котором символы повторяются определенное количество раз.

Например, если мы умножим наш пример на три, то получим следующий результат:

'a = i*3 for i in 'HighloadToday' print(a) 'HHHHH', 'iii', 'ggg', 'hhh', 'lll', 'ooo', 'aaa', 'ddd', 'TTT', 'ooo', 'ddd', 'aaa', 'yyy'.

Мы также можем использовать различные функции внутри выражения. Например, функция ord находит код поля символов ASCII

a = ord(i) for i in 'HighloadToday' print(a) 72, 105, 103, 104, 108, 111, 97, 97, 100, 84, 111, 100, 97, 121

Для следующего примера мы возьмем количество циклов десять раз, а в качестве функции возьмем функцию случайных чисел randint, поскольку ранее мы представили модуль random.

Эта функция возвращает число из указанного диапазона.

import random a = random.randint(-10, 10) for i in range(10) print(a)

В результате получаются десять случайных чисел:

-7, -1, 8, 9, -10, -7, 8, 5, 6, -7

Работа с несколькими генераторами списков

С помощью генератора мы можем перезаписывать элементы из другого списка. Например, мы можем взять предыдущий пример и перебрать все элементы по одному, оставив только значение modulo.

import random a = random.randint(-10, 10) for i in range(10) print(a) b = abs(elements) for elements in a print(b) 9, 7, -8, 10, 4, 9, -6, 0, 3, -1 9, 7, 8, 10, 4, 9, 6, 0, 3, 1

В списке b остаются только значения по модулю.

Генераторы списков позволяют изменять исходные записи списка. Например, следующая запись приводит к увеличению всех записей списка на единицу:

import random a = random.randint(-10, 10) for i in range(10) print(a) a = elements+1 for elements in a print(a) 4, -2, -5, 3, 3, -4, 3, 1, -6, -6 5, -1, -4, 4, 4, -3, 4, 2, -5, -5, -5, -5

Условные конструкции

Условные структуры можно использовать для генераторов списков. В этом случае узор выглядит несколько иначе:

Выражение для val в условной коллекции if.

Предположим, мы создаем список b, который содержит только четные элементы. Давайте вставим это условие в наш код. Каждый элемент созданного нами списка нужно разделить на 2, оставив в остатке 0:

import random a = random.randint(-10, 10) for i in range(10) print(a) b = elements for elements in a if elements % 2 == 0 print(b) -10, -8, -3, 3, 8, -5, -7, -10, 3, 9-10, -8, 8, -10

Условие также можно усложнить, например, добавив новое требование, что выходные элементы должны быть меньше нуля и четными:

import random a = random.randint(-10, 10) for i in range(10) print(a) b = elements for elements in a if elements<0 and elements % 2 == 0 print(b) -6, 6, -4, -4, -6, 10, -5, -1, -10, -7 -6, -4, -4, -6, -10

Условие Else

else можно использовать при добавлении в список, но следует быть осторожным с синтаксисом. Условие if или else следует использовать до цикла for, а не после:

# создать список символов из apple, replacing согласные на '*' # Ex - 'apple' -->'a', '*', '*', '*' ,'e' x for x in 'apple' if x in 'aeiou' else '*' # SyntaxError: invalid syntax # При использовании if / else, используйте их перед циклом x if x in 'aeiou' else '*' for x in 'apple' # 'a', '*', '*', '*', '*', '*', 'e'

Обратите внимание, что здесь используется другая лингвистическая конструкция - условное выражение, которое не является частью синтаксиса включения. Since if after for...in является частью включения списка и используется для отсеивания элементов из исходного кода.

Двойная итерация

Порядок двойной итерации. для x в. для y в. является естественным или нелогичным. Эмпирическое правило заключается в том, чтобы следовать циклу for :

def foo(i): return i, i + 0.5 for i in range(3): for x in foo(i): yield str(x)
str(x) for i in range(3) for x in foo(i)

Это можно сжать в одну строку в виде str(x) for i in range(3) for x in foo(i)

Встроенная мутация и другие побочные эффекты

Перед использованием корпусов списков необходимо понять разницу между функциями, которые вызываются для своих побочных эффектов (переменные или встроенные функции), которые обычно не возвращают никакого значения, и функциями, которые возвращают интересующее значение.

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

List.sort() сортирует список на месте (т.е. изменяет исходный список) и возвращает None, т.е. не работает так же, как list inlines:

x.sort() for x in 2, 1, 4, 3, 0, 1 # None, None, None, None.

Вместо sorted() возвращает отсортированный список, который не отсортирован по месту:

sorted(x) for x in 2, 1, 4, 4, 3, 0, 1 # 1, 2, 3, 4, 0, 1

Допускается использование корпусов для вторичных эффектов, таких как входы/выходы или встроенные функции. Однако предпочтительнее использовать цикл for. Вот как это работает в Python 3:

print(x) for x in (1, 2, 3).

Используйте вместо этого:

for x in (1, 2, 3): print(x).

В некоторых случаях функции с побочными эффектами подходят для включения в список. Random.randrange() имеет побочный эффект изменения состояния генератора случайных чисел, но также возвращает интересное значение. Кроме того, для итератора может быть вызвана функция next().

Следующий генератор случайных чисел не является чистым, но он полезен, поскольку генератор случайных чисел сбрасывается каждый раз, когда оценивается выражение:

from random import randrange(1, 7) for _ in range(10) # 2, 3, 2, 1, 1, 5, 2, 4, 3, 5

Оцените статью
Uhistory.ru
Добавить комментарий