python2.7语法极客Lambda在列表理解中的应用

2024-04-20 05:44:13 发布

您现在位置:Python中文网/ 问答频道 /正文

您能否构建一个与以下Python 2.7 grammar rules匹配的最小有效源代码示例?有没有可能不产生运行时错误?你知道吗

(1) atom:           '[' [listmaker] ']'
(2) listmaker:      test  list_for
(3) list_for:       'for' exprlist 'in' testlist_safe
(4) testlist_safe:  old_test
(5) old_test:       old_lambdef
(6) old_lambdef:    'lambda' [varargslist] ':' old_test

到目前为止,我能达到的最好结果是:

L = [ fn() for fn in (lambda: x for x in xrange(3)) ]

但我的解决方案的问题是围绕“lambda”的括号。你能建立一个没有括号的例子吗?如果不是,那么您如何解释为什么不能构建“in lambda”,即使它完全符合语法规则?你知道吗


Tags: lambdaintestfor源代码oldruleslist
1条回答
网友
1楼 · 发布于 2024-04-20 05:44:13
[x for x in lambda: 1]

这很简单。当然,这会在运行时产生一个TypeError,但是语法并不是为了排除会产生TypeError的构造而设计的。你知道吗

因为old_lambdef总是计算为函数对象,这是不可iterable的,所以在运行时没有异常是不可能做到的。在old_lambdef的结构中,没有任何地方可以插入一些东西使Python调用函数;Python将尝试迭代函数对象本身,而不是调用它并迭代返回值。你知道吗


testlist_safeold_test定义的完整形式如下

testlist_safe: old_test [(',' old_test)+ [',']]
old_test: or_test | old_lambdef

testlist_safe并不总是一个old_testold_test也不总是一个old_lambdef。允许testlist_safe成为old_test,允许old_test成为old_lambdef。一起做这些事情总是在运行时产生异常,但它们不会仅仅为了阻止人们一起做这些事情而使语法复杂化。你知道吗

相关问题 更多 >