在Python中是否有类似于“void lambda”的东西?

5

即没有输入参数且不返回任何内容的lambda表达式。

我在思考如何在Python中模仿switch语句的巧妙方法。以下是我尝试过但失败了的方法:

statement = {
    "Bob": lambda: print "Looking good, Bob!",
    "Jane": lambda: print "Greetings, Jane!",
    "Derek": lambda: print "How goes it, Derek?"
}[person]()

https://dev59.com/nHVD5IYBdhLWcg3wL4cA - Pavel
所有的lambda函数都会返回一些东西,默认值是None。可以忽略返回值。您遇到的问题是尝试在只能使用表达式的地方使用语句。 - Martijn Pieters
2个回答

8
一个lambda函数的内容必须是单个表达式,不允许使用语句。此外,在Python 2.x中,print 是一个语句。这意味着你不能在lambda内使用它。
如果你想使用Python 3.x的print函数,可以像这样从__future__导入:
# Add this line to the top of your script file
from __future__ import print_function

现在,由于print是一个函数,所以它可以在lambda中使用:
statement = {
    "Bob": lambda: print("Looking good, Bob!"),
    "Jane": lambda: print("Greetings, Jane!"),
    "Derek": lambda: print("How goes it, Derek?")
}[person]()

谢谢澄清,但您可能需要在那里添加逗号。 - Coffee Maker

1

针对这种情况,你最好做:

print {
    "Bob": "Looking good, Bob!",
    "Jane": "Greetings, Jane!",
    "Derek": "How goes it, Derek?"
}[person]

或者

statement = {
    "Bob": "Looking good, Bob!",
    "Jane": "Greetings, Jane!",
    "Derek": "How goes it, Derek?"
}[person]
print statement

对于更复杂的类似 switch 的应用程序,当然可以使用 dict 来保存函数引用。

我也喜欢将函数名组合成字符串:

class Greeter(object):
    ... 
    def _greet_Bob(self): ...
    def _greet_Jane(self): ...
    def _greet_Derek(self): ...

    def greet(self,person):
        getattr( self, "_greet_"+person )()  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接