首页 > 其他分享 >生成器

生成器

时间:2023-12-14 19:34:01浏览次数:25  
标签:生成器 yield next print my eat

生成器

(一)什么是生成器

  • Python中的生成器是一种特殊的迭代器,可以在需要时生成数据,而不必提前从内存中生成并存储整个数据集。
  • 通过生成器,可以逐个生成序列中的元素,而无需一次性生成整个序列。
  • 生成器在处理大数据集时,具有节省内存、提高效率的特点。
  • 生成器是一种特特殊迭代器。
    • 迭代器不一定是生成器
    • 生成器一定是迭代器
"""生成器"""
#生成器:是一种特殊的迭代器
#迭代器不一定是生成器
#生成器一定是迭代器

(二)生成器创建方式

(1)列表推导式

  • 使用列表推导式时,可以将列表推导式的方括号改为圆括号,即可创建一个生成器。



#1.列表生成式生成列表
list=[ i  for i in  range(5)]
print(list)#[0, 1, 2, 3, 4]
#2.将列表改成元组
#看起来是一个元组,其实是一个生成器对象
tuple=(i  for  i  in  range(5))
print(tuple)#<generator object <genexpr> at 0x000001B4913044A0>

#用next()打印出生成器的每一个元素
print(next(tuple))
print(next(tuple))
print(next(tuple))
print(next(tuple))
print(next(tuple))
# 0
# 1
# 2
# 3
# 4



#生成器本身就是一个迭代器,可以用for循环遍历生成器对象
tuple=(i  for  i  in  range(5))
for i in tuple:
    print(i)
    
# 0
# 1
# 2
# 3
# 4

(2)yield关键字

  • yield关键字介绍
    • 使用yield关键字定义一个生成器函数时,生成器函数中的yield语句会暂停函数执行并返回一个值,下一次调用该函数时会继续执行并返回下一个值。
"""yield关键字"""
# my_generator()是一个生成器函数,通过yield关键字来逐个生成值
# 调用函数时,会得到一个生成器对象
# 可以用next()逐个的返回生成器中的值。
def my_generator():
    yield 1
    yield 2
    yield 3

my_generator=my_generator()
print(next(my_generator))
print(next(my_generator))
print(next(my_generator))
# 1
# 2
# 3
  • send方法 只能传一个位置参数,如果下传多个,可以考虑可变数据类型: 列表/字典/元组/集合。
# # send方法 只能传一个位置参数,如果下传多个,可以考虑可变数据类型:  列表/字典/元组/集合

# def eater():
#     print('开始吃饭 ovo ')
#     while True:
#         yield '开始喽'  # 第一次 next 发现有一个 yield ,卡住了
#         kwargs = yield  # 第二次 next 发现有一个 yield ,卡住了
#         print(f'得到的食物是 :>>>> {kwargs},  开始吃饭喽 :>>>> {kwargs}')
#
# my_eat = eater()
# print(next(my_eat), type(next(my_eat)))#开始喽 <class 'NoneType'>
# print(next(my_eat))# 得到的食物是 :>>>> None,  开始吃饭喽 :>>>> None   开始喽
# print(next(my_eat))#None
# print(next(my_eat))#得到的食物是 :>>>> None,  开始吃饭喽 :>>>> None   开始喽


# send方法传入一个参数
# def eater():
#     print('开始吃饭 ovo ')
#     while True:
#         yield '开始喽'  # 第一次 next 发现有一个 yield ,卡住了
#         kwargs = yield  # 第二次 next 发现有一个 yield ,卡住了
#         print(f'得到的食物是 :>>>> {kwargs},  开始吃饭喽 :>>>> {kwargs}')
#
# my_eat = eater()
# print(next(my_eat), type(next(my_eat)))#开始吃饭 ovo     开始喽 <class 'NoneType'>
# print(my_eat.send('麻辣香锅!'))#得到的食物是 :>>>> 麻辣香锅!,  开始吃饭喽 :>>>> 麻辣香锅! 开始喽
# print(next(my_eat))#None
# print(next(my_eat))#得到的食物是 :>>>> None,  开始吃饭喽 :>>>> None   开始喽
# print(next(my_eat))#None


# # send方法传入多个参数
# def eater():
#     print('开始吃饭 ovo ')
#     while True:
#         yield '开始喽'  # 第一次 next 发现有一个 yield ,卡住了
#         kwargs = yield  # 第二次 next 发现有一个 yield ,卡住了
#         print(f'得到的食物是 :>>>> {kwargs["food"]},  {kwargs["name"]}开始吃饭喽 :>>>> {kwargs["food"]}')
#
# my_eat=eater()
# print(next(my_eat))#开始吃饭 ovo     开始喽 <class 'NoneType'>
# print(next(my_eat))#None
# print(my_eat.send({'food':'酸菜鱼','name':'syh'}))#得到的食物是 :>>>> 酸菜鱼,  syh开始吃饭喽 :>>>> 酸菜鱼  开始喽
# print(next(my_eat))#none
  • 定义生成器并使用装饰器
# # 定义生成器  并使用装饰器
# def outer(func):# func -----eater生成器函数
#     def inner(*args,**kwargs):
#         my_eat=func(*args,**kwargs)# my_eat 是得到生成器对象
#         next(my_eat)#开始吃饭ovo
#         return my_eat
#     return inner
# @outer
# def eater(*args,**kwargs):
#     print('开始吃饭 ovo ')
#     while True:
#         kwargs = yield  # 第二次 next 发现有一个 yield ,卡住了
#         print(f'得到的食物是 :>>>> {kwargs}, {kwargs} 开始吃饭喽 :>>>> {kwargs}')
# 
# res=eater()
# print(res)
# res.send('酸菜鱼')#得到的食物是 :>>>> 酸菜鱼, 酸菜鱼 开始吃饭喽 :>>>> 酸菜鱼

生成器实现for循环

# 生成器实现for循环
def my_range(start,end,step=2):
    if start>end:
        print(f"开始值不能大于结束值")
    while start<end:
        yield start
        start+=step
myrange=my_range(start=0,end=10,step=2)
print(next(myrange))
print(next(myrange))
print(next(myrange))
print(next(myrange))
print(next(myrange))
# 0
# 2
# 4
# 6
# 8

标签:生成器,yield,next,print,my,eat
From: https://www.cnblogs.com/suyihang/p/17901828.html

相关文章

  • 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......
  • 生成器
    生成器Python中的生成器是一种特殊的迭代器,可以在需要时生成数据,而不必提前从内存中生成并存储整个数据集。通过生成器,可以逐个生成序列中的元素,而无需一次性生成整个序列。生成器在处理大数据集时,具有节省内存、提高效率的特点。迭代器不一定是生成器,生成器一定是迭代器。......
  • 迭代器和生成器
    迭代器什么是迭代器迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代。为何要有迭代器迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型有:列表,字符串,元组,字典,集合,打开文件文件是可迭代对象,也是迭代器......
  • Mybatis使用generator逆向工程生成器生成entity、mapper、.xml模版类
    前言今天将表建好了,但是一个一个的建实体类、Mapper接口、Mapper.xml文件就十分的麻烦,所以我就想到了MyBatis逆向,今天就操作一把!这里我们采用maven来进行操作。一、新建generatorConfig.xml文件首先建好表,在你的项目的resource文件中新建generatorConfig.xml文件。代码如下:<?xmlv......
  • 【scikit-learn基础】--『数据加载』之样本生成器
    除了内置的数据集,scikit-learn还提供了随机样本的生成器。通过这些生成器函数,可以生成具有特定特性和分布的随机数据集,以帮助进行机器学习算法的研究、测试和比较。目前,scikit-learn库(v1.3.0版)中有20个不同的生成样本的函数。本篇重点介绍其中几个具有代表性的函数。1.分类聚类......
  • mybatis-plus 新版代码生成器模板
    publicclassCodeGenerator{publicstaticvoidmain(String[]args){//数据源配置FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/xdclass?useUnicode=true&characterEncoding=utf-8&useSSL=false","root",&qu......
  • 迭代器和生成器、异常捕获
    一、迭代器(Iterator)1、可迭代对象(Iterable)和可索引对象存储了元素的一个容器对象,且容器中的元素可以通过“__iter__()”方法或“__getitem__()”方法访问。可迭代对象不能独立进行迭代,可通过“for…in”遍历来完成2、常见的可迭代对象字符串、列表、元组、字典、集合、文件......
  • python 可迭代对象 迭代器 生成器
    一个对象若要用for循环则需实现def__iter__(self,item)或def__iter__(self,item)方法可迭代对象实现了def__iter__(self,item)方法  迭代器  实现了def__iter__(self,item)和def__next__(self)方法  迭代器一定是可迭代对象可迭代对象不一定是迭代器from......
  • 如何开发代码生成器平台?分享下思路
    大家好,我是鱼皮,我的新项目《鱼籽-定制化代码生成项目》系列教程正式开始!本次项目依然是从0到1带大家开发,会遵循企业项目开发的标准流程:需求分析=>技术选型=>项目设计=>项目初始化=>Demo编写=>前后端开发实现=>测试验证=>部署上线,带大家一步步完成整个项目。......