迭代器和生成器

迭代器

1.迭代器是容器型数据类型;
打印一个迭代器无法查看迭代器中所有的元素,迭代器无法通过len获取元素个数;
如果想要使用迭代器中的元素,必须将元素从迭代器中取出,而且在取的时候只能从上往下按顺序取,取一个少一个,取出来的数据无法放回迭代器
2.创建迭代器(从pymysql(数据库)提取数据都是迭代器的形式提出来)

1)用iter将其他序列转换成迭代器

2)创建生成器

i1 = iter('abc')
i2 = iter([10, 20, 30, 40])
print(i1, i2)
3.迭代器的查操作
不管以什么样的方式获取到了迭代器中元素,那被获取到的元素一定会从迭代器中消失
1)获取单个元素:next(迭代器)
print(next(i1))  # a
print(next(i1))  # b
print(next(i1))  # c
# i1迭代器取出来完之后在取会报错
2)遍历
for i in i1:
    print(f'i:{i}')    #因为i1被取完了,所以i1是一个空的
for i in i2:
    print(f'i:{i}')
# print(next(i2))  报错。 for in 遍历完i2了 取出来完,i2迭代器为空
3)迭代器转换成序列
i3 = iter('hello')
result = list(i3)
print(result)   #['h', 'e', 'l', 'l', 'o']
# print(next(i3))   报错,i3已经空了
# list相当于已经取走了i3迭代器中所有的数据。

生成器(类似于算法)

1.生成器是容器型数据类型(具备创建多个数据的能力,而不是保存多个数据的能力)
打印生成器,无法查看所有的元素,生成器也不支持len操作。
如果需要使用生成器中的数据,必须将数据取出来,获取元素的时候取一个少一个
生成器获取数据的方式和迭代器一样。
优点在于保存内存时的优化
2.创建生成器
保存的并不是数据本身,而是产生数据的算法
调用带有yield关键字的函数,就可以得到一个生成器
def func1():
    print('===')
    print('+++')
    return 100
    yield
如果被调用的函数的函数体中有yield(不管yoeld在哪个位置),调用函数的时候不会执行函数体,也不会获取函数返回值,而是得到一个生成器对象(函数调用表达式的值就是生成器)
r = func1()
print(r)  # yield 不会执行到,next(r)会报错
3.创建生成器对应的函数
生成器创建数据的个数和数据的值,由在执行生成器对应的函数的函数体的时候会遇到几次yiled,每次遇到yield的时候对应的数据来决定。
执行函数体会遇到几次yield对应的生成器就可以创建多少个数据;
每次遇到yield,yield后面的值是什么,对应的元素就是什么
每取出一个数据就是少一个yield,yields有几个,生成器就会有创建几个数据
遇到yield函数将会暂时中止,返回yield后面的一个值。当需要取下一个yield后面的数据时,函数将从暂时中断处接着执行函数,直到遇到yield为止。
def func3(suj):
    for i in range(1, 100):
        yield f'{suj}{i:0>3}'


gen3 = func3('python')
print(next(gen3))
for i in gen3:
    print(f'i:{i}')
4.生成器产生数据的原理
调用函数创建生成器的时候不会执行函数体,获取生成器中的元素的时候才会执行函数体。
每次在执行函数体的时候从开始位置,执行到yield就停下来,并且将yield后面的数据作为获取到的元素。
def func4():
    print('====1==')
    yield 10
    print('=====2=')
    yield 20
    print('=3=====')
    yield 30
gen4 = func4()     # 函数调用不会执行函数体,此时调用函数即时生成一个生成器 gen4就是一个生成器
print(next(gen4))
print(next(gen4))
print(next(gen4))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值