python 生成器和lambda的故事
来源:互联网 发布:安卓手机仿windows桌面 编辑:程序博客网 时间:2024/05/01 13:08
今天在思考python表推导的语法的时候,很好奇这样的结果:
a = [ x for x in [1, 2, 3] ]b = ( x for x in [1, 2, 3] )print('a type: {}'.format(type(a)))print('b type: {}'.format(type(b)))输出:
a type: <type 'list'>b type: <type 'generator'>感觉[和]两个符号表示列表,那么(和)应该表示元组啊。
不过没有继续深究下去,因为我估计要看python源码,稍后抽个时间看看
既然b是一个生成器,那么x 应该就是默认的yield x,只不过在表推导的形式里没有写上yield罢了。
那么改变一下x,换成一个lambda吧
b = ( lambda y : x + y for x in [1, 2, 3] )print('b type: {}'.format(type(b)))print(b.next()(1))print(b.next()(1))print(b.next()(1))这样,每一次都是yield 一个匿名函数,且其函数体中的x为列表[1, 2, 3]中对应的值
输出:
b type: <type 'generator'>234也就理所当然了。b.next()返回匿名函数,在后面添加上()就表示调用这个函数,里面的1对应y的值
那么匿名函数的参数也是x呢?
b = ( lambda x : x + x for x in [1, 2, 3] )print('b type: {}'.format(type(b)))print(b.next()(1))print(b.next()(1))print(b.next()(1))输出:
b type: <type 'generator'>222看不太明白,再来一个例子:
b = ( lambda x : x + x for x in [1, 2, 3] )print('b type: {}'.format(type(b)))print(b.next()(9))print(b.next()(9))print(b.next()(9))输出:
b type: <type 'generator'>181818原来是匿名函数的参数x覆盖了表推导的参数x,即表推导中:for x in [1, 2, 3]在前面的语句:lambda x : x + x看不见了,无法访问了
当然了,由于b是生成器,当第四次调用的时候,会抛出StopIteration异常,若想再用,得重新初始化一下了。
0 0
- python 生成器和lambda的故事
- Python的迭代器和生成器
- Python的迭代器和生成器
- Python的迭代器和生成器
- Python的生成器和迭代器
- Python的迭代器和生成器
- python的迭代器和生成器
- python推导式,匿名函数lambda,生成器
- 强大的Python 迭代器和简单生成器
- 规范化的Python编程-迭代器和生成器
- python 迭代器和生成器的区别
- python 生成器和迭代器的区别
- Python中生成器和迭代器的区别
- Python生成器generator的send和next
- Python 可迭代的对象、迭代器和生成器
- Python 可迭代的对象、迭代器和生成器
- 小论python的迭代器和生成器
- Python的迭代和生成器
- MySQL分区表的局限和限制
- 后台截取字符串的长度
- chmod的使用以及文件的命名
- 数据库应用优化(1)
- 《一本书读懂TCP/IP》读后感——第四章TCP/IP网络机构
- python 生成器和lambda的故事
- linux下的压缩与解压命令以及磁盘加载
- 二分法查询(某个网站的面试题)
- Spark分类模型--来源Spark机器学习
- 数据库应用优化(2)
- CppPrimer--顶层const与底层const
- linux网络编程之用select函数实现io复用(基于TCP)引发的思考
- PyCharm 使用 tricks
- python AES对称加密示例