Python迭代器和生成器

迭代器(iterator)

迭代器作为容器可以保护多个数据,迭代器的数据来源:1)将其他序列转换成迭代器 2)生成器
1)将其他序列转换成迭代器

iter1 = iter('abc')
print(iter1, type(iter1))

iter2 = iter([12, 30, 90])
print(type(iter2))

获取迭代器中的元素
不管用哪种方式去获取了元素的值,那么这个元素在迭代器中就不存在了
1)获取单个元素:next(迭代器)、迭代器.next() -> 获取迭代器中的第一个元素

iter3 = iter('hello')
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(iter3.__next__())

2)遍历:
for 变量 in 迭代器:
pass

iter4 = iter('world')
for x in iter4:
    print(x)

生成器(generator)

什么是生成器

1)生成器是迭代器中的一种
2)调用一个带有yield关键字的函数就可以得到一个生成器
如果一个函数中有yield关键字:
a.调用函数不会执行函数体
b.函数调用表达式的值不是函数的返回值,而是一个生成器对象

# 1.怎么去创建一个生成器
def func1():
    print('=======')
    if False:
        yield
    return 100


gen1 = func1()    # 这儿的gen1就是一个生成器对象
print('外部:', gen1)  # 外部: <generator object func1 at 0x00000217DBEF3F48>

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

1)一个生成器能够产生多少数据,就看执行完生成器对应的函数体会遇到几次yield;yield后面的值就是生成器能够产生的数据
2)每次获取生成器中的元素的时候,都是先去执行函数体,直到遇到yield,并且将yield后面的值作为获取元素的结果;并且保留结束的位置,下次获取下一个值的时候,从上次结束的位置接着执行函数体,直到遇到yield,如果从开始执行到函数结束都没有遇到yield,就会报StopIteration错误

def func2():
    print('+++++')
    yield 1
    print('-----')
    yield 100     # yield 后边可以跟数据;同一个函数可以有多个yield


gen2 = func2()
print(gen2)

print('函数外部:', next(gen2))
print('函数外部:', next(gen2))
# print('函数外部:', next(gen2))   # StopIteration
 写一个可以产生学号的生成器, 生成的时候可以自定制学号数字位的宽度和学号的开头
study_id_creater('py',5) -> 依次产生: 'py00001', 'py00002', 'py00003',....
   study_id_creater('test',3) -> 依次产生: 'test001', 'test002', 'test003',...
```python
def study_id_creater(str1, n):
    for i in range(1, 6):

        print(str1 + str(i).zfill(n))


study_id_creater('py', 5)
def study_id_creater(str1='abc', num=5):
    for i in range(1, num+1):
        yield str1 + str(i).zfill(7 - len(str1))


gen1 = study_id_creater()
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值