2011-01-13 11 views
3

興味深い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に定義関連のエラーが出るのですか?

この場合、スイッチケースをエミュレートするときに関数定義を配置する必要がありますか。

+0

+1 -1票のバランスをとる。あなたが-1に投票したときに理由を述べてください。この質問は、私にとって基本的な初心者の質問のように見えます。 –

+0

なぜ私は-1であったのだろうと思っていました。そして、私はパイソンの初心者です... –

+0

Pythonのswitch文の欠如は、私がPythonを愛する多くの理由の1つです。これで、読みやすく、維持しやすい戦略パターンを使用しています。選択した回答に戦略パターンを使用するときは、より良い命名法を使用することをお勧めします。あなたが選んだ命名法は、実際にあなたが良い習慣を使っているときに、あなたが慎重にpythonのcase文がないことをコーディングするように見えるようにします。 – marr75

答えて

9

:実際に

... 
2 : readt3(e,t,off, partElems, partsNodes) 
... 

あなたは引数を持つ関数readt3を評価する(呼び出し)しているe,t,off, partElems, partsNodes私はあなたがしたいと思うものを、スイッチの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) 
0
cases = { 2 : readt3(e,t,off, partElems, partsNodes), 

ここでは、定義されていない引数e、t、offなどで関数readt3を呼び出しています。あなたはこのような何かをやっている

+0

明らかに、引数が参照渡しではないので、直接アクセスできないので、これはもっと基本的な問題です... –

1

この辞書は、構文として使用するためのものではありません。構造体を格納するのではなく、実際のデータを格納するために使用されます。あなたの場合、私はオブジェクトを定義する方が良いと思います。このシナリオでOOを使うことを考えてみましょう。

2

実際には、呼び出しをディスパッチするための辞書の使用は、時には、それが意味を成すところで、あなたがしていることを知っているときにできることです。

他の言語で "switch...case"の代わりに使用されるPython構文構造体は "if..elif..else"です。

なぜ人々は単にそれを求めないのか分かりません。それは1つが "性能を失う"か何かのようなものです。しかし、1つの考えでは、if-elseチェーンの極端に絞り込まれた特別なケースです:それは単に等価性の比較と整数の比較のみを可能にします(少なくともCでは、そこではC言語構文をクローンします)、if-elifチェーンでは任意の式を使用できます。

Switch caseステートメントがCで導入されたばかりであることは容易に理解できます。これは、コンパイラがこの特別なケースの最適化を自動化できるようにしたからです(比較シーケンスではなくジャンプテーブルを使用)。しかし、それはコンパイルされた言語に対してのみ意味があり、コンパイラがこれらの最適化を単独で処理できない場合にのみ意味があり、10または20のSPDの違いがジャンプテーブルを使用するよりも大きい。

ご覧のとおり、現代の高水準言語では「スイッチケース」を持つことは非常に冗長です。これは、if-elif-elseステートメントを連鎖できるためです。

+0

これはswitch文の唯一の代替方法です。ディクショナリ(この質問に対する他の答えで説明したように)と多型は、連鎖if文よりもずっと適切な2つのオプションです。 – Duncan

関連する問題