首页 > 其他分享 >生成器

生成器

时间:2023-12-13 12:22:36浏览次数:31  
标签:吃饭 food 生成器 yield next print

生成器

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

列表生成式

list1 = [x for x in range(5)]
print(list1)
# [0, 1, 2, 3, 4]

元组生成式

生成器对象可以强转成列表

tuple1 = (x**2 for x in range(5))
print(tuple1)
print(list(tuple1))
# <generator object <genexpr> at 0x000002208D89F580>
# [0, 1, 4, 9, 16]

print(tuple1.__next__())  #0
print(tuple1.__next__())  #1

yield关键字

​ 使用yield关键字定义一个生成器函数时,生成器函数中的yield语句会暂停函数执行并返回一个值,下一次调用该函数时会继续执行并返回下一个值。

def eater():
    print('开始吃饭 ovo ')
    while True:
        yield '开始'
        food = yield
        print(f'得到的食物是 :>>>> {food}, 开始吃饭喽 :>>>> {food}')


a=eater()
print(next(a))  #开始吃饭 ovo   开始
print(next(a))   #None
# 向yield传值前提必须卡在使用这个值前面的yield上面
print(a.send('鸡腿'))   #得到的食物是 :>>>> 鸡腿, 开始吃饭喽 :>>>> 鸡腿   开始
print(next(a))    #None
print(next(a))      #得到的食物是 :>>>> None, 开始吃饭喽 :>>>> None   开始
def eater():
    print('开始吃饭 ovo ')
    while True:
        yield '开始'
        dict1 = yield
        print(f'得到的食物是 :>>>> {dict1["food"]}, {dict1["name"]}:>>>>开始吃饭喽  ')


a=eater()
print(next(a))  #开始吃饭 ovo   开始
print(next(a))   #None
# send 只能传一个值,但可以是字典
print(a.send({'food':'鸡腿','name':'tom'}))  #得到的食物是 :>>>> 鸡腿, tom:>>>>开始吃饭喽   开始
使用装饰器
def init(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        next(res)
        return res
    return wrapper

@init
def eater():
    print('开始吃饭 ovo ')
    while True:
        food = yield
        print(f'得到的食物是 :>>>> {food}, 开始吃饭喽 :>>>> {food}')


res = eater()
res.send('鸡腿')
res.send('鸭腿')

# 开始吃饭 ovo 
# 得到的食物是 :>>>> 鸡腿, 开始吃饭喽 :>>>> 鸡腿
# 得到的食物是 :>>>> 鸭腿, 开始吃饭喽 :>>>> 鸭腿
  • 若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象
生成器实现for循环
def my_range(start, end, step=1):
    if end<start:
        print(f'开始值不能大于结束值!')

    while start < end:
        yield start
        start += step


for i in my_range(start=1,end=10,step=2):
    print(i)

标签:吃饭,food,生成器,yield,next,print
From: https://www.cnblogs.com/unrealqcc/p/17898797.html

相关文章

  • 迭代器和生成器
    迭代器什么是迭代器迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代。为何要有迭代器迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型有:列表,字符串,元组,字典,集合,打开文件文件是可迭代对象,也是迭代器......
  • 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编写=>前后端开发实现=>测试验证=>部署上线,带大家一步步完成整个项目。......
  • 新建模块&新建用户表&修改代码生成器文件&新建菜单
    1.新建模块打开IDEA在项目结构中新建rome-hotel的一个springboot项目,什么依赖都不需要 在pom.xml文件中修改坐标,引用父坐标 在父级pom文件中将模块加入 在rome-admin中的pom文件中加入admin-hotel,这样就能带动这个模块启动 将包名修改成和rome-admin一样 再创建其......
  • Python——第四章:生成器(generator)
    生成器(generator):  生成器的本质就是迭代器  创建生成器的两种方案:    1.生成器函数    2.生成器表达式  生成器函数    生成器函数中有一个关键字yield    生成器函数执行的时候,并不会执行函数,得到的是生成器.   ......
  • 2-4 匿名函数、生成器、内置函数、推导式
    ​ 概要:匿名函数生成器内置函数推导式 1.匿名函数传统的函数的定义包括了:函数名+函数体。defsend_email():  pass​#1.执行send_email()#2.当做列表元素data_list=[send_email,send_email,send_email]#3.当做参数传递other_func......