day15(生成器)

发布时间 2023-12-19 12:09:39作者: 王苗鲁

1.生成器对象

1.本质
	还是内置有__iter__和__next__的迭代器对象
2.区别
	迭代器对象是解释器自动提供的
    	数据类型\文件对象>>>:迭代器对象
	生成器对象是程序员编写出来的
    	代码、关键字>>>:迭代器对象(生成器)
3.创建生成器的基本语法
	函数体代码中填写yield关键字

生成器对象

# 生成器:
# 函数内包含有yield关键字,
# 再调用函数,就不会执行函数体代码,拿到的返回值就是一个生成器对象
def chicken():
    print('=====>first')
    yield 1
    print('=====>sencond')
    yield 2
    print('=====>third')
    yield 3


obj = chicken()


# print(obj)
# 生成器本质就是迭代器,也就是说生成器的玩法其实就是迭代器的玩法
# print(obj.__iter__() is obj)
# res=obj.__next__()
# print(res)
#
# res1=obj.__next__()
# print(res1)
#
# res2=obj.__next__()
# print(res2)
#
# obj.__next__()


# 1、iter_obj=obj.__iter__(),拿到迭代器
# 2、出发iter_obj.__next__(),拿到该方法的返回值,赋值给item
# 3、周而复始,直到函数内不在有yield,即取值完毕
# 4、for会检测到StopIteration异常,结束循环
# for item in obj:
#     print(item)


# 总结yield:
# 1、为我们提供了一种自定义迭代器的方式,
#    可以在函数内用yield关键字,调用函数拿到的结果就是一个生成器,生成器就是迭代器
# 2、yield可以像return一样用于返回值,区别是return只能返回一次值,而yield可返回多次
#    因为yield可以保存函数执行的状态

2.自定义range方法

# def my_range():
#     print('start........')
#     n=0
#     while True:
#         yield n
#         n+=1

# obj=my_range()
# print(obj)

# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())

# for i in my_range():
#     print(i)


def my_range(start, stop, step=1):
    n = start
    while n < stop:
        yield n  # yield 4
        n += step  # 5


# obj=my_range(3,7,2) #3,5,
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())
# print(obj.__next__())


for item in my_range(5, 10, 2):
    print(item)

3.yield冷门用法

def eat(name):
    print('%s ready to eat' % name)
    while True:
        food = yield 123  # food='骨头'
        print('%s start to eat %s' % (name, food))
        print('哈哈哈')


dog1 = eat('alex')

# 1、必须初始化一次,让函数停在yield的位置
res0 = dog1.__next__()

# 2、接下来的事,就是喂狗
# send有两方面的功能
# 1、给yield传值
# 2、同__next__的功能
res1 = dog1.send('泔水')
# print(res1)
# res2 = dog1.send('骨头')
# # print(res2)
# res3 = dog1.send('汉堡包')
# # print(res3)

4.生成器表达式及笔试题

# 说白了就是生成器的简化写法
# l1 = [i ** 2 for i in range(100)]
# print(l1)


l1 = (i ** 2 for i in range(100))  # 生成器对象
print(l1)  # <generator object <genexpr> at 0x000001DFC07F7E40>
for i in l1:
    print(i)

"""
面试题(有难度)
	大致知道流程即可
"""


def add(n, i):  # 普通函数 返回两个数的和  求和函数
    return n + i


def test():  # 生成器
    for i in range(4):
        yield i


g = test()  # 激活生成器
for n in [1, 10]:
    g = (add(n, i) for i in g)
    """
    第一次for循环
        g = (add(n, i) for i in g)
    第二次for循环
        g = (add(10, i) for i in (add(10, i) for i in g))
    """
res = list(g)
print(res)

# A. res=[10,11,12,13]
# B. res=[11,12,13,14]
# C. res=[20,21,22,23]
# D. res=[21,22,23,24]
'''不用深入研究 大致知道起始数即可'''