> 文档中心 > 【python核心】迭代(面试题常考)

【python核心】迭代(面试题常考)

文章目录

  • 迭代
    • 可迭代对象iterable(怎么用)
    • 练习(面试题常考)
    • 迭代器对象iterator(怎么做)
    • 练习
    • yield
    • 练习

迭代

定义:每一次对过程的重复称为一次"迭代",而每一次迭代得到的结果会作为下一次迭代的初始值。例如:循环获取容器中的元素。

可迭代对象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

思想:
【python核心】迭代(面试题常考)
练习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)

驱动天空下载