迭代器,生成器,装饰器

迭代器

什么是迭代器?很简单,拥有__iter__和__next__方法的对象就是迭代器。
迭代是集合元素的一种方式。
可迭代协议是内部实现了__iter__方法。
迭代器协议就是必须拥有__iter__方法和__next__方法。
其中dir()方法是获取对应数据类型的所有方法,其中带有双下划线的方法叫双下方法。
简单的:
print(dir ( [ ]) )
打印一下迭代器中的方法则是:
print(dir ( [ ] . iter( ) ) )
其中__setstate__方法(决定取值的位置),__length_hint__方法(获取元素的个数),__next__方法(获取元素)。

我们都学过for循环,其中for循环的原理即
1.for循环一个可迭代的对象(实现__iter__方法)
2.__iter__方法返回一个迭代器(迭代器实现了__iter__方法和__next__方法)
3.for 先判断对象地方可迭代,然后调用迭代器的__next__方法获取值。

迭代器的作用

节约内存,取得时候在生成数据,python2.7的时候rang()方法就立刻生成了数据占用了大量的内存空间。

k=[1,2,3]
d=k.iter()
print(d.next()) #1
print(d.next()) #2
print(d.next()) #3

这里如果再加一个print(d.next())就会报错并且显示StopIteration,即停止迭代,因为k里的元素已经不够了。

class Fib():
def init(self,num):
self.num=num
self.a=1
self.b=1
self.current=1
def iter(self):
return self
def next(self):
if self.current<=self.num:
temp=self.a
self.a,self.b=self.b,self.a+self.b
self.current+=1
return temp
else:
return StopIteration
for x in Fib(10):
print(x)

这个代码是用迭代生成斐波那契数列。

生成器

生成器的本质就是迭代器。
生成器由两种生成器函数和生成器。
一个包含yield关键字的函数就是一个生成器函数,且yield不能和return共用,并且yield只能用在函数内。
def hs():
for i in range(3):
yield “第%d个包子”%(i+1)
x=hs()
print(next(x)) #第1个包子
print(next(x)) #第2个包子
print(x.next()) #第3个包子

def dee():
yield 1
yield 2
yield 3
x=dee()
print(next(x)) #1
print(next(x)) #2
print(next(x)) #3
执行了__next__()方法之后才会执行函数体,并且获得返回值。
yield和return相同的是可以返回值,不同的是yield不会结束函数。
使用send()给yield传递参数
def generator():
print(“a”)
count=yield 1
print("---->",count)
print(“b”)
yield 2
g=generator()
next(g) #移到下一个yield
ret2=g.send(“123”) #给上一个yield发送123
print(ret2)
计算移动平均值
def fun_avg():
count=1
get_num=0
avg=0
total=0
while True:
get_num=yield avg #avg每次求得平均数
total=total+get_num #记录所有值的和
avg=total/count #记录执行的次数
count+=1
g=fun_avg()
next(g) #使用next方法
print(g.send(10)) #10
print(g.send(20))
print(g.send(30))
yield from循环遍历容器类型
使用for循环取出g1生成器中的所有值
def gen1():
for c in “AB”:
yield c
for i in range(3):
yield i
g=gen1()
for i in g: #循环遍历出gen1()中的值
print(i)
#直接将gen1()中的值赋值到列表中

生成器表达式
将列表解析式[]改成()即可
使用生成器表达式,进行数数。
g=(i for i in range(10))
print(g)
for j in g:
print(j)

装饰器

闭包

python中闭包的三个要求
1,闭包函数中必有内嵌函数
2,内嵌函数必须要引用外层函数的变量
3,闭包函数返回内嵌函数的地址(函数名称)
创建一个闭包函数
def func():
name=“ruirui”
def inner():
print(name)
return inner
f=func()
f()
判断闭包函数的方法__closure__
#输出的__closure__有cell元素:是闭包函数def func():
name=“eva”
def inner():
print(name)
print(inner.closure)
return inner
f=func()
f()
#输出的__closure__为None:不是闭包函数
name=“egon”
def func2():
def inner():
print(name)
print(inner.closure)
return inner
f2=func2()
f2()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值