首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python2.7清单理解中的语法Geek - Lambda

Python2.7清单理解中的语法Geek - Lambda
EN

Stack Overflow用户
提问于 2017-05-10 21:30:23
回答 1查看 104关注 0票数 2

您能否构建一个与以下Python2.7语法规则相匹配的最小有效源代码示例?在不产生运行时错误的情况下有可能吗?

代码语言:javascript
复制
(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

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

代码语言:javascript
复制
L = [ fn() for fn in (lambda: x for x in xrange(3)) ]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-10 21:36:06

代码语言:javascript
复制
[x for x in lambda: 1]

很简单。当然,这将在运行时生成一个TypeError,但是语法并不是为了排除将生成TypeErrors的构造。

没有办法在运行时无异常地这样做,因为old_lambdef总是计算为一个函数对象,它是不可迭代的。在old_lambdef的结构中,没有任何地方可以插入使Python调用函数的内容;Python将尝试迭代函数对象本身,而不是调用它并迭代返回值。

testlist_safeold_test定义的完整形式如下

代码语言:javascript
复制
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。在运行时,在一起做这些事情总是会产生异常,但是它们不会仅仅为了阻止人们在一起做那些事情而使语法复杂化。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43903056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档