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
原创粉丝点击