当前位置 : 主页 > 网络编程 > 其它编程 >

pythonyield用法_python中yield的用法

来源:互联网 收集:自由互联 发布时间:2023-07-02
昨天看了许多条博客同时问了大佬一些心中的疑惑对这个yield心中有了些许的理解虽然可能没有理解到他的内涵但至少在使用 昨天看了许多条博客同时问了大佬一些心中的疑惑对这个y
昨天看了许多条博客同时问了大佬一些心中的疑惑对这个yield心中有了些许的理解虽然可能没有理解到他的内涵但至少在使用

昨天看了许多条博客同时问了大佬一些心中的疑惑对这个yield心中有了些许的理解虽然可能没有理解到他的内涵但至少在使用时该如何使用还是有了些许了解因此决定写出来分享

首先我们得了解一个东西叫迭代器通常的for…in…循环中in后面是一个数组这个数组就是一个可迭代对象类似的还有链表字符串文件。它可以是mylist [1, 2, 3]也可以是mylist [x*x for x in range(3)]。 它的缺陷是所有数据都在内存中如果有海量数据的话将会非常耗内存。他们可以从内容从中一个一个的读取这就是迭代。

接着我们需要了解迭代器里的一个特殊——生成器生成器也是一个可以迭代的对象但是生成器每个只能迭代一次至于为什么后面会讲这是他特殊的原因。因为用的时候才生成。比如 mygenerator (x*x for x in range(3))注意这里用到了()它就不是数组而上面的例子是[]。生成器这里用的是小括号而迭代器用的是中括号。

好了接下来得讲下他们的方法不管是生成器还是迭代器都可以使用他的方法就是next这个方法在python2里面是使用的时候是方法c.next()在python3里面变为了函数next(c)但是由于迭代器可以自动进行相当于里面已经内嵌了这个方法生成一个迭代器他可以自动往后迭代但是生成器不一样生成一个生成器的时候他是定在初始状态的这就需要我们的next来一步一步推动他们。他们还有一种方法是send()这个相当于在next功能的基础上再加了一个传递的功能他可以传递参数给yield表达式所以send(None)就相当于next参数。

现在我们可以来谈谈yield了其实yield就相当于一个return只是return返回的是值但是yield返回的是生成器除了这点其他都一样所以return也好yield也好都只能用在函数中不要出现这种代码了

for i in range(5):return i

所以要试验yield要在函数里实验我们可以试着构造一个生成器

defy_test(x):for i inrange(x):yieldiprint(i)

y_test(3)

我们试着输出结果却发现没有输出这是因为生成了一个生成器而且生成的生成器是在初始状态咱们还没给他下指令他就不会开始生成所以现在我们给他一个指令

defy_test(x):for i inrange(x):yieldiprint(i)

y_test(3)

c y_test(3)

next(c)

诶我们现在改造了后为什么还是显示没有输出现在生成器是生成了但别忘了这是一个相当于return的函数他实际上已经把值传进了内存但是没有显示出来我们可以用一个print把他显示出来

defy_test(x):for i inrange(x):yieldiprint(i)

y_test(3)

c y_test(3)print(next(c))

现在我们就会看到它显示出来了range这个函数生成了从1到n-1得数比如range(5)生成了0.1.2.3.4

1465611-20180827214050963-1449612843.png

好那么接下来你可能又会有问题了为什么这个只生成了第一个数啊不应该是遍历把所有的输出来吗这就是yield的作用了这是因为生成了生成器我们next他一次他也就只会往前走一次第二次就不走了那我们就再来一次next看看会怎样

defy_test(x):for i inrange(x):yieldiprint(i)

y_test(3)

c y_test(3)print(next(c))print(next(c))

1465611-20180827225546775-1768215777.png

这时候出现了三个值这就要继续解释yield的原因了每次我们使用一次next他都会执行到第一个yield结束的位置第二次用next推动他执行时他就会从上一个yield执行完成的位置开始执行到下一个yield执行完成在这里是在for循环里下一个yield就是第二个循环里的yield虽然是一样的语句但是他们所在的循环次数不一样所以yield就相当于返回值的同时记住当前运行到的位置下一次运行就从上一次运行到的位置开始运行这也是为什么他只能遍历一遍的原因因为在第二个next执行的时候第一个next里的内容已经被抛掉了内存里只有第二个yield执行的内容。

我们可以再看一例子来加深理解

deff(x):for i inrange(x):yieldiprint(i)yield i1c f(5)print(next(c))print(next(c))print(next(c))

根据上文的理解会输出四个值

1465611-20180827232627635-1012439669.png

符合前面的猜想最后让我们来用一个斐波那契数列的例子来结束全文吧

deffib(x):yield 1a,b 1,1

whilex:

a,b b,abyielda

xx-1

for i in fib(5):print(i)>>>runfile(F:/Python/exercise/pygame/yield_text.py, wdirF:/Python/exercise/pygame)1

1

2

3

5

8

上一篇:操作系统,进程理论
下一篇:没有了
网友评论