【问题标题】:another switch case with functions另一个具有功能的开关盒
【发布时间】:2011-01-13 15:09:54
【问题描述】:

深入研究有趣的 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 is undefined”,我以为我得到了这个,因为它在案例之前没有定义,然后将函数定义向上移动到案例之上,但仍然是同样的问题,但这次“e 未定义”我可以不明白这个,所以e是一个函数参数,为什么我在e上得到一个定义相关的错误?

在这种情况下模拟 switch-case 时函数定义应该放在哪里?

【问题讨论】:

  • +1 以平衡 -1 投票。请在您投票-1时给出理由。这个问题对我来说似乎是一个基本的初学者问题。
  • 我也想知道为什么会有-1,是的,我是python的初学者......
  • Python 缺少 switch 语句是我喜欢 python 的众多原因之一。现在您正在使用一种非常易于阅读且易于维护的策略模式。我建议您在选择的答案中使用策略模式时,使用更好的命名方式。您选择的命名看起来就像您在真正使用良好实践时不情愿地围绕 python 缺少 case 语句进行编码。

标签: python function case switch-statement


【解决方案1】:

当你做这样的事情时:

...
 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)

【讨论】:

    【解决方案2】:

    实际上,使用字典来分派呼叫有时是可以做到的,在有意义的地方以及当您知道自己在做什么时。

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

    我不知道为什么人们根本不去追求它。这就像一个人会“失去性能”或其他什么。但是..switch case,当人们认为时,它是 if--else 链的一个极其狭窄的特殊情况:它只允许比较相等性,并且只允许比较整数(至少在 C 中,我不知道每个克隆 C 语法的语言),而在 if-elif 链中可以使用任何表达式。

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

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

    【讨论】:

    • 这只是 switch 语句的一种替代方法。字典(如该问题的其他答案中所讨论的)和多态性是两个通常比链式 if 语句更合适的选项。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      cases = { 2 : readt3(e,t,off, partElems, partsNodes), 
      

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

      【讨论】:

      • 我应该多读一点关于函数的内容,因为显然,参数不是通过引用传递的,所以你不能直接访问,这是一个更根本的问题......
      猜你喜欢
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多