python 迭代器、生成器

本文深入探讨了Python中迭代器和生成器的概念与应用,包括斐波那契数列的迭代器实现,生成器函数的特点及如何使用生成器表达式提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

迭代器------->>>>

通俗点来说:就是拥有__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
---->>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值