首页 > 其他分享 >day15(生成器)

day15(生成器)

时间:2023-12-19 12:11:55浏览次数:29  
标签:__ obj 生成器 yield next day15 print

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]
'''不用深入研究 大致知道起始数即可'''

标签:__,obj,生成器,yield,next,day15,print
From: https://www.cnblogs.com/wangmiaolu/p/17913420.html

相关文章

  • Python迭代器和生成器
    【一】迭代器介绍迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代whileTrue:msg=input(">>:").strip()......
  • HydroOJ 从入门到入土(7)Hydro自带数据生成器使用说明(>=4.10.1)
    Hydro更新了一个新功能,可以直接用自带的数据生成器,在线生成数据,简单记录一下使用方法目录1.文件准备2.使用步骤3.注意事项4.文件模版1.文件准备gen.py(数据生成器,后附模版)std.cpp(标准程序,后附模版)文件名随意,其他的类型应该也行,不过没试.2.使用步......
  • python高级之生成器
    生成器一、生成器与yield若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象defmy_range(start,stop,step=1):print('start...')whilestart<stop:yieldstartstart+=stepprint('end...')g=my_range(0,3)......
  • C#_Win32_PInvoke源码生成器
    介绍一个源代码生成器,用于向C#项目添加一组用户定义的Win32P/Invoke方法和相关的类型。链接地址:https://github.com/microsoft/CsWin32还在手动添加平台调用的代码或者增加无用的程序集?微软的官方解决方案来了!特色快速将P/Invoke方法和相关类型添加到您的C#项目......
  • 【python基础之生成器】---生成器
    title:【python基础之生成器】---生成器date:2023-12-1418:54:06updated:2023-12-0619:42:00description:【python基础之生成器】---生成器cover:https://home.cnblogs.com/u/dream-ze/【一】什么是生成器?-Python中的生成器是一种特殊的迭代器,可以在需......
  • 生成器
    生成器生成器一定是迭代器,迭代器不一定是生成器可以在需要时生成数据,通过生成器,可以逐个生成序列中的元素,而无需一次性生成整个序列生成器也能用next()方法,因为生成器是一种特殊的迭代器【一】生成器的两种创建方式(1)列表生成式列表num_list=[iforiinrange(10)......
  • 生成器
    生成器1.生成器生成器是一种特殊的迭代器(迭代器不一定是生成器,但生成器一定是迭代器)生成器是由函数+yield关键字创造出来的写法,在特定情况下,用他可以帮助我们节省内存1.1生成器函数函数中有yield存在时,这个函数就是生产生成器函数deffunc():print(111)yiel......
  • 生成器
    生成器(一)什么是生成器Python中的生成器是一种特殊的迭代器,可以在需要时生成数据,而不必提前从内存中生成并存储整个数据集。通过生成器,可以逐个生成序列中的元素,而无需一次性生成整个序列。生成器在处理大数据集时,具有节省内存、提高效率的特点。生成器是一种特特殊迭代器......
  • yield关键字和生成器
    yield关键字和生成器【1】列表元组生成式num_list=[i**2foriinrange(10)]#[0,1,4,9,16,25,36,49,64,81]【2】yield关键字defgenerator():yield1yield2yield3generator=generator()print(next(generator))defeat():print('开始......
  • 迭代器、生成器
    【一】迭代器迭代器(Iterator)是Python中用于遍历可迭代对象的一种机制。可迭代对象是指那些可以被迭代的对象,例如列表、元组、字符串、集合、字典。迭代器提供了一种顺序访问可迭代对象元素的方式,而不需要事先知道对象的内部结构。迭代器是通过实现两个特殊方法来工作的:__iter......