1.迭代器
【for循环实现】可迭代对象,迭代器_for 循环对象-CSDN博客
2.生成器
-
产生背景
- 不依赖于range()和其他数据类型,可以自定义出来一个迭代器
-
什么是生成器?
- 通过yield实现,每次迭代即使用next()生成一个值。值不存在则报错
-
作用
- 惰性计算
- 延迟执行
- 按需输出,节省内存
-
import sys import time start = time.time() gen = (i for i in range(1,10000) if i % 2==0) print(f"生成器花费时间{time.time()-start:.2f}s,内存占用是{sys.getsizeof(gen)}bytes") 最终结果是: 生成器花费时间0.00s,内存占用是112bytes
-
-
生成器表达式
-
方法一:gen = (i for i in 可迭代对象 [判断条件])
- 遵循按需输出,遍历才执行
-
gen = (i for i in range(5)) print(gen) # <generator object <genexpr> at 0x10b0830b0> for y in gen: print(y, end=' ') # 0 1 2 3 4 应用1: 计算数字的平方 gen = (i**2 for i in range(5)) for j in gen: print(j,end=" ") # 0 1 4 9 16 应用2: 偶数筛选 gen = (i for i in range(20) if i%2 == 0) for j in gen: print(j,end=" ") # 0 2 4 6 8 10 12 14 16 18 应用3:修改迭代器的值 arr = ["name","age","favorite"] gen = (name for name in arr if len(arr)>=3) arr = ["age","favorite"] print(list(gen)) # []
-
方法二:函数内部使用yield关键字,调用该函数生成一个生成器.
- ⚠️yield与return的区别:
- yield和return 都表示返回的意思;
- yield后面可跟代码且返回,return后面的代码不执行
-
场景1: def func(n): for o in range(1,n+1) yield o 步骤1:创建生成器 n = func(5) 步骤2: 使用next开始执行一次迭代,遇到yield停止 print(next(n)) # 1 步骤3: 再次使用next继续从yield开始执行 print(next(n)) # 2 场景2:使用for 遍历生成器 def fuc(): lst = [1, 2, 3] for item in lst: yield item yield 'a' gen = fuc() for i in gen(): print(I,end=' ') # 1 2 3 a
-
-
yield from 生成器
- 可以连接调用者和子生
- ⚠️yield与return的区别:
-