我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python_生成器generator

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python_生成器generator

生成器generator

  生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,

  调用这个函数得到一个生成器对象

生成器函数

  函数体中包含yield语句的函数,返回生成器对象

  生成器对象,是一个可迭代对象,是一个迭代器

  生成器对象,是延迟计算、惰性求值的

def inc():
    for i in range(5):
        yield i

print(type(inc))
print(type(inc()))

x = inc()
print(type(x))
print(next(x))

for m in x:
    print(m, '*')

for m in x:
    print(m, '**')

普通的函数调用fn(),函数会立即执行完毕,但是生成器函数可以使用next函数多次执行

生成器函数等价于生成器表达式,只不过生成器函数可以更加复杂


def gen():
    print("line 1")
    yield 1
    print("line 2")
    yield 2
    print("line 3")
    yield 3

next(gen())
next(gen())

g =gen()
print(next(g))
print(next(g))
print(next(g))
print(next(g, 'End'))
print(next(g, 'End'))

总结:

 包含yield语句的生成器函数生成 生成器对象 的时候,生成器函数的函数体不会立即执行;

  next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出值,并暂停函数执行;

  再次调用next函数,和上一条一样的处理过程;

  没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration异常。



生成器应用

  无限循环

def counter():
    i = 0
    while True:
        i += 1
        yield i

def inc(c):
    return next(c)

c = counter()
print(inc(c))
print(inc(c))

计数器:

def inc():
    def counter():
        i = 0
        while True:
            i += 1
            yield i
    c = counter()
    return lambda : next(c)
foo = inc()
print(foo())
print(foo())
处理递归问题:

def fib():
    x = 0
    y = 1
    while True:
        yield y
        x, y = y, x+y

foo = fib()
for _ in range(5):
    print(next(foo))

for _ in range(100):
    next(foo)

print(next(foo))


协程coroutine:

  生成器的高级用法;

  比进程、线程轻量级;

  是在用户空间调试函数的一种实现;

  python3 asyncio就是协程实现,已经加入到标准库;

  python 3.5 使用async、await关键字直接原生支持协程;

  协程调试器实现思路:

    有2个生成器A、B

    next(A)后,A执行到了yield语句暂停,然后去执行next(B),B执行到yield语句也暂停,

    然后再次调用next(A),再调用next(B),周而复始,就实现了调试的效果;

    可以引入调试的策略来实现切换的方式;

  协程是一种非抢占式调试;



yield from

  yield from是python3.3出现的新的语法;

  yield from iterable 是 for item in iterable: yield item 形式的语法糖;

def inc():
    for x in range(10):
        yield x

foo = inc()
print(next(foo))
print(next(foo))

等价于下面的代码

def inc():
    yield from range(10)

foo = inc()
print(next(foo))
print(next(foo))

还可以 从可迭代对象中一个个拿元素

def counter(n):
    for x in range(n):
        yield x

def inc(n):
    yield from counter(n)

foo = inc(10)
print(next(foo))
print(next(foo))


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python_生成器generator

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python_生成器generator

生成器generator  生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,  调用这个函数得到一个生成器对象生成器函数  函数体中包含yield语句的函数,返回生成器对象  生成器对象,是一个
2023-01-31

Python 生成器 generator

前提条件: 如果函数含有yield就是生成器,执行过程中遇到yield就跳出。举例:def gen():for i in range(10):x = yield iprint(x)g=ge()print(g.send(None)))prin
2023-01-31

重新认识生成器Generator

我们知道,函数体包含 yield 关键字的函数不是一个普通函数。这种函数叫做 生成器 ( generator ),一般用于循环处理结构,应用得当可以极大优化内存使用效率。

Python3.10 Generator生成器Coroutine原生协程详解

这篇文章主要为大家介绍了Python3.10 Generator生成器Coroutine原生协程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-28

一文掌握生成器 Generator,利用 Generator 实现异步编程

Generator 是 ES6 提供的一个新的数据类型,可以叫做 Generator 函数,但跟普通函数又有些不同。

go语言生成器code generator怎么使用

这篇文章主要介绍“go语言生成器code generator怎么使用”,在日常操作中,相信很多人在go语言生成器code generator怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言生成器
2023-06-30

5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

文章目录 前言一、Mybatis Generator简介二、Maven插件运行方式三、生成配置 generatorConfig.xmlMyBatis3Simple风格MyBatis3风格MyBatis3DynamicSql风格
2023-08-17

MyBatis Generator ORM层面的代码自动生成器(推荐)

Mybatis Generator是一个专门为 MyBatis和 ibatis框架使用者提供的代码生成器,也可以快速的根据数据表生成对应的pojo类、Mapper接口、Mapper文件,甚至生成QBC风格的查询对象,这篇文章主要介绍了MyBatis Generator ORM层面的代码自动生成器,需要的朋友可以参考下
2023-01-30

MybatisX-Generator自动代码生成插件教程

这篇文章主要介绍了MybatisX-Generator自动代码生成插件教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录