码迷,mamicode.com
首页 > 编程语言 > 详细

13.Python?成器和?成器表达式

时间:2020-01-10 22:31:22      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:ext   去重   传递   send   美的   style   end   需求   集合   

?. ?成器

什么是?成器. ?成器实质就是迭代器.
在python中有三种?式来获取?成器:
1. 通过?成器函数
2. 通过各种推导式来实现?成器
3. 通过数据的转换也可以获取?成器
?先, 我们先看?个很简单的函数:
技术图片

将函数中的return换成yield就是?成器

技术图片

运?的结果和上?不?样. 为什么呢. 由于函数中存在了yield. 那么这个函数就是?个?成器

函数. 这个时候. 我们再执?这个函数的时候. 就不再是函数的执?了. ?是获取这个?成器.
如何使?呢? 想想迭代器. ?成器的本质是迭代器. 所以. 我们可以直接执?__next__()来执?
以下?成器.
技术图片

那么我们可以看到, yield和return的效果是?样的. 有什么区别呢? yield是分段来执??个

函数. return呢? 直接停?执?函数.
技术图片

 技术图片

当程序运?完最后?个yield. 那么后?继续进?__next__()程序会报错.

好了?成器说完了. ?成器有什么作?呢? 我们来看这样?个需求. 老男孩向JACK JONES订
购10000套学?服. JACK JONES就比较实在. 直接造出来10000套衣服. 
技术图片

 技术图片

但是呢, 问题来了. 老男孩现在没有这么多学?啊. ?次性给我这么多. 我往哪?放啊. 很尴尬

啊. 最好的效果是什么样呢? 我要1套. 你给我1套. ?共10000套. 是不是最完美的.  
技术图片

区别: 第?种是直接?次性全部拿出来. 会很占?内存. 第?种使??成器. ?次就?个. ?多

少?成多少. ?成器是?个?个的指向下?个. 不会回去, __next__()到哪, 指针就指到哪?.
下?次继续获取指针指向的值.
接下来我们来看send?法, send和__next__()?样都可以让?成器执?到下?个yield. 
技术图片

 技术图片

send和__next__()区别:

1. send和next()都是让?成器向下走?次
2. send可以给上?个yield的位置传递值, 不能给最后?个yield发送值. 在第?次执??
成器代码的时候不能使?send()
?成器可以使?for循环来循环获取内部的元素:
技术图片

?. 列表推导式, ?成器表达式以及其他推导式

?先我们先看?下这样的代码, 给出?个列表, 通过循环, 向列表中添加1-13 : 
技术图片

替换成列表推导式: 

技术图片

列表推导式是通过??来构建你要的列表, 列表推导式看起来代码简单. 但是出现错误之

后很难排查.
列表推导式的常?写法:
[ 结果 for 变量 in 可迭代对象]
例. 从python1期到python14期写入列表lst:
技术图片

我们还可以对列表中的数据进?筛选

筛选模式:
[ 结果 for 变量 in 可迭代对象 if 条件 ]
技术图片

?成器表达式和列表推导式的语法基本上是?样的. 只是把[]替换成()

技术图片

打印的结果就是?个?成器. 我们可以使?for循环来循环这个?成器:

技术图片

?成器表达式也可以进?筛选:

技术图片

 技术图片

?成器表达式和列表推导式的区别:

1. 列表推导式比较耗内存. ?次性加载. ?成器表达式?乎不占?内存. 使?的时候才分
配和使?内存
2. 得到的值不?样. 列表推导式得到的是?个列表. ?成器表达式获取的是?个?成器.
举个栗?.
同样?篮?鸡蛋. 列表推导式: 直接拿到?篮?鸡蛋. ?成器表达式: 拿到?个老?鸡. 需要
鸡蛋就给你下鸡蛋.
?成器的惰性机制: ?成器只有在访问的时候才取值. 说?了. 你找他要他才给你值. 不找他
要. 他是不会执?的.  
技术图片

深坑==> ?成器. 要值得时候才拿值.

字典推导式:
根据名字应该也能猜到. 推到出来的是字典
技术图片

集合推导式:

集合推导式可以帮我们直接?成?个集合. 集合的特点: ?序, 不重复. 所以集合推导式?
带去重功能
技术图片

总结: 推导式有, 列表推导式, 字典推导式, 集合推导式, 没有元组推导式

?成器表达式: (结果 for 变量 in 可迭代对象 if 条件筛选)
?成器表达式可以直接获取到?成器对象. ?成器对象可以直接进?for循环. ?成器具有
惰性机制.
?个?试题. 难度系数500000000颗星:
技术图片

友情提?: 惰性机制, 不到最后不会拿值

这个题要先读?下. 然后??分析出结果. 最后?机器跑?下. 

13.Python?成器和?成器表达式

标签:ext   去重   传递   send   美的   style   end   需求   集合   

原文地址:https://www.cnblogs.com/xuweng/p/12178226.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!