迭代器和生成器

# **************************************************************************
# 简单的理解 生成器
def foo():
    print('starting.....')
    while True:
        res=yield 4
        print(res)

g=foo() # 此处并不会 开始执行foo 并将返回值给g。而是得到一个生成器对象 g 。此处函数的调用实际上是通过生成器创建了一个迭代器,包含yield的函数已经不能称为函数而是生成器

print(next(g)) # 返回迭代器的下一个项目 # 开始执行这个迭代器
print('*'*20)
# print(next(g))
print(g.send(7))


# **************************************************************************
lists=[1,2,3,4,5,6,7,8,9]
it=iter(lists) # 迭代器可以理解为一个指针,默认指向的是最前面

print(next(it)) # 开始指向第一个行,并返回第一行的数据。在实际的使用中 yield什么 就返回什么
print(next(it))

# 此时的迭代器 指向 第二行。
# 将继续从第二行开始迭代 # 迭代器只能往后,也就是说不能够重新跳到第一行

for x in it:
    print(x)


# **************************************************************************
# 定义一个迭代器类,需要实现迭代器方法和next方法
class MyNumber:
    def __iter__(self):
       self.a=1
       return self
    def __next__(self):
        num=self.a
        self.a+=1
        return num


myNum=MyNumber()
myiter=iter(myNum) # 此时将此实例进行迭代器化  即执行 此类的迭代器方法,设置一个初始值a=1 并返回这个实例本身。
print(next(myiter)) # 调用这个迭代器的next方法,返回2 ,3,4,5

# **************************************************************************
# 生成器 即包含yield的函数,给生成器传入参数或者使用()的时候 将会将生成器返回一个迭代器,而这个迭代器。当使用next函数调用的使用将会开始运行并得到yield的返回值
# 下面请看 斐波那锲数列的生成


def fibonacci(n):  # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if counter > n:
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print(next(f), end=" ") # 迭代器开始执行 并返回 a 即next(f)=a
    except StopIteration:
        sys.exit()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值