# 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))