深入研究有趣的python语言,因此语言中没有作为构造的转换。所以使用词典是阅读学习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未定义”,我认为我得到了这个,因为它没有在案例之前定义然后将函数定义移到上面的情况但仍然是相同的问题但是这次“e未定义”我可以不明白这一点,所以e是一个函数参数,为什么我在e上得到一个与定义相关的错误?
在这种情况下,在模拟switch-case时应该在哪里放置函数定义?
答案 0 :(得分:9)
当你做这样的事情时:
...
2 : readt3(e,t,off, partElems, partsNodes)
...
实际上你正在使用参数readt3
评估(调用)函数e,t,off, partElems, partsNodes
我认为你想要做的是这样的事情(模仿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)
答案 1 :(得分:2)
实际上,使用字典来发送呼叫是有时可以做的事情,有意义的事情,以及当你知道自己在做什么时。
在其他语言中用来代替“switch...case
”的Python语法构造是“if..elif..else
”。
我不知道为什么人们根本不去追求它。这就像一个人将“失去表现”或其他什么。但是......人们认为,这是一个非常狭窄的if - else链的特殊情况:它只是允许比较平等,而只是比较整数(至少在C中,我不知道每一个语言在那里克隆C语法),而在if-elif链中,可以使用任何表达式。
很容易理解Switch case语句刚刚在C中引入,因为它允许编译器自动优化这种特殊情况(使用跳转表而不是一系列比较)。但是......只对编译语言有意义,然后,只有当编译器无法单独处理这些优化时才有意义,即使这样,只有10或20比较的速度差异才是有意义的比使用跳转表更重要。
正如您所看到的,在现代高级语言中使用“切换案例”是非常多余的,这是因为可以链接if-elif-else语句。
答案 2 :(得分:1)
字典并不打算用作构造。它不用于存储结构而是用于存储真实数据。在你的情况下,我认为定义一个对象更好。考虑在这种情况下使用OO。
答案 3 :(得分:0)
cases = { 2 : readt3(e,t,off, partElems, partsNodes),
这里你用函数readt3调用e,t,off等参数,这些函数没有定义。