[python] 三大神器—生成器、迭代器、装饰器

在这里插入图片描述

1. 生成器

squares = [i**2 for i in range(10000)]
for i in squares:
	pass

把所有元素都存在列表里,占用了大量内存,而实际上每次只用到列表中的一个元素。

生成器:
1.惰性计算
2.边执行边计算,无需一次性存入大量数据
3.实际上一直在执行next(操作),直到无值可取

1.1 生成器表达式 (…)

圆括号

squares = (i**2 for i in range(100000))
for i in squares:
    pass

【例】求0-500的和

sum((i for i in range(501)))
## 5050
1.2 生成器函数 yield

【例】 生成斐波那契数列

1.数组迭代和存储
在这里插入图片描述
2.若有中间操作,每次只用到其中一个元素,比如每次只打印一个数字(不需要一次性使用全部元素),可以把这个中间操作放在循环里面执行
在这里插入图片描述
3.这种情况也可以构造生成器函数,方便单独进行中间操作,把print换成yield即可

当我们调用这个函数fib(),它首先会顺序执行,当执行到yield时停止,yield就会返回yield后面跟着的那个元素,相当于 return 的功能,所不同的是,执行完返回之后仍然会停在这里,直到我们执行下一次的操作 next(),继续执行剩余操作,并返回到while判断语句,符合条件则执行 yield,再次返回,并停留在这里,等待下一次操作 next()…

总结:在每次调用 next() 的时候执行,遇到 yield 语句则返回(相应元素),再次执行时从上次返回的 yield 语句处继续执行

在这里插入图片描述

1.3 调用生成器 next() / send()

[操作系统] 多任务 - 协程

2. 迭代器

2.1 可迭代对象 - 可以for循环

可直接作用于for循环的对象,统称为可迭代对象: Iterable

  • 列表,元组,字典,集合,字符串,文件
  • 生成器
1.可用 isinstance( .., Iterable) 判断可迭代对象
from collections import Iterable
isinstance([1,2,3], Iterable)
# True
isinstance("python", Iterable)
# True
2.迭代器还能被 next() 函数调用

比如生成器不仅可用于 for 循环,还可以被 next() 函数调用,直到没有数据可取,抛出 StopIteration (生成器不仅是可迭代对象,还是迭代器)

squares = (i**2 for i 
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值