P014_01_python生成器进阶及生成器表达式、列表推导式
生成器回顾
双下方法 : 很少直接调用的方法。一般情况下,是通过其他语法触发的
next()
1 | #娃哈哈%i |
send()
1 | def generator(): |
send和 next的区别
- 相同点:都可以让生成器向下走一步
- 异同点: send 可以给一个值,这个值作为上一个 yield 的整体的结果返回
使用send的注意事项:
- 第一次使用生成器的时候,必须要用next获取下一个值(因为send是给上一个yield 设置结果,而第一次的时候没有上一个yield)
- 最后一个yield不能接受外部的值(因为后面没有 yield 了)
为啥第一次不能用send()
因为会报错!!!详情请看 为什么python的yield第一次不能用send发送数据?
经典练习
求移动平均值
1 | ''' |
移动平均值优化
需求就是不要第一次调用next(),因为对使用者没有意义
提示:装饰器
1 | def init(func): |
这个效果就是 预激活装饰器
python3新增知识点
先看如下例子:把a,b里面的字符一个一个的返回
1 | def xxx(): |
添加 yield from
1 | def xxx(): |
yield from 的作用就是:
从一个容器类型里取得值不需要一个一个取而是集体返回
各种表达式推到式
列表推到式
10个鸡蛋的列表
1 | ''' |
生成器表达式
1 | g = ( i for i in range(10) ) |
列表推导式和生成器表达式的区别
- 括号不一样
- 返回值不同,生成器表达式几乎不占用内存
一道面试题
1 | g = ( i for i in range(10) ) |
各种推导式
公式
1 | [每一个元素 for 元素 in 可迭代数据类型] |
30以内被3整除的数
1 | [i for i in range(30) if i%3 == 0] |
30以内被3整除的数的平方
1 | [i*i for i in range(30) if i%3 == 0] |
找到多重嵌套列表内名字包含e字母 超过两个的
1 | names = [ |
字典推导式
将一个字典的key和value颠倒
1 | xx = {'a':10,'b':22} |
集合推导式
计算列表中每个值的平方,在带去重功能
1 | squared = {x**2 for x in [1, -1, 2]} |
面试题详解
面试题1
1 | def demo(): |
面试题2
1 | def add(n,i): |