Shy*_*yam 6 ruby python lambda restriction
我正在浏览WikiVS的一些页面,我引用了:
因为Python中的lambdas仅限于表达式,不能包含语句
我想知道这个限制将是一个很好的例子(或更多),最好是与Ruby语言相比较.
感谢您的回答,评论和反馈!
Gle*_*ard 12
我不认为你真的在问lambdas,而是内联函数.
这真的是Python严重烦人的限制之一:你无法定义一个函数(一个真正的函数,而不仅仅是一个表达式)内联; 你必须给它一个名字.这是非常令人沮丧的,因为其他所有现代脚本语言都是这样做的,并且必须将函数移到线外非常痛苦.这也令人沮丧,因为我觉得Python字节码可以代表这一点 - 这只是语言语法不能.
使用Javascript:
responses = {
"resp1": {
"start": function() { ... },
"stop": function() { ... },
},
"resp2": {
"start": function() { ... },
"stop": function() { ... },
},
...
}
responses["resp1"]["start"]();
Run Code Online (Sandbox Code Playgroud)
LUA:
responses = {
resp1 = {
start = function() ... end;
end = function() ... end;
};
...
}
responses.resp1.start();
Run Code Online (Sandbox Code Playgroud)
红宝石:
responses = {
"resp1" => {
"start" => lambda { },
"stop" => lambda { },
},
}
responses["resp1"]["start"].call
Run Code Online (Sandbox Code Playgroud)
蟒蛇:
def resp1_start():
pass
def resp1_stop():
pass
responses = {
"resp1": {
"start": resp1_start,
"stop": resp1_stop,
},
}
responses["resp1"]["start"]()
Run Code Online (Sandbox Code Playgroud)
请注意,JavaScript和Lua没有lambdas:它们没有理由存在,因为内联函数以更加自然和通用的方式覆盖它们.
我可能会认为这是最令人烦恼的日常Python限制.
关于语句最常遇到的情况可能是Python 2.X的print声明.
例如,
say_hi = lambda name: "Hello " + name
Run Code Online (Sandbox Code Playgroud)
按预期工作.
但这不会编译:
say_hi = lambda name: print "Hello " + name
Run Code Online (Sandbox Code Playgroud)
因为print在Python 2中不是一个合适的函数.
>>> say_hi = lambda name: "Hello " + name
>>> say_hi("Mark")
'Hello Mark'
>>>
>>> say_hi = lambda name: print "Hello " + name
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
其余的语句print可以在线上的Python文档中找到:
Run Code Online (Sandbox Code Playgroud)simple_stmt ::= expression_stmt | assert_stmt | assignment_stmt | augmented_assignment_stmt | pass_stmt | del_stmt | print_stmt | return_stmt | yield_stmt | raise_stmt | break_stmt | continue_stmt | import_stmt | global_stmt | exec_stmt
如果你想看到它们失败,你可以在REPL中尝试其余的这些:
>> assert(True)
>>> assert_lambda = lambda: assert(True)
SyntaxError: invalid syntax
>>> pass
>>> pass_lambda = lambda: pass
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我不确定Python的lambda限制与Ruby proc或者之间有什么相似之处lambda.在Ruby中,所有内容都是一条消息,所以你没有关键字(好吧,你确实有关键字,但是你没有看起来像Python这样的函数的关键字print).在我的头脑中,没有容易错误的Ruby构造将失败proc.
| 归档时间: |
|
| 查看次数: |
2226 次 |
| 最近记录: |