gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:42:15 25 4
gpt4 key购买 nike

你能构建一个与以下 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”周围的括号。你能建立一个没有括号的例子吗?如果不是,那么您将如何解释为什么您不能“在 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_testold_test 也不总是 old_lambdefteSTList_safe 可以是 old_testold_test 可以是 old_lambdef。一起做这些事情总是会在运行时产生异常,但它们不会为了阻止人们一起做这些事情而使语法复杂化。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com