python的一些高级特性记录小结,主要就是列表生成是和生成器的使用姿势
1. 列表生成式
如何快速的生成一个1,20的列表?
1 | >>> list(range(1,20)) |
如何生成 [1*1,2*2,...]
格式的列表?
1 | >>> [ x*x for x in range(1,10)] |
针对上面的列表再做一个小的限制,排除掉5*5这个,如何处理?
1 | >>> list(x * x for x in range(1,10) if x!=5) |
简单来看下这个列表生成式规则,其实和jdk8中的lambda比较类似
1 | 元素的操作 for x in 列表 条件过滤 |
进阶版
多个列表式合在一起,组成多维数组遍历的效果
1 | >>> list(x * y for x in range(1, 5) for y in range(2, 6)) |
上面的结果等同于
1 | >>> ans=[] |
字典的遍历方式
1 | >>> d |
2. 生成器
这是个比较有意思的东西,之前没有接触过,相比较于函数而言,主要特点如下
- 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
- 而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
基本定义
形如生成式的使用方式,将中括号改成圆括号即可
1 | >>> f=(x*x for x in range(1, 3)) |
yield定义方式
对于无法写成列表生成式的,可以通过yield来实现,如著名的斐波拉契数列
1 | ## 定义斐波拉契数列生成的函数,注意下面的yield语句 |
使用姿势
使用生成器,常见的除了for循环使用之外,另一个就是如迭代器的使用姿势next(f);上面已经分别给出了使用的demo,注意下区别
- 针对next使用时,最后一个时,会抛出一个异常
StopIteration
- 针对for循环使用时,无法获取函数的最终return结果
针对需要返回结果的case,下面给出while循环结合next的使用姿势进行演示如何处理
1 | >>> f=fib(6) |
小结
对于生成器而言,特别是yield方式,可以简单理解为每次在执行到yield的时候,直接退出函数的继续执行,并返回当前的结果;
当继续调用next时,从yield后面的代码继续执行,函数内所有的变量值都是上次的内容
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840
3. 扫描关注
一灰灰blog
知识星球