02_生成器

生成器的概念

生成器是一种特殊的迭代器。以 yield 关键字标识返回值的函数就是一个生成器
引申:迭代器概念:Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
生成器和迭代器的区别:
a、语法上:
生成器是通过函数的形式中调用 yield 或()的形式创建的。
迭代器可以通过 iter() 内置函数创建。

b、用法上:
生成器在调用next()函数或for循环中,所有过程被执行,且返回值。
迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程或动作。

在使用中最好使用生成器,优点:本质上是动态生成迭代的值,使用完直接丢弃,可以有效节省内存空间,但这些值只能被迭代一次。生成器是一种惰性的序列,如果我们需要创建一个 0~xxxxxxxxx 的序列,这样大的序列创建出来会占用内存,生成器就解决这样的问题

生成器的使用

# 创建生成器函数
def hello():
    print('step 1')
    yield 1
    print('step 2')
    yield 2
    print('step 3')
    yield 3

# 得到生成器对象
q = hello()

res = next(q)
print(res)

#可以循环获取生成器中的值
for res in q:
    print(res)
# 如果生成器值被调用完了,还去获取就会失败。
# next(q) #报错 StopIteration

使用生成器代替迭代器

迭代器概念:Python中一个实现_iter_方法和_next_方法的类对象,就是迭代器。
生成器是一种特殊的迭代器。以 yield 关键字标识返回值的函数就是一个生成器

# 迭代器例子
class Square:
    def __init__(self,count) -> None:
        self.count = count
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        result = self.current ** 2
        self.current += 1
        if self.current > self.count:
            raise StopIteration
        return result

square = iter(Square(3))
print(next(square)) # 0
print(next(square)) # 1
print(next(square)) # 4
# print(next(square))  # 报错 StopIteration


## 使用生成器替代迭代器
def Square1(count):
    for i in range(count):
        yield i ** 2
square1 = Square1(3)
for i in square1:
    print(i) # 0 1 4

迭代、迭代器、可迭代对象

迭代:当创建的对象可以被一个接一个读取里面的值,叫迭代。
列表、元组、字典、字符串都是可迭代对象。数字、布尔值是不可迭代的对象。
迭代器协议:对象需要提供next()方法,通过它返回迭代中的下一项,直到返回终止抛出StopIteration异常。
可迭代对象:实现了迭代器协议对象。list、tuple、dict都是可迭代对象(Iterable),但不是迭代器对象(Iterator)。
需要使用内建函数iter(),把这些都变成可迭代器对象(Iterable)。
for item in Iterable:循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法,
来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值