【python核心】迭代(面试题常考)
文章目录
迭代
定义:每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭代的初始值。例如:循环获取容器中的元素。
可迭代对象iterable(怎么用)
定义:具有__iter__函数的对象,可以返回迭代器对象。
""" 可迭代对象"""#可迭代对象 --- 容器list01 =[43,43,4,5,567]#迭代过程# for item in list01:# print(item)#迭代原理#面试题:for循环的原理是什么?#答:1. 获取迭代器;2. 循环获取下一个元素;3.遇到异常停止迭代# 可以被for的条件是是什么?# 能被for对象必须具备__iter__方法#能被for对象是可迭代对象#1. 获取迭代器iterator = list01.__iter__()#2. 循环获取下一个元素while True: try: item = iterator.__next__() print(item) # 3.遇到异常停止迭代 except StopIteration: break#退出循环
练习(面试题常考)
练习1:
使用迭代器原理,遍历元组。
(“铁扇公主”,“铁锤公主”,“扳手王子”)
tuple01 = ("铁扇公主","铁锤公主","扳手王子")iterator = tuple01.__iter__()while True: try: item = iterator.__next__() print(item) except StopIteration: break
练习2:
不使用for,获取字典所有数据。
{“铁扇公主”:101,“铁锤公主”:102,“扳手王子”:1031}
dict01 = {"铁扇公主":101,"铁锤公主":102,"扳手王子":1031}iterator = dict01.__iter__()while True: try: key = iterator.__next__() print(key,dict01[key]) except StopIteration: break
迭代器对象iterator(怎么做)
""" 迭代器"""class Skill: passclass SkillIterator: """ 技能迭代器 """ def __init__(self,target): self.__target = target self.__index = 0 def __next__(self): #如果没有数据了抛出异常 if self.__index > len(self.__target) -1: raise StopIteration #返回下一个数据 temp = self.__target[self.__index] self.__index += 1 return tempclass SkillManager: """ 技能管理器 可迭代对象 """ def __init__(self): self.__skills = [] def add_skill(self,skill): self.__skills.append(skill) def __iter__(self): #创建一个迭代器对象,并传递需要迭代的数据。 return SkillIterator(self.__skills)manager = SkillManager()manager.add_skill(Skill())manager.add_skill(Skill())manager.add_skill(Skill())iterator = manager.__iter__()while True: try: item = iterator.__next__() print(item) except StopIteration: break
练习
练习1:
图形管理器记录多个图形
迭代图形管理器对象
class Graphics: passclass GraphicsInterator: """ 图形迭代器:获取下一个数据 """ def __init__(self,list_targrt): self.__list_target = list_targrt self.__index = 0 def __next__(self): if self.__index > len(self.__list_target)-1: raise StopIteration temp = self.__list_target[self.__index] self.__index += 1 return tempclass Graphics_Manager: """ 图形管理器,可迭代对象(参与for) """ def __init__(self): self.__graphics = [] def add_graphic(self, graphic): self.__graphics.append(graphic) def __iter__(self): return GraphicsInterator(self.__graphics)gm01 = Graphics_Manager()gm01.add_graphic(Graphics())gm01.add_graphic(Graphics())#多态iterator = gm01.__iter__()while True: try: item = iterator.__next__() print(item) except StopIteration: pass
思想:
练习2:(重要)
定义MyRange类,实现下列功能。
for item in range(10)print(item)
class MyRangeInterator: def __init__(self,end_value):self.__end_value = end_valueself.__number = 0 def __next__(self):if self.__number == self.__end_value: raise StopIterationtemp = self.__numberself.__number += 1return tempclass MyRange: def __init__(self, stop_value): self.__stop_value = stop_value def __iter__(self): return MyRangeInterator(self.__stop_value )#next一次,计算一次,返回一次。for item in MyRange(5): print(item)
yield
""" 迭代器--》yield"""# class MyRangeInterator:# def __init__(self,end_value):# self.__end_value = end_value# self.__number = 0## def __next__(self):# if self.__number == self.__end_value:# raise StopIteration# temp = self.__number# self.__number += 1# return tempclass MyRange: def __init__(self, stop_value): self.__stop_value = stop_value def __iter__(self): # return MyRangeInterator(self.__stop_value ) #0-->self.__stop_value #yield作用:将下列代码改为迭代器模式的代码。 # 生成迭代器代码的大致规则: # 1.将yield以前的语句定义在next方法中 # 2.将yield后面的数据作为next方法返回值 number = 0 while number < self.__stop_value: yield number number+=1# #next一次,计算一次,返回一次。# for item in MyRange(5):# print(item)my01 = MyRange(5)iterator = my01.__iter__()while True: try: item = iterator.__next__() print(item) except StopIteration: pass
练习
将迭代器版本的图形管理器改为yield。
class Graphics: pass# class GraphicsInterator:# """# 图形迭代器:获取下一个数据# """# def __init__(self,list_targrt):# self.__list_target = list_targrt# self.__index = 0## def __next__(self):# if self.__index > len(self.__list_target)-1:# raise StopIteration# temp = self.__list_target[self.__index]# self.__index += 1# return tempclass Graphics_Manager: """ 图形管理器,可迭代对象(参与for) """ def __init__(self): self.__graphics = [] def add_graphic(self, graphic): self.__graphics.append(graphic) def __iter__(self): # return GraphicsInterator(self.__graphics) # index = 0 # while index < len(self.__graphics): # yield self.__graphics[index] # index += 1 #执行过程; #1.调用当前方法,不执行(内部创建迭代器对象); #2.调用__next_方法,才执行; #3.执行到yield语句,暂时离开; #4.再次调用__next_方法,继续执行; #5.重复第3/4步骤,直至最后。 for item in self.__graphics: yield itemgm01 = Graphics_Manager()gm01.add_graphic(Graphics())gm01.add_graphic(Graphics())# #多态# iterator = gm01.__iter__()# while True:# try:# item = iterator.__next__()# print(item)# except StopIteration:# passfor item in gm01: print(item)