2021.03.22迭代器和生成器

本文深入探讨了Python中的迭代器和生成器。迭代器是可迭代对象,不可直接获取元素个数,使用next()或for循环获取元素,一旦取出则无法放回。生成器同样遵循迭代器协议,但通过yield关键字实现,允许在运行时动态生成序列。通过实例展示了如何创建和使用生成器,以及其工作原理。文章最后提供了一个创建学号生成器的练习案例。

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

2021.03.22

迭代器(iter)

是序列
迭代器作为序列无法获取元素的个数;打印迭代器的时候也没法查看所有的元素
如果要获取元素的值必须将元素从迭代器中取出来,而且某个元素如果取出来了就无法再放回迭代器中(取一个就少一个)

计划生成100个产品:XH0001 ~ XH1000

创建迭代器

1)将其他序列转化成迭代器 - 所有序列都可以转换成迭代器
2)创建生成器

iter1 = iter('abc')
print(iter1)        # <str_iterator object at 0x104dacf70>
# print(len(iter1))     # 报错

iter2 = iter([100, 'abc', True, [1, 2]])
print(iter2)

iter3 = iter({10, 20, 30})
print(iter3)

获取元素

不管以什么样的方式获取到了迭代器的元素,那么这个元素就会从迭代器中消失

  1. next(迭代器) - 返回指定迭代器最前面的元素
  2. 遍历
iter4 = iter('python')
print(next(iter4))    # p
print(next(iter4))    # y
print(next(iter4))    # t
print(next(iter4))    # h
print(next(iter4))    # o
print(next(iter4))    # n
# print(next(iter4))    # StopIteration
print('==============================')

iter5 = iter([10, 20, 'abc', True])
for x in iter5:
    print('x:', x)

# print(next(iter5))      # StopIteration

iter6 = iter('abc')
list1 = list(iter6)
print(list1)
# print(next(iter6))      # StopIteration

生成器

是序列;
获取元素的方式和迭代器一样

怎么创建生成器

调用带有yield关键字的函数就可以得到一个生成对象

调用没有yield的函数:会执行函数体,并且获取函数返回值

def func1():
    print('========')
    print('++++++++')
    return 100


result = func1()
print(result)
print('--------------------------------------------------')

调用带有yield关键字的函数:不会执行函数体,返回的数据是一个生成器对象

def func2():
    print('========')
    print('++++++++')
    if False:
        yield
    return 100


result = func2()
print('result:', result)     # result: <generator object func2 at 0x1037b5270>
print(list(result))    # [] -> 生成器result产生数据个数是0

确定生成产生数据的能力(包括产生数据的个数和值)

确定个数:执行完生成器对应的函数,会遇到几次yield,这个生成器就会产生多少个数据。

def func3():
    yield 100
    yield 'abc'
    yield False
    # for _ in range(3):
    #     yield


g1 = func3()
next(g1)
# next(g1)
# next(g1)
# next(g1)    # StopIteration

print(list(g1))

生成器产生数据的原理

在获取数据的时候才去执行函数体,而且每次执行到yield就停下来,将yield后面值作为获取到的数据,同时记录结束位置,下一次获取元素

接着上次结束的位置往后执行

def func4():
    print('开始')
    yield 10
    print('------')
    yield 100
    print('++++++')
    yield 1000
    print('结束')


g2 = func4()
# print('result1:', next(g2))
# print('result2:', next(g2))
# print('result3:', next(g2))
# print('result4:', next(g2))    #  StopIteration


def func5():
    print('hello')
    yield 11
    print('world')
    yield 22


g3 = func5()

next(g2)
next(g3)
next(g2)
next(g3)

练习: 创建一个学号生成器,能产生指定范围的学号,学号的格式是:XXXxxx

create_id(前缀, 长度) -> 前缀是java, 长度是3 -> java001 ~ java999

-> python2102, 长度4 -> python21020001 ~ python21029999

def create_id(pre: str, length: int):
for x in range(1, 10**length):
yield f’{pre}{x:0>{length}}’

c1 = create_id(‘py’, 2)
for x in c1:
print(x)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值