加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Python要害字yield-大牛必需把握的高端语法

发布时间:2019-08-29 15:10:32 所属栏目:建站 来源:佐佑课堂
导读:小白:大牛哥,适才看到有一个函数不行使return返回功效,而是行使yield要害字返回功效,看不太大白,Python中yield要害字的用途是什么,它有什么浸染呀? 大牛: 要想领略yield的浸染,你必需相识什么是天生器(generators),相识天生器之前(generators)你必要

小白:大牛哥,适才看到有一个函数不行使return返回功效,而是行使yield要害字返回功效,看不太大白,Python中yield要害字的用途是什么,它有什么浸染呀?

Python要害字yield-大牛必需把握的高端语法

大牛: 要想领略yield的浸染,你必需相识什么是天生器(generators),相识天生器之前(generators)你必要先去相识什么是可迭代工具(iterables)。

大牛:小白啊,本日你大牛哥我恰恰有空,给你说道说道这个yield的浸染。让你开开眼界,看看我大牛都是怎么写出牛逼代码的。

小白:好呀好呀!!!

大牛:我们先来看看什么是可迭代工具(iterables)。

当你建设了一个列表,你可以遍历这个列表读取它的每一个元素,逐个读取列表元素的进程称为迭代(iteration)。

Python要害字yield-大牛必需把握的高端语法

上面代码中 mylist 就是可迭代工具(iterables),行使列表推导式天生的工具也是可迭代工具

Python要害字yield-大牛必需把握的高端语法

向这种可以行使for ... in .. 语法去迭代的工具都是可迭代工具。

大牛:小白,大白什么是可迭代工具了吗?你来说一说Python内里有那些常见的可迭代工具。

小白:大白了。可以行使for...in...获取内里元素的工具就是可迭代工具,像字典,列表,元组,字符串都是可迭代工具。大牛哥我说的没错吧!

大牛:给你32个赞!!不错,一点就通。知道什么是可迭代工具后继承来看天生器(generators)。

天生器是迭代器(iterators),可是只能迭代一次,天生器不会将全部值存储在内存中,而是及时的天生这些值:

Python要害字yield-大牛必需把握的高端语法

将列推导式的 [] 改成了 () 其他并没有做任何改变,可是mygenerators已经不是列表,而是天生器。天生器迭代一次之后就不能再次迭代。计较出0,然后并不生涯功效和状态继承计较出1,最后计较出4,逐平天生。

这只是建设天生器的一种方法,其它一种方法就是我们本日的主角yield要害字。

Python要害字yield-大牛必需把握的高端语法

yield 是一个相同 return 的要害字。当我们挪用这个函数的时辰并不是返回计较的功效,而是返回一个天生器。只有迭代这个天生器的时辰才管帐算功效。

for i in mygenerator:第一次轮回的时辰函数执行到yield要害字位置,返回 i*i的值,然后将函数挂起(生涯函数执行的状态)。for i in mygenerator:第二次轮回的继承执行适才的函数(挂起的位置),也就是执行天生器内里的for轮回,返回i*i的值,然后再次将函数挂起。直到天生器里没有值可以返回就竣事。

yield 可以返回值,可是不会竣事函数的执行,假如函数后头尚有代码,同样是可以执行的。

Python要害字yield-大牛必需把握的高端语法

上面的函数着实没有什么浸染,只是用来演示天生器用法。天生器在那些处所会用到呢?

好比必要建设一个很是大的列表直接行使列表推导式也许会导致内存被耗尽,这代码是建设不了列表,电脑内存不敷以生涯这个列表。

Python要害字yield-大牛必需把握的高端语法

可是用天生器可以建设乐成,必要行使的时辰再从天生器中取出。

Python要害字yield-大牛必需把握的高端语法

比拟下面这两段代码:求1-10的偶数

大部门人的写法是这样的

Python要害字yield-大牛必需把握的高端语法

大牛的写法是这样子的

Python要害字yield-大牛必需把握的高端语法

同样的成果,可是用天生器要轻盈许多。

yield 的甜头:

1.不会将全部数据取出来存入内存中;而是返回了一个工具;可以通过工具获取数据;用几多取几多,可以节减内存空间。

2.除了能返回一个值,还不会终止轮回的运行

大牛:咳咳!一口吻讲了这么多,差点就要把大牛我累挂了。小白同窗,听大白了吗?

小白:哦,原本yield是这么个用法。感谢大牛哥!经大牛哥这么一说,我发明早年我写的代码许多都可以用yield写成天生器啊!就拿你上面求偶数例子吧,回收yield的写法服从是否比平凡写法高呢?

大牛:服从必定较量高的,看下面的比拟

def test(): for i in range(1, 11000000): if i % 2 == 0: yield idef test1(): result = [] for i in range(1, 11000000): if i % 2 == 0: result.append(i) return result

0.8925411701202393 # 天生器写法耗时

1.1444191932678223 # 平凡写法耗时

小白:哇!老板就常常嫌弃我写的代码执行服从低,每次我都是拿Python自己执行服从就较量低的来由去敷衍老板,原本还可以在这些细节上做优化的。

小白:听大牛哥一席话,胜读一本Python焦点编程。老板叫我归去改BUG了 emememem。

大牛:坐看庭前花着花落,笑看天际云卷云舒。泡一杯咖啡,坐等放工。

产物司理:大牛,你写的代码又出BUG了,还不赶忙返来看看。你是不想放工了吧!

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读