Python开关盒

Python开关盒,python,switch-statement,Python,Switch Statement,我试图在python上使用dictionary作为开关大小写,但是,参数似乎没有传递给被调用的函数,请帮助: def switchcase(num,cc): def fa(num): out= num*1.1; def fb(num): out= num*2.2; def fc(num): out= num*3.3; def fd(num): out= num*4.4; options = {

我试图在python上使用dictionary作为开关大小写,但是,参数似乎没有传递给被调用的函数,请帮助:

def switchcase(num,cc):
    def fa(num):
        out= num*1.1;
    def fb(num):
        out= num*2.2;
    def fc(num):
        out= num*3.3;
    def fd(num):
        out= num*4.4;
    options = {
        "a":fa(num),
        "b":fb(num),
        "c":fc(num),
        "d":fd(num)
        } 
    out=0
    options[cc];
    return out
print switchcase(10,"a")
输出为0,我无法找出问题所在

问题是:

out=0
options[cc];
return out
基本上——不管
选项[cc]
给你什么,你都会返回
0
,因为这是
out
的值。请注意,在各种
fa
fb
。。。函数不会更改调用者中
out
的值

您可能想要:

def switchcase(num,cc):
    def fa(num):
        return num*1.1;
    def fb(num):
        return num*2.2;
    def fc(num):
        return num*3.3;
    def fd(num):
        return num*4.4;
    options = {
        "a":fa(num),
        "b":fb(num),
        "c":fc(num),
        "d":fd(num)
        } 
    return options[cc];
还要注意的是,这在实践中会非常低效。每次调用
switchcase
时,您将创建4个函数(并分别调用)

我猜您实际上想要创建一个预先制作好的函数映射。然后,您可以从映射中选择实际需要的函数,并使用给定的号码调用它:

def fa(num):
    return num*1.1

def fb(num):
    return num*2.2

def fc(num):
    return num*3.3

def fd(num):
    return num*4.4

OPTIONS = {
    "a":fa,
    "b":fb,
    "c":fc,
    "d":fd
} 

def switchcase(num,cc):
    return OPTIONS[cc](num)

这里有另一个选择。您可以导航到切换器外部的必要方法,如果需要,还可以传递可选参数:

def fa(num):
    return num*1.1
def fb(num):
    return num*2.2
def fc(num):
    return num*3.3
def fd(num, option=1):
    return num*4.4*option
def f_default(num):
    return num

def switchcase(cc):
    return {
        "a":fa,
        "b":fb,
        "c":fc,
        "d":fd,
    }.get(cc, f_default)

print switchcase("a")(10)  # for Python 3 --> print(switchcase("a")(10))
print switchcase("d")(10, 3)  # for Python 3 --> print(switchcase("d")(10, 3))
打印(开关箱(“a”)(10))

11.0

打印(开关盒(“d”)(10,3))

132.0

打印(开关箱(“ddd”)(10))

十,


另一个较短的版本是:

def开关箱(num,cc):
返回{
“a”:lambda:num*1.1,
“b”:lambda:num*2.2,
“c”:lambda:num*3.3,
“d”:lambda:num*4.4,
}.get(cc,lambda:None)()
打印(开关盒(10,“a”))

您没有从子函数返回任何内容。参数
cc
实际上被传递到
switchcase
函数,但您在哪里使用它?作为一种风格注释(因为有一天可能会有人指出它),大多数python程序员不喜欢用分号终止行。我想补充一点,既然
switchcase(num,cc)
只做
options[cc](num)
,那么可能根本不值得使用该函数。@StefanPochmann——这是合理的。但可能会添加其他功能。。。e、 g.如果
cc
不在
options
中,该怎么办?Delicious:单独的函数在switchcase中参数化,因此除非需要,否则不会对其进行评估。