Python

Итератори в Python

Итератори в Python
Итераторът е ценен инструмент за Python. Това е обект, използван за итерация на всички елементи на колекция. Iterator дава достъп до елементите на контейнер, но не прави итерацията самостоятелно. Той работи като курсор на база данни и се използва за четене на списък със записи един по един. Например, 'зацикъл, който повтаря стойностите на контейнер, работи като итератор. Python има много вградени итератори за итерируеми обекти, като списъци, кортежи, речници и т.н. Без тези итератори, 'itertools'функциите могат да се използват за връщане на други итератори в Python. Тази статия показва как да използвам цикъла като итератор, персонализиран итератор, безкраен итератор и да контролирам безкраен итератор в Python 3. Някои употреби наitertoolsфункциите също са обяснени в последната част на този урок.

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

Всеки обект на итератор съдържа следните два метода.

Този метод се използва за инициализиране на обект, който може да се итерира. Върнатият обект има метода '_ _следващия_ _()'в Python 3.

Този метод връща следващата стойност на обекта, който може да се итерира. Връзката между итератора и итерируемия обект е показана на следващата диаграма.

Итерация с цикли

По-рано беше споменато, че „за"цикъл извиква"следващия()'метод имплицитно при итерация на който и да е обект, който може да се итерира. Когато цикъл се използва за итерация на обект, който може да се повтори, 'за"цикъл извиква"следващия()'методът имплицитно идокато"цикъл извиква"следващия()' или '__следващия__()'метод изрично за четене на следващата стойност на обект, който може да се итерира. И двата типа цикъл продължават да извикват този метод, докато 'StopIteration'генерира се сигнал.

Пример 1: Итериране на подлежащи на извличане обекти с „за“ цикъл

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

# Итериране на низ с помощта на цикъл for
print ("Итерация на низове с помощта на цикъл")
str = "Python"
за val в str:
печат (вал)
# Итерация на съществуващ файл с помощта на цикъл for
print ("\ n \ nЧетене на файл ред по ред, използвайки for цикъл")
за отворена линия ("тест.текст"):
печат (линия, край = "")
# # Итериране на кортеж с помощта на цикъл for
print ("\ n \ n Tuple Iteration using for loop")
tup = ("Книга", "Хартия", "Молив", "Писалка")
за вал в туп:
печат (вал)
# Итериране на списък с помощта на цикъл for
print ("\ n \ nИтерация на списъка, използвайки for цикъл")
listdata = ["Дизайнер", "Анализатор", "Програмист", "Администратор"]
за val в listdata:
печат (вал)
# Итерация на речник с помощта на цикъл for
print ("\ n \ nИзползване на речник с използване на цикъл за")
dictval = 'Meher': 95, 'Sakib': 97, 'Akhi': 70, 'Fiaz': 78
за индекс в dictval:
печат ("% s постигна% d марки"% (индекс, dictval [индекс]))

Изход

Следващият изход показва, че символите на низовата стойност; линиите на тест.текст досие; и елементите от кортежите, списъка и речника се отпечатват след стартиране на скрипта.

Пример 2: Итериране на списъци с цикъл 'while'

Следният скрипт показва използването на 'докатоцикъл за повторение на списък с данни. Ето,iter ()'методът се използва за инициализиране на обект, който може да се итерира, а'следващия()'методът се използва за четене на следващата стойност на обект, който може да се измери. StopIteration сигнал се използва за завършване от безкрайното 'докато' цикъл, когато няма елемент от списъка, оставен за четене.

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

Изход

Следващият изход показва, че всяка стойност на списъка е отпечатана във всеки ред с помощта на 'следващия()'след стартиране на скрипта.

Пример 3: Итериране на Tuple с метода '__next __ ()' и 'while' Loop

В следващия скрипт и дветеследващия()' и '__следващия__()'методите се използват за итерация на стойностите на кортеж. "iter ()'методът се използва за създаване на обект, който може да се повтори, наречен'init_iter.„Ето,следващия()'методът се извиква два пъти, за да отпечата първите две стойности на кортежа. След това, безкрайно 'докато'цикъл се използва за итерация на останалите стойности на кортежа и'StopIteration'сигнал се използва за прекратяване от цикъла, както в предишния пример.

# дефинирайте кортеж
animal_tuple = ('Bird', 'Lion', 'Monkey', 'Snake', 'Elephant')
print ("Стойностите на кортежа са: \ n")
# Инициализирайте обект на итератор, използвайки iter ()
init_iter = iter (animal_tuple)
# итерирайте и отпечатайте стойност, използвайки метода next ()
печат (следващ (init_iter))
печат (следващ (init_iter))
# Определете безкраен цикъл while
докато е вярно:
опитвам:
# повторете и отпечатайте стойност, използвайки метода __next __ ()
печат (init_iter.__следващия__())
с изключение на StopIteration:
# Прекратяване от цикъла след итериране на всички стойности
почивка

Изход

Следващият изход показва, че след стартиране на скрипта първите две стойности, 'Птица' и 'Лъв,'са отпечатани с'следващия()'метод, докато останалите три стойности,'Маймуна,"Змия,' и 'Слон,'са отпечатани с'__следващия__()'метод.

Итерация с персонализиран итератор

Този раздел показва как могат да бъдат внедрени различни видове персонализирани итератори чрез създаване на класове. И двете__iter __ ()"и"__следващия__()'методите ще бъдат внедрени в клас, а'докатоцикъл 'ще се използва за повторение на стойностите на обекта, който може да се итерира.  Следващата част на тази статия също ще покаже как да създадете безкраен персонализиран итератор и да контролирате итерацията.

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

Следният скрипт ви позволява да изчислите стойността на хн чрез използване на персонализиран итератор, без да се използва вградена функция на Python. Класът с име „x_to_the_power_nе деклариран в скрипта. "__в него__()'методът на класа ще инициализира стойностите на х и н които ще се използват по време на създаването на обекта. "__iter __ ()'методът ще инициализира променливата на класа, която ще съхрани'резултат'променлива на изчислението във всяка итерация. Стойностите на х и н ще се приема като вход от потребителя. Обект от класа 'числа'е създаден с х и н. След това обект с име, който може да се изменя 'iter_obj'е създаден за извикване на'__следващия__()'метод за n-1 пъти с помощта надокатоцикъл за изчисляване на стойността на хн. Във всяка итерация стойността на х ще се умножи по предишната стойност на 'резултат'променлива. След прекратяване надокато"цикъл,"__следващия__()методът ще бъде извикан отново, за да отпечата стойността на хн.

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

Изход

Следващият изход показва това 2 се приема като стойността на х и 4 се приема като стойността на н. И така, скриптът изчислява стойността на 2да бъде 16.

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

Следващият скрипт непрекъснато ще отпечатва числата, които се делят на 5, със закъснение от една секунда, докато потребителят натисне Ctrl + c за генериране наПрекъсване на клавиатурата'сигнал. Безкрайнотодокатоцикъл се използва тук, за да създаде безкраен потребителски итератор. "време'модулът се импортира в началото на скрипта, за да се използва'сън ()'метод за забавяне на всеки изход за една секунда. Числото 5 се инициализира на 'брой'променлива като първото делимо число в скрипта, а следващото число се генерира чрез добавяне на 5 с предишната стойност на'брой'променлива.

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

Изход

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

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

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

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

Изход

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

Итерация с itertools

Python има вграден модул с име 'itertools', който може да се използва за създаване на итератор за итерация на данни с помощта на цикъл. Следващият раздел на тази статия показва как да използвате три функции в този модул.

itertools.броя()

The 'itertools.продължение'функцията може да се използва с'карта ()'метод за генериране на последователни данни и с'цип ()'метод за добавяне на последователности с помощта на параметъра count на този метод. Синтаксисът на тази функция е даден по-долу.

Синтаксис

itertools.брой (начало = 0, стъпка = 1)

Тук първият параметър, 'старт,'се използва за определяне на началната стойност на последователността и 0 е стойността по подразбиране на този параметър. Вторият параметър, 'стъпка,се използва за задаване на разликата между последователните числа и 1 е стойността по подразбиране на този параметър.

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

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

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

Изход

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

Itertools.цикъл ()

Тази функция съдържа само един аргумент, който може да бъде всеки обект. Целта на тази функция е да повтори стойностите на обекта след завършване на итерацията на всички стойности. Тук, низове, кортежи, списъци и т.н. може да се използва като обект. Итерируемите обектни връщания на тази функция се използват за итерация на всяка стойност на обекта, която ще се използва като аргумент, като се използва 'следващия()'метод. Броят пъти, в които стойностите на итерируемия обект ще се повторят, ще се основава на броя итерации на цикъла. Синтаксисът на тази функция е даден по-долу.

Синтаксис

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

Пример 8: Използване на функцията цикъл () на itertools

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

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

Изход

Следващият изход показва, че три произволни числа, 3, 17, и 185, са генерирани като елементи от списъка. Цикълът се повтаря шест пъти и тези три стойности се повтарят за следващите итерации.

Itertools.повторение ()

Функцията 'repeat ()' работи като безкраен итератор и може да вземе два аргумента. Когато вторият аргумент е пропуснат, функцията 'repeat ()' работи като безкраен итератор и повтаря стойността безкраен брой пъти. Тази функция не заема памет за всяко повторение. Той просто създава променливата веднъж в паметта и повтаря същата променлива безкраен брой пъти, когато за тази функция е зададен само един аргумент. Синтаксисът на тази функция е даден по-долу.

Синтаксис

itertools.повторение (стойност, лимит)

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

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

"itertools'модулът се импортира в началото на скрипта, за да се използва'повторение ()'функция. Стойност на низа ще бъде взета от потребителя за повторение и цифрова стойност ще бъде взета от потребителя, за да зададе ограничението за повторение. Връщаната стойност на 'повторение ()'функцията след това ще бъде преобразувана в списък с'списък ()'метод и се съхранява в'listData'променлива. Стойностите на „listData'ще бъде отпечатан с'за'цикъл.

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

Изход

Следващият изход показва, че 'Python'се приема като стойност на низа и 3 се приема като число, използвано за повторение на стойността на низа след стартиране на скрипта. Резултатът показва, че низът 'Pythonсе повтаря три пъти.

Заключение

Концепцията за итератор и употребите на различни видове итератори в Python се опитват да обяснят с много прости примери в тази статия. Потребителите на Python могат да използват вграден итератор или да създадат свой персонализиран итератор въз основа на изискването. Тази статия ще помогне на потребителите на python да разберат за методите, използвани в итератора и как тези методи работят с всеки цикъл, за да прочетат всеки итерабилен обект. Някои приложения на itertools модул на python също са обяснени в тази статия, за да знаете повече подробности за итератора в python.

Най-добрите игри за игра с ръчно проследяване
Oculus Quest наскоро представи страхотната идея за ръчно проследяване без контролери. С непрекъснато нарастващия брой игри и дейности, които изпълнява...
Как да покажете OSD наслагване в приложения на цял екран за Linux и игри
Играта на цял екран или използване на приложения в режим на цял екран без разсейване може да ви откъсне от съответната системна информация, видима в п...
Топ 5 карти за залавяне на игри
Всички сме виждали и обичаме поточни игри в YouTube. PewDiePie, Jakesepticye и Markiplier са само някои от най-добрите геймъри, които са спечелили мил...