迭代器与生成器

# 1.什么是生成器(generator)?
# 生成器属于迭代器,生成器一定是迭代器,迭代器不一定是生成器。
# a.python中使用了yield关键字的函数被称为生成器。
# b.生成器是迭代器的子集。

# 2.生成器的性质:
"""
a.生成器返回的是一个迭代器。
b.在调用生成器函数时,函数体并不执行,只返回一个生成器对象。
c.在对生成器对象使用next方法或者遍历的时候,生成器函数体才真正执行。
"""
# 3.验证生成器的性质
# a.验证在调用生成器函数时,函数体并不执行,只返回一个生成器对象。
def func1():
    print('我是一个生成器')
    yield
result = func1()
print(result)

# b.验证在对生成器对象使用next方法或者遍历的时候,生成器函数体才真正执行。
# c.验证生成器返回的是一个迭代器。
def func2():
    print('######')
    yield 100
    print('------')
    yield 200
    print('======')
    return 300

result2 = func2()
print(result2)
print(next(result2))
print(next(result2))
# print(next(result2))    # 报错:StopIteration: 300
# 为什么上方代码报错了?
# 生成器中元素的个数取决于函数体中有几个yield被执行了。


# 可迭代对象:
# 迭代:python中一个非常强大的功能,它可以访问容器(字符串、列表、元祖、集合、字典、range)。
# 迭代是通过for循环遍历对象中的每一个元素,将元素取出来的过程。所以:容器都是可迭代对象。
# 可迭代对象除了包含常见的序列,还包括一个叫做迭代器的东西。

# 1.什么是迭代器:
# 可迭代对象的一个子集,它是一个可以记住遍历的位置的对象。

# 2.性质
"""
a.可以遍历。
b.打印迭代器无法查看其中的元素,也无法统计迭代器中元素个数(不能使用len())
c.想要获取迭代器中的元素,只能一个一个取。
d.这个元素被取出,迭代器中就再也没有这个元素。
"""
# 3.如何创建迭代器:
# a.使用iter()将其他序列转换成迭代器(任何序列都能转成迭代器)
# b.创建一个生成器。
iter1 = iter('hello')
iter2 = iter([1, 2, 3])
iter3 = iter({"name": "张三"})
print(iter1)
# print(len(iter1))   # TypeError: object of type 'str_iterator' has no len()
# next()
# 获取迭代器中的元素使用next方法
print(next(iter1))
print(next(iter1))
print(next(iter1))
for i in iter1:
    print(i)
# print(next(iter1))  # 报错:StopIteration

# 拓展:next和循环都可以拿到迭代器中的元素并且取完以后迭代器中就没有这个元素了。可以参考数据结构中的"队列"。

# 练习:写一个生成器可以创建学生的学号:Python001、Python002、Python999等
# 'python001'、'python002'、.... 'python999'
def fun():
    for x in range(1, 1000):
        yield f'python{x:0>3}'

gen_num = fun()
for _ in range(102):
    print(next(gen_num))
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十五 0.o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值