首页 > 其他分享 >生成器

生成器

时间:2023-12-15 09:13:26浏览次数:20  
标签:food 生成器 yield print my eat

生成器

  • 生成器一定是迭代器,迭代器不一定是生成器
    • 可以在需要时生成数据,通过生成器,可以逐个生成序列中的元素,而无需一次性生成整个序列
  • 生成器也能用next()方法,因为生成器是一种特殊的迭代器

【一】生成器的两种创建方式

(1)列表生成式

  • 列表
num_list = [i for i in range(10)]
print(num_list)

(2)元组生成式

  • 查看元组生成式里面的数据:用list类型强转成列表
num_tuple = (i ** 2 for i in range(10))
print(num_tuple, type(num_tuple))  # <generator object <genexpr> at 0x000002CCAA794350> <class 'generator'>
print(list(num_tuple))  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

【二】yield关键字

(1)yield关键字介绍

  • 使用yield关键字定义一个生成器函数时,生成器函数中的yield语句会暂停函数执行并返回一个值,下一次调用时会继续执行并返回下一个值
def my_generator():
    yield 1
    yield 2
    yield 3

my_iter = my_generator()
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))

(2)yield关键字使用

  • 向yield传值的前提是,必须卡在使用这个值的前面的yield上面
def eat():
    print('开始吃饭')
    while True:
        food = yield
        print(f'得到的食物是 :>>>{food},开始吃饭:>>> {food}')

my_eat=eat()
print(next(my_eat))
print(my_eat.send('宫保鸡丁')) 
# 开始吃饭
# None
# 得到的食物是 :>>>宫保鸡丁,开始吃饭:>>> 宫保鸡丁
# None
  • send方法只能传一个位置参数,不能传两个,如果想传多个,可以考虑可变数据类型:字典/列表/元组/集合
def wrapper(func):  # eater 生成器函数
    def inner(*args, **kwargs):
        my_eat = func(*args, **kwargs)  # my_eat得到的是生成器对象
        # print(my_eat)  # <generator object eater at 0x000001DA9FB668F0>
        next(my_eat)  # 开始吃饭 ovo
        return my_eat

    return inner

@wrapper  # eater = wrapper(eater)
def eater():
    print('开始吃饭 ovo ')
    while True:
        kwargs = yield  # 第二次 next 发现有一个 yield ,卡住了
        print(f'得到的食物是 :>>>> {kwargs["food"]}, {kwargs["name"]} 开始吃饭喽 :>>>> {kwargs["food"]}')


res = eater()
res.send({'food': '茄子肉丁', 'name': 'hope'})
res.send({'food': '拔丝红薯', 'name': 'dream'})

(3)生成器实现for循环

def my_range_one(start, end, step=1):
    if end < start:
        print(f'开始值不能大于结束值')
    while start < end:
        yield start
        start += step


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

标签:food,生成器,yield,print,my,eat
From: https://www.cnblogs.com/ssrheart/p/17902629.html

相关文章

  • 生成器
    生成器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......
  • 生成器
    生成器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、常见的可迭代对象字符串、列表、元组、字典、集合、文件......