ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

迭代器iterator与生成器generator

2022-01-13 17:58:53  阅读:150  来源: 互联网

标签:__ .__ generator iterator self 生成器 next item 迭代


迭代器

首先来说一下什么是迭代

  • 每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。例如:循环获取容器中的元素。
list01 = [34, 4, 5, 46, 57, 87]
#for item in list01:
  #  print(item)
# 对象可以for的条件是什么?也是for循环的原理
# 对象具有__iter__方法
# 对象可以获取迭代器
# for 原理:
# 1. 调用了__iter__()方法,返回迭代器对象
iterator = list01.__iter__()
while True:
    try:
        # 2. 获取下一个元素
        item = iterator.__next__()
        print(item)
        #item = iterator.__next__()
        #print(item)
    # 3. 如果没有元素,则捕获异常,停止循环。
    except StopIteration:
        break

综上所述,就是迭代的原理
可迭代对象:

  • 定义:具有__iter__函数的对象,可以返回迭代器对象。
    迭代器对象:

  • 定义:可以被next()函数调用并返回下一个值的对象。

  • 语法

      class 迭代器类名:
         def __init__(self, 聚合对象):
              self.聚合对象= 聚合对象 
      
         def __next__(self): 
              if 没有元素:
                  raise StopIteration
              return 聚合对象元素
     -- 聚合对象通常是容器对象
    
  • 迭代器的使用遍及并统一了 Python。在幕后,该for语句调用iter()容器对象。该函数返回一个迭代器对象,该对象定义了__next__()一次访问容器中元素的方法。当没有更多元素时, next()引发一个StopIteration异常,告诉 for循环终止。

举个例子:
如何将迭代器定义到我们的类中:

"""
    迭代器
    迭代自定义对象
"""
class SkillIterator:
    def __init__(self, data):
        self.__data = data
        self.__index = -1

    def __next__(self):
        self.__index += 1
        if self.__index > len(self.__data) - 1:
            raise StopIteration()
        return self.__data[self.__index]


class 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("九阳神功")
manager.add_skill("乾大挪移")
manager.add_skill("太极坤")

# for item in manager:
#     print(item)#

# iterator = manager.__iter__()
# while True:
#     try:
#         item = iterator.__next__()
#         print(item)
#     except StopIteration:
#         break

生成器generator

定义:能够动态(循环一次计算一次返回一次)提供数据的可迭代对象。

#生成器函数:含有yield语句的函数,返回值为生成器对象。
def my_range(stop):
    number = 0
    while number < stop:
        yield number
        number += 1
# for item in my_range(5):
#     print(item)  # 0 1 2 3 4

# 惰性操作/延迟操作
my = my_range(5)
iterator = my.__iter__()
while True:
    try:
        item = iterator.__next__()
        print(item)
    except StopIteration:
        break
#要知道的是,yield之前的代码都在__next__()方法中,打个断点调试调试
  • 语法

      -- 创建:
      		def 函数名():
    
      				yield 数据
      
      调用:
       for 变量名 in 函数名():
      	  语句
      调用生成器函数将返回一个生成器对象,不执行函数体,所以呢,要用for循环去拿出数据
      因为for 循环的他会调用__next__()方法(迭代器~)
    

执行过程:

  • (1) 调用生成器函数会自动创建迭代器对象。
    (2) 调用迭代器对象的__next__()方法时才执行生成器函数。
    (3) 每次执行到yield语句时返回数据,暂时离开。
    (4) 待下次调用__next__()方法时继续从离开处继续执行。

生成器 = 可迭代对象(可以参与for循环) + 迭代器(生成数据)

补充:生成器表达式

# 列表推导式
list01 = [34, 43, 54, 65, 67, 7]
list02 = [item for item in list01 if item > 10]
for item in list02:
    print(item)
#生成器表达式,注意跟列表的区别,括号哦~
generator02 = (item for item in list01 if item > 10)
for item in generator02:
    print(item)


for item in (item for item in list01 if item > 10):
    print(item)

标签:__,.__,generator,iterator,self,生成器,next,item,迭代
来源: https://blog.csdn.net/weixin_46618351/article/details/122459317

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有