Python - 迭代器、生成器

本文详细介绍了Python中的迭代器和生成器概念,包括它们的定义、创建方法、获取元素的方式以及生成器的工作原理。重点讲解了如何通过iter函数转换序列为迭代器,生成器的特殊性及其在数据生成中的应用,还提供了实例演示和练习。
摘要由CSDN通过智能技术生成

Python - 迭代器、生成器

迭代器

  1. 什么是迭代器(iter)

​ 迭代器是容器型数据类型,可以同时保存多个数据;可以被遍历也可以转换成列表或元组

打印迭代器时无法打印里面的元素;迭代器不支持len()操作

如需迭代器中的元素,必须将元素将迭代器中取出,而且一旦取出元素,这个元素在迭代器中就不存在了

  1. 怎么创建迭代器

    ​ 方式1:通过iter将其他序列转换成迭代器

    ​ 方法2:创建生成器对象(生成器可以看成是一种特殊的迭代器)

    # 创建
    iter1 = iter('zzx')
    print(iter1)   #<str_iterator object at 0x0000020249D17A00>
    # print(len(iter1))   #TypeError: object of type 'str_iterator' has no len()
    
  2. 获取迭代器中的元素

    ​ 1)、获取单个元素:next(迭代器)

    ​ 2)、遍历(for 循环)

    # 获取
    print(next(iter1))   #'z'
    print(next(iter1))   #'z'
    print(next(iter1))   #'x'
    iter2 = iter([9,99,999,9999])
    for item in iter2:
        print(f'item in iter2:{item}')
    
    iter3 = 'Hello!'
    print(list(iter3))   #['H', 'e', 'l', 'l', 'o', '!']
    # 执行list(iter3)时已经将iter3中的所有数据拿出来了,iter3已经空了
    # print(next(iter3))   #TypeError: 'str' object is not an iteratoriter2 = iter([9,99,999,9999])
    for item in iter2:
        print(f'item in iter2:{item}')
    
    iter3 = 'Hello!'
    print(list(iter3))   #['H', 'e', 'l', 'l', 'o', '!']
    # 执行list(iter3)时已经将iter3中的所有数据拿出来了,iter3已经空了
    # print(next(iter3))   #TypeError: 'str' object is not an iterator
    

生成器

  1. 什么是生成器(generator)

    ​ 生成器是具备能够产生多个数据能力的一种容器

    ​ 生成器在获取数据的时候和迭代器一样

  2. 怎么创建生成器

    ​ 调用一个带有yield关键字(只要包含,不论是否执行)的函数就可以得到一个生成器对象

    ​ (若一个函数中有yield,那么这个函数在调用时不会执行函数体也不会获取返回值而是得到一个生成器)

  3. 控制生成器产生数据的能力

    ​ 执行生成器对应的函数会遇到几次yield这个生成器就能产生多少个数据,每次遇到yield的时候

    ​ yield后面的值就是对应可以产生的数据

  4. 获取元素

    单个获取next(生成器)

    遍历(for 循环)

  5. 生成器产生数据的原理

    在通过生成器对象获取数据的时候,程序才会执行生成器对应的函数,每次遇到yield就会停止

    将yield后面的数据作为这次获取到的数据。记录结束位置,下一次获取数据时从上一次结束位置开始执行

def func1():
    yield 999
    for i in range(5):
        yield i
for item in func1():
    print(f'生成器生成的数据:{item}')

def func2():
    yield 999
    yield 888
    yield 777

#  每次都重新执行func2()
print(next(func2()))   #999
print(next(func2()))   #999
print(next(func2()))   #999

gen = func2()
print(next(gen))   #999
print(next(gen))   #888
print(next(gen))   #777

# 练习:创建一个生成器函数,可以产生前N个偶数(从0开始)
# N --> 5  生成:0, 2, 4, 6, 8
def func3(item):
    for i in range(item):
        yield 2 * i

for item in func3(5):
    print(item)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值