python中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值返回

原文发布于微信公众号 - 编程坑太多(idig88)

原文发表时间:2018-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python提取任意长度整数的每位数字

问题描述:编写函数,给定一个任意长度整数,返回每位数字,例如给定1234则返回(1, 2, 3, 4)。问题本身并不复杂,主要演示Python运算符和内置函数的...

37650
来自专栏超然的博客

ECMAScript 6 笔记(一)

       1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国...

11730
来自专栏C/C++基础

多字节与宽字符串的相互转换

说到多字节字符串与宽字符串,不得不说一下多字节字符与宽字符。多字节字符实际上是由多个字节来表示一个字符,在各个国家和地区采用不同的编码方案,不同编码方案字符码值...

17520
来自专栏Vamei实验室

Python深入01 特殊方法与多范式

Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来...

22250
来自专栏算法修养

pta 习题集 5-15 数组循环左移

本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(≥0≥0)个位...

36460
来自专栏数据结构与算法

1009 产生数 2002年NOIP全国联赛普及组

009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 De...

27240
来自专栏Java 源码分析

Java面向对象基础

     面向对象一直是一种很流行的思想,他的精髓也就在于他的三大特性:封装,继承和多态。本文就在这三个方面简单的谈一谈Java的面向对象基础。 1.封装:  ...

35650
来自专栏Java学习网

Java实现的手工做乘法方法,给出二个字符串数字,返回相乘结果

给定两个字符串数字,返回两数字相乘的结果字符串;如:String a="200",String b="10",要求返回"2000"。 问题分析: 解决这个问题的...

76090
来自专栏编程

Python中的数字

写Python文件“使用说明”: Python的文件当然要以.py为结尾。 Linux上编写python文件要声明编译器位置: 首行:#!/usr/bin/py...

26080
来自专栏一个小程序员的成长笔记

私有变量

11440

扫码关注云+社区

领取腾讯云代金券