Python关键字yield——大牛必须掌握的高端语法yield关键字的用途是什么,作用是什么?Daniel:要理解yield的作用,就必须理解什么是generators。在了解生成器之前,您需要了解什么是可能的可迭代对象。大牛:小白,今天刚好有空,给你说说这个yield的作用。让你大开眼界,看看我家大牛是如何写出牛逼代码的。小白:好的好的!!!Daniel:让我们来看看什么是可迭代对象。创建列表时,可以遍历列表以读取其中的每个元素。一个一个读取列表元素的过程称为迭代。在上面的代码中,mylist是一个可迭代对象(iterables)。使用列表派生生成的对象也是可迭代对象。可以使用for...in..语法迭代的对象都是可迭代对象。大牛:小白,你明白什么是可迭代对象吗?说说Python中常见的可迭代对象。小白:明白。可以用for...in...获取里面元素的对象都是可迭代对象,比如字典、列表、元组、字符串都是可迭代对象。丹尼尔弟兄,我是对的!丹尼尔:给你32个赞!!没错,没关系。在知道什么是可迭代对象之后,让我们继续讨论生成器。生成器是一个迭代器(iterators),但它只能迭代一次。生成器不会将所有的值存储在内存中,而是实时生成这些值:将列推导的[]更改为(),其他不做任何更改,但mygenerators不再一个列表,而是一个生成器。一旦生成器迭代了一次,就不能再迭代了。计算0,然后继续计算1,不保存结果和状态,最后计算4,一一生成。这只是创建生成器的一种方式,另外一种方式就是我们今天的主角yield关键字。yield是一个类似于return的关键字。当我们调用这个函数时,它不返回计算结果,而是返回一个生成器。结果仅在迭代生成器时计算。foriinmygenerator:第一个循环,函数执行到yield关键字的位置,返回i*i的值,然后暂停函数(保存函数执行状态)。foriinmygenerator:第二个循环继续执行之前的函数(挂起的位置),即执行generator中的for循环,返回i*i的值,然后再次挂起该函数。结束,直到没有更多的值可以从生成器返回。yield可以返回一个值,但不会结束函数的执行。如果函数后面有代码,也可以执行。上面的函数实际上并没有做任何事情,只是用来演示生成器的用法。发电机将用在什么地方?比如需要创建一个非常大的列表,直接使用列表推导可能会导致内存耗尽。此代码无法创建列表,计算机内存不足以保存列表。但是可以用generator创建成功,需要用的时候可以从generator中取出来。对比下面两段代码:求1-10的偶数,一般人是这样写的,大牛是这样写的。它具有相同的功能,但使用生成器要容易得多。yield的好处:1.不会把所有的数据都取出来存入内存;相反,它将返回一个对象;可以通过对象获取数据;您可以通过尽可能多地节省内存空间。2.除了能够返回一个值外,它不会终止循环的运行。丹尼尔:咳咳!一口气说了这么多,差点累死。小白,你明白吗?小白:哦,原来yield是这么用的。谢谢大牛!经过大牛说的,我发现我之前写的很多代码都可以写成带yield的生成器!以上面找到偶数为例。使用yield的效率是不是比普通写法高??大牛:效率肯定更高,看下面的对比deftest():foriinrange(1,11000000):ifi%2==0:yieldideftest1():result=[]foriinrange(1,11000000):ifi%2==0:result.append(i)returnresult0.8925411701202393#生成器写入耗时1.1444191932678223#普通写入耗时小白:哇!老板经常嫌弃我写的代码执行效率低。每次都拿Python本身执行效率比较低的理由搪塞老板,结果发现这些细节是可以优化的。小白:听大牛的话,胜过看一本Python核心编程的书。老大让我回去修BUGemememem。丹尼尔:坐看庭前花开花落,笑看天上云卷云舒。泡杯咖啡,坐下来下班。产品经理:大牛,你写的代码又出bug了,要不你回来看看。你不想去下班!
