yield

python中yield的用法详解-转载

天大地大妈咪最大 提交于 2019-12-02 16:42:52
原文链接: https://blog.csdn.net/mieleizhi0522/article/details/82142856  首先我要吐槽一下,看程序的过程中遇见了yield这个关键字,然后百度的时候,发现没有一个能简单的让我懂的,讲起来真TM的都是头头是道,什么参数,什么传递的,还口口声声说自己的教程是最简单的,最浅显易懂的,我就想问没有有考虑过读者的感受。  接下来是正题:  首先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器),好了,如果你对这些不明白的话,那先把yield看做return,然后直接看下面的程序,你就会明白yield的全部意思了: >>> def foo(): print("starting...") while True: res = yield 4 print("res:",res) >>> g = foo() >>> print(next(g)) >>> print("*"*20) >>> print(next(g)) 输出: starting... 4 *************

迭代器和生成器

旧时模样 提交于 2019-12-02 12:06:05
迭代器(iterator) 迭代器是在python2.2中被加入的,它为类序列对象提供了一个类序列的接口。有了迭代器可以迭代一个不是序列的对象,因为他表现出了序列的行为。 什么迭代器呢? 迭代器的实质是实现了next()方法的对象,常见的元组、列表、字典都是迭代器。 迭代器中重点关注两种方法: iter方法:返回迭代器自身。可以通过python内建函数iter()调用。 next方法:当next方法被调用的时候,迭代器会返回它的下一个值,如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。该方法可以通过 python 内建函数next()调用。 举例 内建函数iter()可以从可迭代对象中获得迭代器。 >>> it = iter([1,2,3]) >>> next(it) 1 >>> next(it) 2 >>> next(it) 3 >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>> 迭代器是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器。 __iter_

python迭代器、生成器和装饰器

对着背影说爱祢 提交于 2019-12-02 12:01:56
文章目录 生成器 生成器表达式(generator expression) 通过使用yield关键字定义 生成器并行 前戏 高潮 迭代器 迭代器概述 iter()函数 创建迭代器 创建一个迭代器(类) 内置迭代器工具 count无限迭代器 cycle 无限迭代器,从一个有限序列中生成无限序列: itertools的子模块 islice 控制无限迭代器输出的方式 装饰器 高阶函数 嵌套函数 高阶函数+嵌套函数 = 装饰器 类装饰器 带参数的decorator 实例---登录认证 生成器 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator: 生成器表达式(generator expression) L = [ x + 1 for x in range ( 10 )

python全栈闯关--14-生成器进阶

…衆ロ難τιáo~ 提交于 2019-12-02 10:47:06
1、复习 def generator(): print('1') yield 'a' print('2') yield 'b' print('3') g = generator() res = g.__next__() # 第一个__next__执行到第一个yiled停止, 并返回第一个yiled处的值 print(res) res = g.__next__() # 第二个__next__执行到第二个yiled停止, 并返回第二个yiled处的值 print(res) res = g.__next__() # 虽然执行了print('3')操作,但是报错,因为后续没有yiled了,为了避免报错,可以结尾加上yiled print(res) 2、send def generator(): print('1') num = yield 'a' # 此处如果继续执行,使用__next__触发,num将会被复制None。使用send,num将会接收seed的值 print("seed num:%s" % num) print('2') yield num * 2 print('3') yield g = generator() res = g.__next__() # 第一个__next__执行到第一个yiled停止, 并返回第一个yiled处的值 print(res) res = g

generator keeps returning the same value

旧街凉风 提交于 2019-12-02 09:30:46
I am stuck on this one piece of code because I can't get the generator to return me a the next value every time its called – it just stays on the first one! Take a look: from numpy import * def ArrayCoords(x,y,RowCount=0,ColumnCount=0): # I am trying to get it to print while RowCount<x: # a new coordinate of a matrix while ColumnCount<y: # left to right up to down each yield (RowCount,ColumnCount) # time it's called. ColumnCount+=1 RowCount+=1 ColumnCount=0 Here is what I get: >>> next(ArrayCoords(20,20)) ... (0, 0) >>> next(ArrayCoords(20,20)) ... (0, 0) But it's just stuck on the first one!

Java Thread及其synchronized,wait,sleep,join,yeid,interrupt

浪子不回头ぞ 提交于 2019-12-02 09:05:48
Java SE7 API - Thread: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#yield%28%29 参考资料: http://blog.csdn.net/lqqmisslll/article/details/54208491 一、线程的简介 当JVM启动的时候, 通常会有一个独立的非守护线程(也就是类中的main方法所在的线程).JVM会继续运行,除非发生以下情况: Runtime类的exit()方法被调用,并且安全管理者允许退出发生。 所有非守护线程都已经死了,不管是从run方法中返回的还是因为run方法中抛出了异常。 注意:当所有非守护线程都执行结束(包括主线程),那么守护线程也会退出。因为守护线程是无法脱离非守护线程而独自存在的。 二、创建线程有两种方式: 方法1:声明一个类作为Thread的子类(extends Thread),子类重写(override)Thread类的run()方法。子类的实例可以被分配和start。 //比如:该线程用来计算比指定起始值大的素数。 class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; }

ES6学习

老子叫甜甜 提交于 2019-12-02 08:40:21
ES6学习笔记(四) 该学习笔记源于B站视频https://www.bilibili.com/video/av47304735?from=search&seid=16810589178466991647 一、生成器Generator 1、可以开始、暂停、开始、暂停、、、,并且可以传入另外的参数。 eg: function * listColors ( ) { yield 'red' ; //本次执行这个函数的返回值 yield 'green' ; } const colors = listColors ( ) ; //调用 colors . next ( ) //类似遍历器 2、生成器可以用来控制AJAX的工作流。 function ajax ( url ) { axios . get ( url ) . then ( res => userGen . next ( res . data ) ) ; } function * steps ( ) { const users = yield ajax ( 'https://api.github.com/users' ) ; const firstUser = yield ajax ( `https://api.github.com/users/ ${ users [ 0 ] . login } ` ) ; const

python协程详解

你说的曾经没有我的故事 提交于 2019-12-02 08:05:34
python协程详解 一、什么是协程 协程又称为微线程,协程是一种用户态的轻量级线程 协程拥有自己的寄存器和栈。协程调度切换的时候,将寄存器上下文和栈都保存到其他地方,在切换回来的时候,恢复到先前保存的寄存器上下文和栈,因此:协程能保留上一次调用状态,每次过程重入时,就相当于进入上一次调用的状态。 协程的好处: 1.无需线程上下文切换的开销(还是单线程) 2.无需原子操作(一个线程改一个变量,改一个变量的过程就可以称为原子操作)的锁定和同步的开销 3.方便切换控制流,简化编程模型 4.高并发+高扩展+低成本:一个cpu支持上万的协程都没有问题,适合用于高并发处理 缺点: 1.无法利用多核的资源,协程本身是个单线程,它不能同时将单个cpu的多核用上,协程需要和进程配合才能运用到多cpu上(协程是跑在线程上的) 2.进行阻塞操作时会阻塞掉整个程序:如io 二、了解协程的过程 1、yield工作原理 从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数。 yield在协程中的用法: 在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出--如果yield关键字后面没有表达式,那么生成器产出None。 在协程中yield也可能从调用方接受数据,调用方是通过send(datum)的方式把数据提供给协程使用,而不是next(...

generator 到 async 的简单理解。

人盡茶涼 提交于 2019-12-02 07:07:55
generator 到 async 的简单理解。觉得实现方式很有意思。 1. generator generator 函数返回一个遍历器 每次调用next 方法 返回 有着value 和done 两个属性的对象 yield 后面的表达式即为 返回对象 value属性的值 举个简单例子: generator 函数返回一个遍历器 遍历器对象每执行一次next() 都只执行了generator 函数内部部分代码,遇到yield本次执行就结束了。 借助 工具 查看generator 经过转换后的代码,来了解一下generator 的大概实现 源码 1 function *gen() { 2 console.log('开始') 3 let a = yield '第一步' 4 console.log(a) 5 let b = yield '第二步' 6 console.log(b) 7 let c = yield '第三步' 8 console.log(c) 9 } 10 11 var it = gen() 12 console.log(it.next('')) 13 console.log(it.next()) 14 console.log(it.next()) 15 console.log(it.next()) 转换后的代码如图 查看babel, regenerator 的实现

协程

僤鯓⒐⒋嵵緔 提交于 2019-12-02 07:02:22
协程:非抢占式,由代码控制切换,非操作系统强制控制切换 生成器: def f():   print("ok")   s=yield 6 用于保存并返回当前的执行状态。   print(s)   print("ok2")   yield gen=f() 函数中加上yield再执行函数,就变成了一个生成器对象,对于生成器,必须调用next()函数才能执行生成器里面的内容,单纯 f()不执行里面的内容,因为此时已经不是一个函数了,变成了生成器,必须调用next()函数 print(gent) ---> <generator object f at 0x000000000000....>,这里返回的是一个生成器的对象 res=next(gen) 这里是生成器对象开始执行,遇到yield就停止,返回yield的值,print(yield)-->返回yield后面的6 程序执行代码 next(gen) 运行结果就是 print("ok") next()方法让让生成器往下执行了一步,打印出了ok gen.send(5) #send()方法 ,也可以跟生成器进行交互 将5赋值给第一个yield, 此时print(s)----->打印的值是5 协程 (coroutine),又叫微线程:l0 def consumer(name):   print("------>ready to eat baozi"