другой корпус переключателя с функциями - PullRequest
3 голосов
/ 13 января 2011

Погружаемся глубже в интересном языке 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?

Где в этой ситуации следует размещать определения функций при эмуляции корпуса коммутатора?

Ответы [ 4 ]

9 голосов
/ 13 января 2011

когда вы делаете что-то вроде этого:

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

на самом деле вы оцениваете (вызываете) функцию readt3 с аргументами e,t,off, partElems, partsNodes что я думаю, вы хотите сделать что-то вроде этого (эмулировать оператор регистра переключений):

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 голосов
/ 13 января 2011

На самом деле, использование словарей для отправки вызовов - это то, что иногда можно сделать, где это имеет смысл, и когда вы знаете, что делаете.

Синтаксическая конструкция Python, которая используется вместо "switch...case" в других языках: "if..elif..else".

Я не знаю, почему люди просто не идут на это. Это как будто кто-то будет «терять производительность» или что-то в этом роде. Но… случай переключения, когда кто-то думает, является чрезвычайно суженным частным случаем цепочки if - else: он позволяет только сравнение на равенство и только сравнение целых чисел (по крайней мере, в C я не знаю о каждом язык, который клонирует синтаксис C), в то время как в цепочке if-elif можно использовать любое выражение.

Легко понять, что оператор Case Switch был только что введен в C, потому что он позволял компилятору автоматизировать оптимизации для этого особого случая (с таблицами переходов вместо последовательности сравнений). Но ... это имеет смысл только для скомпилированных языков, и тогда, это имеет смысл только тогда, когда компилятор не может позаботиться об этих оптимизациях в одиночку, и даже тогда, это имеет смысл, только если разница в скорости для 10 или 20 сравнивается больше, чем при использовании таблицы переходов.

Как вы можете видеть, использование «регистра переключателя» на современном языке высокого уровня является излишним, и это потому, что можно связать операторы if-elif-else.

1 голос
/ 13 января 2011

Словарь не предназначен для использования в качестве конструкции.Он используется не для хранения структуры, а для реальных данных.В вашем случае я думаю, что лучше определить объект.Подумайте об использовании ОО в этом сценарии.

0 голосов
/ 13 января 2011
cases = { 2 : readt3(e,t,off, partElems, partsNodes), 

Здесь вы вызываете функцию readt3 с аргументами e, t, off и т. Д., Которые не определены.

...