• 迭代器和生成器


    可迭代对象 iterable

    1. 满足以下条件的对象可以成为可迭代对象

    • 对象实现了__iter__方法
    • __iter__对象成为可迭代对象

    2. 可迭代对象特点:

    • 可以通过for .. in ..这类语句遍历读取数据。
    • 【for循环工作原理:在内部对可迭代对象调用__iter__方法,获取到迭代器对象后,再一次次的通过迭代器对象调用__next__方法获取迭代结果】

    3. 判断对象是否可迭代:

    • isinstance(对象, Iterable) Iterable:可迭代对象
    • 可迭代对象:字符串、列表、元组、字典、集合
    1. from collections.abc import Iterable
    2. print(isinstance(123, Iterable))  # False代表不是可迭代对象
    3. print(isinstance('python', Iterable))  # True代表是可迭代对象
    4. print(isinstance({'name':'zs'}, Iterable)) # True代表是可迭代对象

    迭代器 iterator

    迭代器有两个函数:iter()和next()
    通过iter()函数取得可迭代对象的迭代器,对获取到的迭代器对象不断的使用next()函数获取下一条数据,取完元素后,再使用next()引发StopIteration异常
    1. # 举例1
    2. li = ['迷糊', '海绵宝宝', '小白'] # 列表是可迭代对象
    3. # 创建迭代器对象
    4. name_li = iter(li)
    5. print(next(name_li))
    6. print(next(name_li))
    7. print(next(name_li))
    8. print(next(name_li)) # StopIteration
    9. 举例二: 自定义迭代器类
    10. class Test2:
    11. def __iter__(self): # 该方法返回的是迭代器对象
    12. self.n = 1
    13. return self # 返回self, 表示实例对象本身是自己的迭代器对象
    14. def __next__(self):
    15. self.n += 1
    16. return self.n
    17. te2 = Test2()
    18. print(te2) # te2跟my的地址是一样的
    19. # print(next(te2)) # AttributeError: 'Test2' object has no attribute 'n'
    20. # te2使用next方法报错是因为,没有调用iter方法,里面的self.n实例属性没有生成
    21. my = iter(te2) # 会去调用__iter__方法
    22. print(next(my)) # 2
    23. print(next(my)) # 3
    24. print(next(my)) # 4
    25. # 使用for循环同等效果,for循环会自动调用iter方法,再调用next方法
    26. for i in te2:
    27. if i <=10:
    28. print(i)
    29. else:
    30. break
    31. # 举例三:
    32. class Test3:
    33. def __init__(self):
    34. self.n = 1
    35. def __iter__(self):
    36. return self # 返回的是当前迭代器类的实例对象
    37. def __next__(self):
    38. self.n += 1
    39. if self.n == 10:
    40. raise StopIteration('终止了, 不能继续运行')
    41. return self.n
    42. te3 = Test3()
    43. try:
    44. while True:
    45. print(te3.__next__())
    46. except StopIteration as e:
    47. print("what",e)

    生成器

    1.生成器就是一个迭代器。定义方式类似于列表推导式,把列表推导式的[]改成()就行
    2.生成器函数:python中, 使用了yield的函数被称为生成器(generator)
      普通函数,返回值用return; 生成器函数使用yield语句
      yield语句一次返回一个结果,在每个结果中间,挂起函数,以便下次从它离开的地方继续执行
      yield效果使函数中断,并保存中断的状态
    1. 列表推导式
    2. # li = [i*10 for i in range(3)]
    3. # print(li)
    4. # 把列表推导式的[]改成()
    5. li2 = (i*10 for i in range(3)) # 生成器表达式
    6. print(li2) # at 0x000002105DD1B548>
    7. print(next(li2))
    8. print(next(li2))
    9. print(next(li2))
    10. # print(next(li2)) # StopIteration
    11. def funa(val):
    12. li = []
    13. li.append(val)
    14. print('这是列表:', li)
    15. funa('a') # 这是列表: ['a']
    16. funa('b') # 这是列表: ['b']
    17. funa('c') # 这是列表: ['c']
    18. # 生成器函数
    19. def funb():
    20. print('---开始了----')
    21. yield 2 # 返回一个2,并暂停函数
    22. yield 3
    23. yield 4
    24. fb = funb() # 调用生成器函数,返回的是一个生成器对象
    25. print(fb) #
    26. print(next(fb)) # 2
    27. print(next(fb)) # 3
    28. print(next(fb)) # 4
    29. print(next(fb)) # StopIteration

  • 相关阅读:
    一文带你入门机器学习超参数优化算法
    如何利用 MidJourney 进行 AI 艺术创作(详细教程)
    FIX - 克隆虚拟机NAT模式网络不通、不稳定、vMnet8网络故障、网卡冲突、ssh连接慢
    FTX 深度数据复盘
    src/backend/optimizer/README
    虚拟机和linux
    Python xlrd和xlwt操作Excel实现自动化
    logback--基础--06--配置--filter
    Java全栈开发第一阶段--01.Java基础编程(基本语法-运算符)
    申请专利这10个知识点一定要知道哦
  • 原文地址:https://blog.csdn.net/qq_42052864/article/details/126119734