另一个带函数的switch case
在深入了解有趣的Python语言时,发现这个语言里没有像其他语言那样的“switch”结构。所以,学习Python的第一本书里提到,使用字典是一个不错的选择。于是我尝试了类似的代码:
cases = { 2 : readt3(e,t,off, partElems, partsNodes), # to read the triangular elements
3 : readq4(e,t,off, partElems, partsNodes), # to read the quadrangular elements
5 : readh8(e,t,off, partElems, partsNodes), # to read the hexa elements
}
# define functions
def readt3( e, t, off, partElems, partsNodes, partPnt ):
partsElems[partPnt].append(e)
nods = t[offset: offset+3];
for n in nods:
partsNodes[partPnt].append(n)
return
结果出现了“readt3未定义”的错误。我想这可能是因为在使用这个变量之前没有定义它,于是我把函数的定义提前到case之前,但问题依旧,这次出现了“e未定义”的错误。我搞不懂,e是一个函数的参数,为什么会出现和定义相关的错误呢?
在这种情况下,模拟switch-case时,函数的定义应该放在哪里呢?
4 个回答
字典并不是用来作为一种结构的工具。它的作用不是用来存储结构,而是用来存放真实的数据。在你的情况下,我觉得定义一个对象会更好。可以考虑在这种情况下使用面向对象编程(OO)。
其实,有时候用字典来处理调用是可行的,前提是你知道自己在做什么,并且在某些情况下这样做是有意义的。
在Python中,替代其他语言中的"switch...case
"的语法是"if..elif..else
"。
我不明白为什么大家不直接使用它。有人可能会觉得这样会“影响性能”之类的。但其实,switch case想想就是if-else链的一种非常特殊的情况:它只允许进行相等比较,而且通常只比较整数(至少在C语言中是这样,我不确定所有模仿C语法的语言都是这样)。而在if-elif链中,你可以使用任何表达式。
可以看出,switch case语句之所以在C语言中出现,是因为它让编译器能够为这种特殊情况自动优化(使用跳转表,而不是一系列的比较)。不过,这种优化只对编译型语言有意义,而且只有在编译器无法单独处理这些优化时才有意义,甚至在这种情况下,只有当10次或20次比较的速度差异大到足以超过使用跳转表时才有意义。
正如你所看到的,在现代高级语言中,拥有“switch case”是相当多余的,因为我们可以使用if-elif-else语句链。
当你在做类似这样的事情时:
...
2 : readt3(e,t,off, partElems, partsNodes)
...
实际上,你是在用参数 e,t,off, partElems, partsNodes
调用函数 readt3
。我觉得你想做的事情是像这样(模拟 switch case 语句):
def readt3( e, t, off, partElems, partsNodes, partPnt ):
partsElems[partPnt].append(e)
nods = t[offset: offset+3];
for n in nods:
partsNodes[partPnt].append(n)
return
# And of course all your function definition should be here before the cases dict.
cases = { 2 : readt3, # to read the triangular elements
3 : readq4, # to read the quadrangular elements
5 : readh8, # to read the hexa elements
}
现在你可以根据一个 case
参数来调用你的不同情况,像这样:
case = 2
cases[case](e,t,off, partElems, partsNodes)