030 迭代器 生成器
""" 目录: 一 迭代 二 可迭代对象 三 迭代器 四 生成器 """
一 迭代
''' 迭代: 一种操作,逐个获取数据过程。 for...in... '''
二 可迭代对象
# 判断可迭代对象 from collections.abc import Iterable if __name__ == '__main__': type_1 = 123 print(type(type_1), isinstance(type_1, Iterable)) # False type_2 = "abc" print(type(type_2), isinstance(type_2, Iterable)) # True type_3 = [1, 2, 3] print(type(type_3), isinstance(type_3, Iterable)) # True type_4 = (1, 2, 3) print(type(type_4), isinstance(type_4, Iterable)) # True type_5 = {"name": "Tome"} print(type(type_5), isinstance(type_5, Iterable)) # True type_6 = {"name", "Tome"} print(type(type_6), isinstance(type_6, Iterable)) # True ''' <class 'int'> False <class 'str'> True <class 'list'> True <class 'tuple'> True <class 'dict'> True <class 'set'> True '''
if __name__ == '__main__': a = [1, 2, 3] # 可迭代对象 print("__iter__" in dir(a)) # True print("__next__" in dir(a)) # False # list 是一个可迭代对象, 可以用for来遍历容器数据 # for遍历 for i in a: print(i, end=" ") ''' True False 1 2 3 '''
三 迭代器
迭代器 标准: iter() 和 next()。 包含: __next__和 __iter__操作;
# 迭代器: __iter__ __next__ if __name__ == '__main__': a = [1, 2, 3] it = iter(a) # 创建迭代器对象 print("__iter__" in dir(it)) # True print("__next__" in dir(it)) # False for i in it: # for循环遍历 print(i, end=" ") it = iter(a) while True: try: print(next(it), end=" ") # 遍历下一个 except StopIteration: # 标识异常: 迭代完成 sys.exit() ''' True True 1 2 3 1 2 3 '''
# 自制迭代器 class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): x = self.a self.a += 1 return x if __name__ == '__main__': myclass = MyNumbers() print("__iter__" in dir(myclass)) # True print("__next__" in dir(myclass)) # True myiter = iter(myclass) print(next(myiter)) # 1 print(next(myiter)) # 2 print(next(myiter)) # 3
四 生成器
''' 生成器: 1 定义: 使用 yield 的函数被称为生成器。 2 迭代: 生成器是一个返回迭代器的函数,具有迭代器的功能。 2 作用: 每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值 '''
# 生成器函数 def f(n): i = 1 while i <= n: yield i * 5 # 遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行 i += 1 # 生成器函数 def fib(max): n, a, b = 0, 0, 1 while n < max: yield b # 遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行 a = b b = a + b n = n + 1 return 'done' if __name__ == '__main__': f_it = f(6) for i in f(6): print(i, end=" ") # 生产器: 一定是迭代器; print() print("__iter__" in dir(f_it)) # True print("__next__" in dir(f_it)) # True for i in fib(6): print(i, end=" ")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律