Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 另一个带功能的开关盒_Python_Function_Case_Switch Statement - Fatal编程技术网

Python 另一个带功能的开关盒

Python 另一个带功能的开关盒,python,function,case,switch-statement,Python,Function,Case,Switch Statement,深入研究有趣的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

深入研究有趣的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上得到定义相关的错误

在这种情况下,模拟交换机情况时,函数定义应放在何处

cases = { 2 : readt3(e,t,off, partElems, partsNodes), 

在这里,您使用未定义的参数e、t、off等调用函数readt3。

执行类似操作时:

...
 2 : readt3(e,t,off, partElems, partsNodes)
...
实际上,您正在使用参数
e、t、off、partElems、partsNodes来计算(调用)函数
readt3
,我认为您要做的是这样的事情(模拟switch case语句):

现在,您可以在给定
case
参数的情况下调用您的案例,如下所示:

case = 2

cases[case](e,t,off, partElems, partsNodes)

这本词典不打算用作构造。它不是用来存储结构,而是用来存储实际数据。在你的情况下,我认为最好定义一个对象。考虑在这种情况下使用OO。

事实上,使用词汇来分派调用有时是可以做到的,只要你知道你在做什么,这是有意义的

在其他语言中用来代替“
switch…case
”的Python语法结构是“
if..elif..else

我不知道为什么人们不这么做。这就像是一个将“失去性能”或任何东西。但是..switch case,whnen认为,是if--else链的一个非常狭窄的特例:它只允许对等式进行比较,只允许对整数进行比较(至少在C语言中,我不知道所有克隆C语法的语言),而在if-elif链中,可以使用任何表达式

很容易看出Switch-case语句是在C中引入的,因为它允许编译器自动优化这种特殊情况(使用跳转表,而不是一系列比较)。但是…这只对编译语言有意义,而且,只有当编译器无法单独处理这些优化时才有意义,即使如此,只有当10或20次比较的速度差大于使用跳转表时才有意义


如您所见,在现代高级语言中使用“switch case”是非常多余的,这是因为可以链接if-elif-else语句。

我应该多读一些函数方面的内容,因为显然,参数不是通过引用传递的,因此您无法直接访问,这是一个更根本的问题…+1来平衡-1票。当你投-1票时,请给出一个理由。这个问题对我来说似乎是一个基本的初学者问题。我还想知道为什么会有a-1,是的,我是python的初学者……python缺少switch语句是我喜欢python的众多原因之一。现在,您正在使用一个非常易于阅读和维护的策略模式。我建议您在选择的答案中使用策略模式时,使用一些更好的命名。您选择的命名使您看起来像是在不情愿地编写python缺少case语句的代码,而实际上您正在使用良好的实践。这只是switch语句的一种替代方法。字典(正如在这个问题的其他答案中所讨论的)和多态性是两个比链式if语句更合适的选项。
case = 2

cases[case](e,t,off, partElems, partsNodes)