Python 2.7 语法极客 - 列表推导式中的 Lambda

标签 python python-2.7 lambda list-comprehension grammar

您能否构建一个与以下内容匹配的最小有效源代码示例 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”,即使它完全符合语法规则?

最佳答案

[x for x in lambda: 1]

这非常简单。当然,这会在运行时产生 TypeError,但语法的设计目的并不是排除会产生 TypeError 的结构。

没有办法在运行时不发生异常,因为 old_lambdef 始终计算为函数对象,而该函数对象是不可迭代的。在 old_lambdef 的结构中没有任何地方可以插入一些东西来让 Python 调用该函数; Python 将尝试迭代函数对象本身,而不是调用它并迭代返回值。


teSTList_safeold_test 定义的完整形式为

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

teSTList_safe 并不总是单个 old_test,并且 old_test 并不总是 old_lambdef。允许 teSTList_safeold_test,并且允许 old_testold_lambdef。一起做这些事情总是会在运行时产生异常,但它们不会仅仅为了阻止人们一起做这些事情而使语法复杂化。

关于Python 2.7 语法极客 - 列表推导式中的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43903056/

相关文章:

python - 将图像(png)转换为矩阵,对其进行归一化,反之亦然

Python从.py文件中提取多行注释

python - 如何为Python安装Flask-mysqldb?

Python DataNitro - "CellRange set to object of wrong length"

c++ - lambda 应该衰减到模板代码中的函数指针吗?

python - 如何使用数据框作为 map 来更改另一个数据框中的值

python - 循环中奇怪的 lambda 行为

Python if-elif-else 运行时优化

lambda - Lambda 与 Receiver 的目的是什么?

node.js - 在来自 AWS lambda Node JS 的 http 响应 header 中设置 Cookie