当前位置: 首页 > news >正文

10.3生成器yield\send

生成器yield\send

生成器的好处:缓解内存压力

# -*-coding:utf-8 -*-
__date__ = '2018/3/9 '
__author__ = 'xiaojiaxin'
__file_name__ = '生成器'

# a1=[x for x in range(5000000000)]
#将range(5000000000)全部扔进内存,速度非常慢,甚至会死机
a=(x for x in range(5))
print(a)
# <generator object <genexpr> at 0x0000003FB1622990>
#a变成生成器的对象,值不在a里面,把range(10)比喻成10道菜,a是厨师,a一次只做一道菜到内存
#调用数据
print(next(a))   # 内置方法,python3通用方法
# 0
print(next(a))
# 1
print(next(a))
# 2
print(a.__next__())   #内部方法
# 3
print(next(a))
# 4
#print(next(a))
# Traceback (most recent call last):
#   File "C:/Users/xiaojiaxin/PycharmProjects/fullstack1/week2/day9/生成器.py", line 25, in <module>
#     print(next(a))
# StopIteration
a=(x*x for x in range(5))
#生成器就是一个可迭代对象
for i in a:  #for循环对x内部进行了next()调用
    print(i)
# 0
# 1
# 4
# 9
# 16
#生成器一共有两种创建方式:1:() 2.yield关键字

def foo1():
    print("foo1")
    return 1
print(foo1)
# <function foo1 at 0x000000CAEBECD158>
print(foo1())   #执行函数
# foo1
# 1

def foo():
    print("ok11")
    yield   1

    print("ok22")
    yield   2

print(foo)
# <function foo at 0x000000CBE62E2E18>
g=foo()
print(g)  #不执行函数
# <generator object foo at 0x000000CBE8002990>

#执行生成器
next(g)
# ok11
next(g)
# ok22

#next(g)#报错

for i in foo():
    print(i)
# ok11
# 1
# ok22
# 2
#for i in  可迭代对象:
#检查一个对象是否为可迭代对象,有__iter__()内部方法
# l=[1,2,3]
# l.__iter__()
# t=(1,2,3)
# t.__iter__()
# d={1:"ok1",2:"ok2"}
# d.__iter__()
#列表,字典,元组之所有可以用for循环,是因为他们都是可迭代对象
#斐波那契数列
#0 1 1 2 3 5 8 13 21
#用递归函数方法
def feibo(n):
    if n==1:
        return 0
    elif n==2:
        return  1
    else:
        return feibo(n-1)+feibo(n-2)
print(feibo(9))
# 21
#0 1 1 2 3 5 8 13 21
def fibo(max):
    before,after=0,1
    n=0
    while n<max :
        print(after)
        before,after=after,before+after  #先执行右边
        n+=1

fibo(5)
#用生成器做斐波那契数列
def fibon(max):
    before,after=0,1
    n=0
    while n<max :
        before,after=after,before+after  #先执行右边
        n+=1
        yield before
print(fibon(1))  #生成器对象地址
for i in fibon(5):
    print(i)

顺便说一下:学生成器yield,是为了日后学习协程,非常关键的知识点

def bar():
    print("ok1")
    ret=yield  1
    print(ret)

    print("ok2")
    print(ret)
    ret2=yield 2
    print(ret2)

    print("ok3")
    print(ret)
    print(ret2)
    yield 3

b=bar()
print(b)
print(next(b))

#第一次send如果没有next(),只能传send(None)
b.send("edh")
b.send("gghg")

# send()将yield值返回

第一次send之前没有next,只能传b.send(None)
send和next最大的不同的是增加了一个新功能,存储yield的值。

大家对内容有任何问题,欢迎留言,定在第一时间解答,谢谢大家!

转载于:https://blog.51cto.com/10777193/2093016

相关文章:

  • Web Service中java与.net通信
  • 1050. [HAOI2006]旅行【并查集+枚举】
  • HDU-1421
  • 2251. [2010Beijing Wc]外星联络【后缀数组】
  • Tortoisesvn,鼠标右键菜单中找不到“检出”的处理方法
  • 麻烦大家反馈一下昨天的网站访问速度
  • 网关 Spring-Cloud-Gateway 源码解析 —— 网关初始化
  • shell中quotes的不同作用
  • C/C++入门必备
  • SqlServer在表中插入数据时出现主键冲突问题解决方式
  • 1、告别windows,决定
  • 深入浅出Power Shell——cmd调用PowerShell脚本
  • 专访黄隽实:Stay hungry, Stay foolish!
  • golang中应该怎么使用socket?
  • 第十一课 xshell实现linux与windows互文件、用户与密码的配置文件、用户和用户组的管理...
  • [nginx文档翻译系列] 控制nginx
  • Android Volley源码解析
  • Android单元测试 - 几个重要问题
  • Android系统模拟器绘制实现概述
  • CAP理论的例子讲解
  • Node项目之评分系统(二)- 数据库设计
  • PHP那些事儿
  • Vue小说阅读器(仿追书神器)
  • 基于遗传算法的优化问题求解
  • 将 Measurements 和 Units 应用到物理学
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端面试题总结
  • 如何学习JavaEE,项目又该如何做?
  • 十年未变!安全,谁之责?(下)
  • 数据仓库的几种建模方法
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux(权限管理)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (39)STM32——FLASH闪存
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 的程序集加载上下文
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net快速开发框架源码分享
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • ::
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • []我的函数库
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [BZOJ] 2044: 三维导弹拦截
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [Contest20180313]灵大会议
  • [CSS]盒子模型