迭代器------->>>>
通俗点来说:就是拥有__iter__方法和__next__方法的对象就是一个迭代器
下面我们来看下自带容器的作用:
lis = [1, 2, 3] # 定义一个列表
a = iter(lis) # 使用iter函数()
print(a) # -----><list_iterator object at 0x00000000021FD9E8>
print(next(a)) #---->1
print(next(a)) #----->2
print(next(a)) #----->3
print(next(a)) # 如果超出就会报错
# Traceback (most recent call last):
# File "D:/Homework/day13-面向对象魔术方法&迭代器/dome9-迭代器案例.py", line 42, in <module>
# print(next(a))
# StopIteration
我们用迭代器来实现一下斐波那契数列:
class Fibonacci(object):
# num:表示生成fibonacci数列的个数
def __init__(self, num):
self.num = num
# 保存前两个数
self.a = 1
self.b = 1
# 创建一个计数器
self.count_num = 0
def __iter__(self):
return self
def __next__(self):
if self.count_num < self.num:
ret = self.a
self.a, self.b = self.b, self.a + self.b
self.count_num += 1
return ret
else:
raise StopIteration
# 创建迭代器
f = Fibonacci(5)
# 便利迭代器
for i in f:
print(i)
生成器------->>>>
注意:
一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用,并且yield只能用在函数内。 (1).生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。 (2).执行了__next__()方法之后才会执行函数体,并且获得返回值。 (3).next()内置方法,内部调用生成器函数的__next__()方法。 (3).yield和return相同的是可以返回值,但是不同的是yield 不会结束函数
生成器表达式:
# 一个列表
xiaoke=[2,3,4,5]
# 生成器generator,类似于list,但是是把[]改为()
gen=(a for a in xiaoke)
for i in gen:
print(i)
#结果是:
2
3
4
5
# 为什么要使用生成器?因为效率。
# 使用生成器表达式取代列表推导式可以同时节省 cpu 和 内存(RAM)。
# 如果你构造一个列表(list)的目的仅仅是传递给别的函数,
# 比如 传递给tuple()或者set(), 那就用生成器表达式替代吧!
# 本案例是直接把列表转化为元组
kk=tuple(a for a in xiaoke)
print(kk)
#结果是:
(2, 3, 4, 5)
# python内置的一些函数,可以识别这是生成器表达式,外面有一对小括号,就是生成器
result1=sum(a for a in range(3))
print(result1)
# 列表推导式
result2=sum([a for a in range(3)])
print(result2
send 获取下一个值的效果和next()基本一致,只是在获取下一个值的时候,给上一yield的位置传递一个数据 使用send的注意事项 (1).第一次使用生成器的时候 是用next获取下一个值 (2).最后一个yield不能接受外部的值 实例:
def fun():
print('aaa')
get = yield 1
print(get)
print('---->>')
yield 2
g = fun()
ret = next(g) # ----->用来接收yield 1 的返回值
print(ret)
g.send('hello')
看一下结果------>>>
aaa
1
hello
---->>