Python

Итераторы в Python

Итераторы в Python
Итератор - ценный инструмент для Python. Это объект, используемый для перебора всех элементов коллекции. Итератор предоставляет доступ к элементам контейнера, но не выполняет итерацию самостоятельно. Он работает как курсор базы данных и используется для чтения списка записей одну за другой. Например, 'для'цикл, который выполняет итерацию значений контейнера, работает как итератор. Python имеет множество встроенных итераторов для итерационных объектов, таких как списки, кортежи, словари и т. Д. Без этих итераторов 'itertools'функции могут использоваться для возврата других итераторов в Python. В этой статье показано, как использовать цикл в качестве итератора, настраиваемого итератора, бесконечного итератора и управления бесконечным итератором в Python 3. Некоторые варианты использования 'itertools'функции также объясняются в последней части этого руководства.

Методы итератора

Каждый объект итератора содержит следующие два метода.

Этот метод используется для инициализации итерируемого объекта. Возвращенный объект имеет метод '_ _следующий_ _()'в Python 3.

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

Итерация с помощью циклов

Ранее упоминалось, что 'для'цикл вызывает'следующий()'метод неявно при итерации любого итерируемого объекта. Когда цикл используется для итерации итеративного объекта, 'для'цикл вызывает'следующий()'неявно, а'пока'цикл вызывает'следующий()' или же '__следующий__()'метод явно для чтения следующего значения итерируемого объекта. Оба типа цикла продолжают вызывать этот метод до тех пор, пока 'StopIteration'сигнал генерируется.

Пример 1: Итерация итерируемых объектов с помощью цикла for

Следующий сценарий показывает использование 'для'циклы для итерации пяти различных итерируемых объектов. Первое 'для'цикл используется для перебора строкового значения и печати каждого символа строки на каждой итерации. Второй 'для'цикл используется для итерации содержимого существующего текстового файла и печати каждой строки файла на каждой итерации. Третий 'для'цикл используется для перебора значений кортежа. Четвертый 'для'цикл используется для перебора значений, содержащихся в списке. Пятый 'для'цикл используется для перебора значений, содержащихся в словаре.

# Итерация строки с использованием цикла for
print («Итерация строки с использованием цикла for»)
str = "Python"
для val в str:
печать (val)
# Итерация существующего файла с использованием цикла for
print ("\ n \ nЧтение файла построчно с использованием цикла for")
для открытой линии ("тест.текст"):
печать (строка, конец = "")
# # Итерация кортежа с использованием цикла for
print ("\ n \ nTuple Iteration с использованием цикла for")
tup = («Книга», «Бумага», «Карандаш», «Ручка»)
для val in tup:
печать (val)
# Итерация списка с использованием цикла for
print ("\ n \ nИтерация списка с использованием цикла for")
listdata = ["Дизайнер", "Аналитик", "Программист", "Администратор"]
для val в listdata:
печать (val)
# Итерация словаря с использованием цикла for
print ("\ n \ nИтерация словаря с использованием цикла for")
dictval = 'Meher': 95, 'Sakib': 97, 'Akhi': 70, 'Fiaz': 78
для индекса в dictval:
print ("% s достиг% d отметок"% (index, dictval [index]))

Выход

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

Пример 2: Итерация списков с помощью цикла while

В следующем сценарии показано использование символа 'пока'цикл для итерации списка данных. Здесь 'iter ()'используется для инициализации итеративного объекта, а'следующий()'используется для чтения следующего значения итерируемого объекта. StopIteration сигнал используется для выхода из бесконечности 'пока' цикл, когда в списке не осталось для чтения.

# Определить список
listdata = ['google.com ',' bing.com ',' yahoo.com ',' baidu.com ',' duckduckgo.com ']
# Инициализируем итерируемый объект
init_iter_object = iter (список данных)
print ("Итерация данных списка с использованием цикла while: \ n")
# Объявление и бесконечный цикл while
в то время как True:
пытаться:
# метод next () используется для итерации следующего значения
значение = следующий (init_iter_object)
печать (значение)
кроме StopIteration:
# Завершить цикл после перебора всех значений
перерыв

Выход

Следующий вывод показывает, что каждое значение списка было напечатано в каждой строке с использованием символа 'следующий()'метод после запуска скрипта.

Пример 3: Итерация кортежа с помощью метода __next __ () и цикла while

В следующем сценарии оба 'следующий()' а также '__следующий__()'методы используются для итерации значений кортежа. 'iter ()'метод используется для создания итеративного объекта с именем'init_iter.'Здесь'следующий()'метод вызывается дважды для печати первых двух значений кортежа. Далее бесконечное 'пока'цикл используется для перебора оставшихся значений кортежа и'StopIteration'сигнал используется для выхода из цикла, как в предыдущем примере.

# определяем кортеж
animal_tuple = ('Птица', 'Лев', 'Обезьяна', 'Змея', 'Слон')
print ("Значения кортежа: \ n")
# Инициализировать объект-итератор с помощью iter ()
init_iter = iter (набор_ животных)
# выполнить итерацию и распечатать значение с помощью метода next ()
print (следующий (init_iter))
print (следующий (init_iter))
# Определить бесконечный цикл while
в то время как True:
пытаться:
# выполнить итерацию и распечатать значение с помощью метода __next __ ()
print (init_iter.__следующий__())
кроме StopIteration:
# Завершить цикл после перебора всех значений
перерыв

Выход

Следующий вывод показывает, что после запуска сценария первые два значения, 'Птица' а также 'Лев,'печатаются с'следующий()'метод, а остальные три значения'Обезьяна,"Змея,' а также 'Слон,'печатаются с'__следующий__()'метод.

Итерация с помощью специального итератора

В этом разделе показано, как можно реализовать различные типы настраиваемых итераторов путем создания классов. Оба '__iter __ ()'и'__следующий__()'будут реализованы в классе, а'пока'цикл будет использоваться для перебора значений итерируемого объекта.  В следующей части этой статьи также будет показано, как создать бесконечный пользовательский итератор и управлять итерацией.

Пример 4: Использование простого настраиваемого итератора

Следующий скрипт позволяет вычислить значение Иксп с помощью настраиваемого итератора без использования встроенной функции Python. Класс с именем 'x_to_the_power_n'объявлено в скрипте. '__в этом__()'метод класса будет инициализировать значения Икс а также п который будет использоваться во время создания объекта. '__iter __ ()'будет инициализировать переменную класса, в которой будет храниться'результат'переменная расчета на каждой итерации. Ценности Икс а также п будет приниматься как ввод от пользователя. Объект класса 'числа'создается с помощью Икс а также п. Затем итерируемый объект с именем 'iter_obj'создан для вызова'__следующий__()'метод для п-1 раз, используя 'пока'цикл для вычисления значения Иксп. На каждой итерации значение Икс будет умножено на предыдущее значение 'результат' Переменная. После завершения 'пока'цикл,'__следующий__()'метод будет вызван снова для печати значения Иксп.

"Создайте класс для расчета
x в степень n с помощью итератора
"
класс x_to_the_power_n:
# Инициализировать значение x и n
def __init __ (self, x = 0, n = 0):
себя.х = х
себя.п = п
# Инициализируем итерацию
def __iter __ (сам):
себя.результат = 1
вернуть себя
# Рассчитываем значение на каждой итерации
def __next __ (сам):
если я.п> = 0:
себя.результат * = себя.Икс
себя.п - = 1
вернуть себя.результат
# Принимаем значения x и n
x = int (input ("Введите значение x:"))
n = int (input ("Введите значение n:"))
# Создаем объект класса
числа = x_to_the_power_n (x, n)
# Создать итерацию
iter_obj = iter (числа)
пытаться:
я = 0
в то время как я < n-1):
# Получить следующее значение с помощью метода next ()
следующий (iter_obj)
я + = 1
print ("\ n% d в степени% d равно% d"% (x, n, iter_obj.__следующий__()))
кроме StopIteration:
# Завершить сценарий, если значение не существует
печать (далее (iter_obj))

Выход

Следующий вывод показывает, что 2 принимается за значение Икс а также 4 принимается за значение п. Итак, скрипт рассчитал значение 2быть 16.

Пример 5: Использование бесконечного настраиваемого итератора

Следующий скрипт будет непрерывно печатать числа, делящиеся на 5, с задержкой в ​​одну секунду, пока пользователь не нажмет Ctrl + c для создания 'KeyboardInterruptсигнал. Бесконечное 'пока'цикл используется здесь для создания бесконечного настраиваемого итератора. 'время'модуль импортируется в начале скрипта для использования'спать()'метод задержки каждого вывода на одну секунду. Число 5 инициализируется как 'число'в качестве первого делимого числа в скрипте, а следующее число создается путем добавления 5 к предыдущему значению'число' Переменная.

# Импортировать модуль времени
время импорта
"
Создайте класс для генерации чисел
которые делятся на 5 непрерывно
"
класс Number_Divisible_by_five:
# Инициализировать значение num
def __iter __ (сам):
себя.число = 5
вернуть себя
# Вычислить следующее число, которое делится на 5
def __next __ (сам):
next_num = себя.число
время.спать (1)
себя.число + = 5
вернуть next_num
# Создаем объект класса
Объект = Number_Divisible_by_five ()
# Создать повторяемый объект
iterObject = iter (Объект)
# Определить бесконечный цикл
в то время как True:
пытаться:
# Перейти к следующей итерации
печать (iterObject.__следующий__())
кроме KeyboardInterrupt:
print ("Ctrl + C нажата.")
# Завершить цикл при нажатии Ctrl + C
перерыв

Выход

Следующий вывод показывает, что номер начал печататься с 5 и непрерывно печатал следующие числа один за другим с длительностью в одну секунду. Когда пользователь нажал Ctrl + c после печати числа 60, сообщение 'Ctrl + C нажата.'был напечатан перед завершением скрипта.

Пример 6: Управление настраиваемым бесконечным итератором

Следующий скрипт показывает, как остановить пользовательский бесконечный итератор после завершения указанного количества итераций. '__iter __ ()'метод класса будет инициализировать значения'п' а также 'результат'переменные класса. Скрипт вычислит квадраты чисел, начиная с 1, которые хранятся в переменной п, и выведите квадратное значение п до значения п больше, чем 5. Здесь объявлен бесконечный цикл while для вызова '__следующий__()'метод для печати квадратного значения п. Когда значение п достигает 6, 'StopIteration'будет сгенерирован сигнал для завершения цикла.

# Импортировать модуль времени
время импорта
"
Создайте класс для расчета
квадрат числа начинается с 1 до
значение числа меньше 6
"
класс calculate_power:
# Инициализировать значение num
def __iter __ (сам):
себя.п = 1
себя.результат = 0
вернуть себя
# Вычислить следующее число, которое делится на 5
def __next __ (сам):
# Проверяем, что значение n меньше или равно 5 или нет
если я.п <= 5:
себя.результат = сам.n ** 2
время.спать (0.5)
себя.п + = 1
вернуть себя.результат
еще:
поднять StopIteration
# Создаем объект класса
Объект = calculate_power ()
# Создать повторяемый объект
iterObject = iter (Объект)
# Определить бесконечный цикл
в то время как True:
пытаться:
# Переходим к следующей итерации и печатаем квадратное значение
print ("Квадрат% d равен% d"% (iterObject.n, iterObject.__следующий__()))
кроме StopIteration:
print ("\ n Завершено из цикла.")
# Завершить цикл
перерыв

Выход

Следующий вывод показывает, что бесконечный настраиваемый итератор был остановлен, когда значение n стало больше 5. Скрипт рассчитал и распечатал квадратные значения числовых значений от 1 до 5.

Итерация с помощью itertools

Python имеет встроенный модуль с именем 'itertools'который можно использовать для создания итератора для итерации данных с помощью цикла. В следующем разделе этой статьи показано, как использовать три функции в этом модуле.

itertools.считать()

В itertools.продолжение'функция может использоваться с'карта()'метод для генерации последовательных данных и с'zip ()'метод добавления последовательностей с помощью параметра count этого метода. Синтаксис этой функции приведен ниже.

Синтаксис

itertools.счетчик (начало = 0, шаг = 1)

Здесь первый параметр 'Начало,'используется для определения начального значения последовательности, а 0 значение этого параметра по умолчанию. Второй параметр 'шаг,'используется для установки разницы между последовательными числами, а 1 значение этого параметра по умолчанию.

Пример 7: Использование функции count () в itertools

Следующий скрипт вычислит сумму от 0 к п числа, где значение п будет снято с пользователя. 'считать()"функция импортирована из"itertools'в начале сценария. 'my_iterator'объект инициализируется с помощью'считать()'функция, с'Начало'значение 0 и a'шаг'значение 1. Далееsum_result'переменная инициализируется первым значением итерируемого объекта. Начальное значение инициализируется переменной я и начальное число сохраняется как символ в переменной, числа, которые будут использоваться для объединения других чисел на каждой итерации. Значения порядковых номеров будут добавляться на каждой итерации, когда 'следующий()'метод называется. Когда значение я становится больше, чем п, скрипт завершится отображением результата суммы.

"Следующий скрипт вычислит
сумма от 0 до числа, которое будет принято на вход.
"
# Счетчик импорта
из счетчика импорта itertools
# Создает итерируемый объект count ()
my_iterator = count (начало = 0, шаг = 1)
# Считываем первое значение из итератора
sum_result = следующий (my_iterator)
# Введите число, чтобы завершить бесконечный цикл while
n = int (input ("Введите предельное значение:"))
# Инициализировать значение i и числа
я = sum_result
числа = f 'i'
# Объявить бесконечный цикл
в то время как True:
# Добавляем число на каждой итерации
sum_result + = я
i = следующий (my_iterator)
# Завершить цикл, если значение i больше n
если (i> n):
перерыв
# Добавить числовое значение в виде строки с символом '+'
числа + = "+" + f 'i'
# Вывести окончательное значение
print ("% s =% d"% (числа, результат_суммы))

Выход

Следующий вывод показывает, что число 10 принимается как вход, используемый для завершения цикла после запуска скрипта. В этом выводе скрипт вычислил сумму от 0 до 10 и распечатал вывод, 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55.

Itertools.цикл()

Эта функция содержит только один аргумент, которым может быть любой объект. Цель этой функции - повторить значения объекта после завершения итерации всех значений. Здесь строки, кортежи, списки и т. Д. можно использовать как объект. Возвращаемые итерируемые объекты, возвращаемые этой функцией, используются для итерации каждого значения объекта, которое будет использоваться в качестве аргумента, с помощью символа 'следующий()'метод. Количество раз, когда значения итерируемого объекта будут повторяться, будет основано на количестве итераций цикла. Синтаксис этой функции приведен ниже.

Синтаксис

itertools.цикл (Объект)

Пример 8: Использование функции cycle () itertools

'случайный' а также 'itertools'модули импортируются в начале скрипта для генерации случайного числа и использования'цикл()"функция из"itertools'модуль для повторения данных. Список из трех случайных чисел используется в качестве аргумента 'цикл()функция. Итерируемый объект с именем 'num_list'инициализируется возвращаемым значением этой функции. 'считать'переменная инициализируется 0, и когда значение этой переменной становится 6, 'пока'цикл завершится. Итак 'пока'цикл будет повторяться шесть раз, и каждое значение списка будет повторяться только один раз.

# Импортировать случайный модуль
случайный импорт
# Импортировать модуль itertools
импортировать itertools
# Создание итерируемого объекта на основе списка из трех случайных чисел
num_list = itertools.цикл ([случайный.randint (1,5), случайный.randint (10,50), случайный.Randint
(100 500)])
# Инициализировать счетчик
count = 0
# Повторяем цикл 6 раз
в то время как (считать != 6):
print ('Текущее случайное число:' + f 'next (num_list)')
count + = 1

Выход

Следующий вывод показывает, что три случайных числа, 3, 17, а также 185, были созданы как элементы списка. Цикл повторяется шесть раз, и эти три значения повторяются для следующих итераций.

Itertools.повторить()

Функция repeat () работает как бесконечный итератор и может принимать два аргумента. Когда второй аргумент опущен, функция repeat () работает как бесконечный итератор и повторяет значение бесконечное количество раз. Эта функция не занимает память для каждого повтора. Он просто создает переменную один раз в памяти и повторяет одну и ту же переменную бесконечное количество раз, когда для этой функции установлен только один аргумент. Синтаксис этой функции приведен ниже.

Синтаксис

itertools.повторить (значение, предел)

Первый аргумент используется для получения значения, которое будет повторяться. Второй аргумент является необязательным и используется для установки лимита повторов.

Пример 9: Использование функции repeat () модуля itertools

'itertools'модуль импортируется в начале скрипта для использования'повторить()'функция. Строковое значение будет взято от пользователя для повтора, а числовое значение будет взято от пользователя, чтобы установить предел повтора. Возвращаемое значение 'повторить()'функция затем будет преобразована в список с символом'список()'метод и хранится в'listData' Переменная. Ценности 'listData'будет напечатан с'для' петля.

# Импортировать модуль itertools
импортировать itertools
# Возьмите входное значение, которое будет повторяться
string = input ("Введите строку:")
# Возьмите числовое значение, чтобы повторить
repeat = int (input ("Введите число для повтора:"))
# используя repeat () для многократного добавления строки в список
listData = список (itertools.повторить (строка, повторить))
# Initilize i
я = 1
print ("Значения списка: \ n")
# Итерировать список с помощью цикла for
для val в listData:
print ("Элемент списка% d =% s"% (i, val))
я + = 1

Выход

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

Заключение

Концепция итератора и использование различных типов итераторов в Python пытаются объяснить с помощью очень простых примеров в этой статье. Пользователи Python могут использовать встроенный итератор или могут создать свой собственный итератор в зависимости от требований. Эта статья поможет пользователям Python узнать о методах, используемых в итераторе, и о том, как эти методы работают с любым циклом для чтения любого итеративного объекта. Некоторые виды использования itertools модуль Python также объясняется в этой статье, чтобы узнать более подробную информацию об итераторе в Python.

Как установить Doom и играть в него в Linux
Введение в Doom Серия Doom возникла в 90-х годах после выхода оригинальной Doom. Это мгновенно стал хитом, и с тех пор серия игр получила множество на...
Vulkan для пользователей Linux
С каждым новым поколением видеокарт мы видим, как разработчики игр расширяют границы графической точности и приближаются на шаг ближе к фотореализму. ...
OpenTTD против Simutrans
Создание собственного транспортного симулятора может быть увлекательным, расслабляющим и чрезвычайно увлекательным занятием. Вот почему вам нужно попр...