스위치 문을 교체품을 파이썬?

I want to 고정된 값을 반환하는 함수를 작성할 Python 의 값에 따라 서로 다른 입력 색인입니다.

꼭 이래야겠어요 다른 언어로 사용할 수 있지만, 파이썬 나타나지 않을 경우 '스위치' 또는 '' 기술서임을 투명지에 '스위치' 발표했다. 파이썬 솔루션뀉뀉뀉뀉 이 시나리오에서의 권장됨 어떤 것이 있습니까?

질문에 대한 의견 (9)
해결책

사전을 사용할 수 있습니다.

def f(x):
    return {
        'a': 1,
        'b': 2,
    }[x]
해설 (18)

39 와 같은 경우 사전에 설정값으로 you& 사용할 수 있습니다; d ['프레젠테이션이든 (키 [, 기본])'] (https://docs.python.org/2/library/stdtypes.html # 딕트리제) 방법:

def f(x):
    return {
        'a': 1,
        'b': 2
    }.get(x, 9)    # 9 is default if x not found
해설 (5)

39, ve i& 좋아했잖아 그렇게 항상 이렇게

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}[value](x)

[From here] (http://blog.simonwillison.net/post/57956755106/switch)

해설 (15)

또 사전에 대한 서버리스 (nsr/res 브트와, I really like), 스위치 / 케이스 / 만약 다른 엘리프 얻을 수 있는 기본 기능을 사용할 수도 있습니다.

if x == 'a':
    # Do the thing
elif x == 'b':
    # Do the other thing
if x in 'bc':
    # Fall-through by not using elif, but now the default case includes case 'a'!
elif x in 'xyz':
    # Do yet another thing
else:
    # Do the default

이 과정은 동일하지 않은 채 실패로 끝나다 전환하십시오 / 사례 - 것만큼 쉽게 끕니까 분할합니다 있을 수 없습니다. 기술서임을 있지만, 더 복잡한 테스트 할 수 있습니다. 그 형식은 네스트된 ifs, 비록 that& # 39 에 비해 괜찮게 시리즈를 보면 어떤 것이 더 가깝다.

해설 (11)

제가 제일 좋아하는 파이썬 레시피 스위치 / 비유하사:

choices = {'a': 1, 'b': 2}
result = choices.get(key, 'default')

짧고 간단한 예를 들어 시나리오에서와.

비교할 때, 11+ 줄의 C 코드:

// C Language version of a simple 'switch/case'.
switch( key ) 
{
    case 'a' :
        result = 1;
        break;
    case 'b' :
        result = 2;
        break;
    default :
        result = -1;
}

여러 변수 튜플을 사용하여 지정할 수도 있습니다.

choices = {'a': (1, 2, 3), 'b': (4, 5, 6)}
(result1, result2, result3) = choices.get(key, ('default1', 'default2', 'default3'))
해설 (9)
class switch(object):
    value = None
    def __new__(class_, value):
        class_.value = value
        return True

def case(*args):
    return any((arg == switch.value for arg in args))

사용법:

while switch(n):
    if case(0):
        print "You typed zero."
        break
    if case(1, 4, 9):
        print "n is a perfect square."
        break
    if case(2):
        print "n is an even number."
    if case(2, 3, 5, 7):
        print "n is a prime number."
        break
    if case(6, 8):
        print "n is an even number."
        break
    print "Only single-digit numbers are allowed."
    break

테스트:

n = 2
#Result:
#n is an even number.
#n is a prime number.
n = 11
#Result:
#Only single-digit numbers are allowed.
해설 (10)

제가 제일 좋아하는 하나는 정말 잘 [레시피] (http://code.activestate.com/recipes/410692/). # 39 you&, ll really like it. # 39 에 가장 가까운 it& I& # 39 한 경우, ve seen, 특히 실제 스위치에서도 제표를 피쳐들입니다.

"'파이썬 클래스 스위치 (객체): 데프 init (자체, 가치): 셀프리발루 = value 셀프스폴 = False

데프 iter (self): ";;;; 방법을 한 번 관심용 stop&quot &quot &quot &quot 반품해야 일치시킵니다 &quot. 일드 셀프리마치 스토피테라티온 마련한다.

데프 해당되어서는 (자체, * args): &quot ";;;; &quot &quot suite&quot 로켈이 을입력할 여부를 나탸내도록 &quot. 만약 셀프스폴 방관하겠나 args: 진정한 반품하십시오. 에서 엘리프 셀프리발루 args: # 변경할 v1.5, 아래 참조 셀프스폴 = True 진정한 반품하십시오. 다른: 거짓값 반품하십시오. "'

39 의 here& 예:

"'파이썬

다음 비유하사 의 정확한 사전, 꽤 많은 활용

하지만 이에 대해 단순한 포함되어 있다. 참고로 제표를 포함할 수 있습니다

각 제품입니다.

39, & # 39 ten&, v =

사건에 대한 스위치 (v): 경우 (& # 39, one& # 39;): 인쇄하십시오 1 브레이크 경우 (& # 39, two& # 39;): 인쇄하십시오 2 브레이크 경우 (& # 39, ten& # 39;): 10 인쇄하십시오. 브레이크 경우 (& # 39, eleven& # 39;): 11 인쇄하십시오. 브레이크 경우 (): # # 39, & # 39, 만약 True& 생략하십시오 조건이거나 그냥 기본 할 수 있다. &quot &quot, 인쇄, 무언가!

# 39, ll 정지점을 분할하려면 임무야, 어쨌든 it& 필요는 없습니다.

분할합니다 최대한 많이 볼 수 있지만, 여기에 사용된 것은 마치 실제 심장처럼

엘리프 일반적으로 더 좋은 것처럼 간단한.

빈 제품군 구문 오류와 도왔으매 의도적 스루 가을 간주된다.

# 39, & # 39 pass& 포함해야 합니다.

39, & # 39 z&, c =

사건에 대한 스위치 (c): 경우 (& # 39, a& # 39;): # 나머지 suite 비워집니다 전달하십시오 경우에만 필요합니다 경우 (& # 39, b& # 39;): 패스

.

경우 (& # 39, y& # 39;): 패스 경우 (& # 39, z& # 39;): &quot &quot, 인쇄, c 는 소문자화! 브레이크 경우 (& # 39, A& # 39;): 패스

.

경우 (& # 39, Z& # 39;): &quot &quot, 인쇄, c 는 대문자화! 브레이크 경우 (): # 기본 내가 어떤 캜 무서웠느뇨 &quot &quot 인쇄하십시오 몰라;;

권고하는 대로 따라 확장하십시오 피에르 쿠엔텔 수도 있습니다

# 39, & # 39 기본 기능을 case&. 기술서임을 일치시켜 복수

사례 한 샷. 이 같은 작업을 크게 보험급부금

대문자화 / 소문자화 위 예제:

가져오기의 구체화하십시오 c = A& # 39, & # 39. 사건에 대한 스위치 (c): 경우 ( 스트린g. 로르카스): # 를 인수로 기록하십시오 꺼내기 &quot &quot, 인쇄, c 는 소문자화! 브레이크 경우 (* 스트라이지우퍼케이스): &quot &quot, 인쇄, c 는 대문자화! 브레이크 경우 (& # 39;! & # 39, & # 39, & # 39, & # 39, # 39 .&?;;): # qic 반군지역 스타일 또한 일반 인수 c 는 &quot 인쇄하십시오 마디였나 종단기! "; 브레이크 경우 (): # 기본 내가 어떤 캜 무서웠느뇨 &quot &quot 인쇄하십시오 몰라;; "'

해설 (5)

"'파이썬 class Switch: 데프 init (자체, 가치): 셀프리발루 = value

데프 enter (self): 자체 반품하십시오.

데프 exit (자체 mm_mail_doc., 가치, 역추적):

복귀하십시오 거짓값 역추적 발생할 수 있습니다

데프 call (자체, * 값): 의 값을 셀프리발루 반품하십시오.

에서 datetime 가져오기의 datetime

스위치 (다테타임스토데이 스위크데이 () ()) 를 통해 사례: 경우 (0):

스위치 기본 사용법

보기인쇄 (&quot 그러하매 much.&quot 월요일 싫다;;) 여기서 필요한 분할합니다 # 참고 꾨т 臾몄젣媛? 엘리프 케이스 (1.2):

여러 조건을 (한 선) 이 스위치에서는 지원한다.

보기인쇄 (&quot 될 경우, 는 주말 &quot 여기서요?;) 엘리프 케이스 (3.4): 보기인쇄 (,) 는 지난 주말 &quot near.") 다른:

(기본값) 이 발생할 수 있습니다

보기인쇄 (# 39 의 gnu. 이따봐 &quot Let& ";) # # 39 Didn& t 览侩 荤례 예를 들기 위해 선정된 것입니다. "'

해설 (3)

I learned from # 39 의 파이썬 코드를 패턴을 there& 있는 것을 보면 안타깝다.

class SMTP:
    def lookupMethod(self, command):
        return getattr(self, 'do_' + command.upper(), None)
    def do_HELO(self, rest):
        return 'Howdy ' + rest
    def do_QUIT(self, rest):
        return 'Bye'

SMTP().lookupMethod('HELO')('foo.bar.com') # => 'Howdy foo.bar.com'
SMTP().lookupMethod('QUIT')('') # => 'Bye'

필요하면 언제든지 사용할 수 있습니다) 에 발송하십시오 증표지 및 실행 코드를 ehas. '시스템' 에 '상태로 state 방법, 그리고 발송하십시오 셀f.국가' 했습니다. 이 스위치에서는 기본 클래스 정의 '와' 에서 수 있는 유일한 방법은 do 변수를 확실하게 연장했다. # 39 의 방법 ',' t 경우가 너회가 won& 갖추지 do_ 기본 클래스.

Edit: 얼마나 정확하게 에로남이네 used

헬리콥터 '에서' 와이어) 의 경우, smtp 받을 수 있습니다. 관련 코드 ("에서 twisted/mail/smtp.py '의 경우, 수정되었음) 모양입니다

class SMTP:
    # ...

    def do_UNKNOWN(self, rest):
        raise NotImplementedError, 'received unknown command'

    def state_COMMAND(self, line):
        line = line.strip()
        parts = line.split(None, 1)
        if parts:
            method = self.lookupMethod(parts[0]) or self.do_UNKNOWN
            if len(parts) == 2:
                return method(parts[1])
            else:
                return method('')
        else:
            raise SyntaxError, 'bad syntax'

SMTP().state_COMMAND('   HELO   foo.bar.com  ') # => Howdy foo.bar.com

39, & # 39 'll 수신한다는 you&. Foo.bar.com & # 39, 헬리콥터 ' (또는 너회가 지정값이 프레젠테이션이든' & # 39, & # 39, QUIT& # 39, '또는' 크프트 다음과 같이 사용된다. # 39 foo&; '). 이는 토큰 화 '에 따라 부품' (foo.bar.com) ' [& # 39, & # 39,, helo& # 39, & # 39]'. 실제 메서드입니다 조회 이름님은 수행됨을 "에서 부품 [0] '.

(원래 방법은 eschweiler-clarke 'stateCOMMAND', 사용하기 때문에 동일한 패턴을 구현할 수 있는 상태, 즉 ' (자체, & # 39, # 39, state& 그레타르 머시닝할 + 셀프리모데) ')

해설 (7)

39, s, t want to say you don& let& # 39 값을 반환하는 메서드입니다 사용할 수 있지만, 그냥 뭔가 변경하십시오 객체에 대한. 여기에 명시된 외곽진입 사용하여 다음과 같습니다.

result = {
  'a': obj.increment(x),
  'b': obj.decrement(x)
}.get(value, obj.default(x))

여기에 어떻게 평가하고 있는 모든 방법을 사전이므로 에로남이네 파이썬 그래서 a& # 39, & # 39, 경우에도 값은 객체에는 증분됩니다 and 감소합니다 의해 x 받게 된다.

해결책:

func, args = {
  'a' : (obj.increment, (x,)),
  'b' : (obj.decrement, (x,)),
}.get(value, (obj.default, (x,)))

result = func(*args)

그래서 바뀌엇어요 확보하십시오 포함된 기능과 해당 인수만. 즉, 오직 함수 포인터 및 인수 목록이 프레젠테이션이든 반환되었습니다, not 평가를 받았다. # 39, & # 39 result&. 그럼 평가하여 반환되었습니다 함수 호출.

해설 (0)

여기서 잠깐 드롭합니다 i& # 39 m, 제 2 센트. 그 이유는 좁히어 isn& # 39 의 경우, t) 의 원리를 & # 39 는 파이썬 inet6.0, switch 문 / 파이썬 때문에 길을 something& # 39, 하나만 수행할 수 있다. 그래서 명백하게 다양한 방법을 통해 다시 나올 수 있지만, 이것은 스위치 / 케이스 기능을 수행하기 길을 if / 파이썬 엘리프 chunghwa. ie

if something:
    return "first thing"
elif somethingelse:
    return "second thing"
elif yetanotherthing:
    return "third thing"
else:
    return "default thing"

난 그냥 여기 한 지지자가 상대방 주자가 후보가 됐을 때 느낀 PEP 8 됐다. Python 은 그 중 가장 아름다운 것에 대해 단순성과 우아. 즉, 우리, 하나 등 8 가지) 에 의해 pep 파생됨 &quot there& # 39 의 올바른 방법으로 하나만 something&quot.

해설 (8)

에 따라 확장하는지 &quot 딕트 switch"; 발상이다. 사용하려면 단축시킵니다 기본값입니다 스위치였습니다:

def f(x):
    try:
        return {
            'a': 1,
            'b': 2,
        }[x]
    except KeyError:
        return 'default'
해설 (2)

복잡한 함수를 사용하여 검색표 경우 사전에 차단할 경우 볼 수 있습니다.

39 haven& 경우, 그 이전에 이런 일을 안 좋은 방법이 앞당기세요 사전에 정확히 어떻게 보고 각 함수의 클린업합니다 디버거를 보인다.

참고: &Quot 못하며창조된 not &quot 사용하여, (); 이를 통해 사전 검색 기능이 있는 케이스 / 또는 / 경우 사전에 호츨 각 블록 생성됩니다. 이 때문에 각 함수를 사용하여 한 번 할 때만 너희에게베풀어진 호출하십시오 해시보다 스타일입니까 조회.

def first_case():
    print "first"

def second_case():
    print "second"

def third_case():
    print "third"

mycase = {
'first': first_case, #do not use ()
'second': second_case, #do not use ()
'third': third_case #do not use ()
}
myfunc = mycase['first']
myfunc()
해설 (1)

39, re 검색: 추가 기술서임을 you& 경우, 파이썬 모듈 기반으로 하는 것처럼, 나는 &quot switch&quot 연장시킵니다 파이썬. # 39 의 [발견하다] [1] 로 하는 it& &quot 강화됨 구조를 Python"; # 39 의 파이썬 2.x 및 파이썬 3.x 및 it& 모두 사용할 수 있습니다.

예를 들어, 이 경우 다음과 같은 코드를 switch 문으로 의해 수행될 수 있다.

macro switch(arg1):
    while True:
        cont=False
        val=%arg1%
        socket case(arg2):
            if val==%arg2% or cont:
                cont=True
                socket
        socket else:
            socket
        break

다음과 같이 사용할 수 있는

a=3
switch(a):
    case(0):
        print("Zero")
    case(1):
        print("Smaller than 2"):
        break
    else:
        print ("greater than 1")

그래서 그 변환하기에 발견하다 파이썬 다음과 같습니다.

a=3
while True:
    cont=False
    if a==0 or cont:
        cont=True
        print ("Zero")
    if a==1 or cont:
        cont=True
        print ("Smaller than 2")
        break
    print ("greater than 1")
    break

[1]: https://web.archive.org/web/20111103124355/http = en&amp 액화천연가스 (lng), pg) = 19 ://elp.chronocv.fr/articles.php?

해설 (3)

내가 공통 스위치 구조를 있음을 발견했다.

switch ...parameter...
case p1: v1; break;
case p2: v2; break;
default: v3;

python 에서 다음과 같이 표현될 수 있다.

(lambda x: v1 if p1(x) else v2 if p2(x) else v3)

또는 더 포맷되었을 인할지 운행에서어떠한:

(lambda x:
     v1 if p1(x) else
     v2 if p2(x) else
     v3)

대신 성명을 통해, 파이썬 버전은 있는 값으로 표현식에서는 평가하고 있다.

해설 (4)

난 내가 찾던 어느 위치에든 간단한 답을 찾을 수 없는 didn& # 39, 구글 검색. 하지만 내가 생각 아웃해야 겁니다. # 39 의 it& 정말 아주 간단합니다. 아마 몇 긁힘 방지 else& 방문한 적은 게시물로의 했다 (it), # 39 의 헤드입니다. 중요한 것은 단순히 in&quot "; 및 튜플을. 다음은 switch 문 등 함께 비헤이비어를 실패로 끝나다 무순서 실패로 끝나다.

l = ['Dog', 'Cat', 'Bird', 'Bigfoot',
     'Dragonfly', 'Snake', 'Bat', 'Loch Ness Monster']

for x in l:
    if x in ('Dog', 'Cat'):
        x += " has four legs"
    elif x in ('Bat', 'Bird', 'Dragonfly'):
        x += " has wings."
    elif x in ('Snake',):
        x += " has a forked tongue."
    else:
        x += " is a big mystery by default."
    print(x)

print()

for x in range(10):
    if x in (0, 1):
        x = "Values 0 and 1 caught here."
    elif x in (2,):
        x = "Value 2 caught here."
    elif x in (3, 7, 8):
        x = "Values 3, 7, 8 caught here."
    elif x in (4, 6):
        x = "Values 4 and 6 caught here"
    else:
        x = "Values 5 and 9 caught in default."
    print(x)

기능:

Dog has four legs
Cat has four legs
Bird has wings.
Bigfoot is a big mystery by default.
Dragonfly has wings.
Snake has a forked tongue.
Bat has wings.
Loch Ness Monster is a big mystery by default.

Values 0 and 1 caught here.
Values 0 and 1 caught here.
Value 2 caught here.
Values 3, 7, 8 caught here.
Values 4 and 6 caught here
Values 5 and 9 caught in default.
Values 4 and 6 caught here
Values 3, 7, 8 caught here.
Values 3, 7, 8 caught here.
Values 5 and 9 caught in default.
해설 (5)

여기에 대답을 할 수 있는 가장 오래된 것 때문에 특히 수락됨 수준들과 규모의 주지하십시오.

첫째, 공식 [파이썬 FAQ] (https://docs.python.org/3/faq/design.html # 있을 수 없는 이유는 스위치이거나 case 문에 파이썬) 이 있으며, 간단한 경우에 대한 '및' 닫히지만 권장하는 '엘리프 체인 딕트' 대규모 또는 보다 복잡한 건. 또한 일련의 '' 제안됩니다 visit_ 서버리스 (사용하는 많은 서버 프레임워크와도 스타일) 의 일부 있었다.

def dispatch(self, value):
    method_name = 'visit_' + str(value)
    method = getattr(self, method_name)
    method()

Faq 를 인식되었다 [PEP 275] (https://www.python.org/dev/peps/pep-0275/) 를 얻기 위해 작성한 공식 한번만 진단트리 추가에 대한 c 스타일 스위치였습니다 명령문입니다. 하지만 그 모습을 실제로 우회된 수 있으며, 그것은 오직 거절됨 따라 별도의 공식 제안, 파이썬 3 [PEP 3103] (https://www.python.org/dev/peps/pep-3103/). Answer 는 물론 노하지만하지 pep 링크를 가질 경우 추가 정보를 두 가지 또는 you& # 39, re 관심이 쏠리고 있다.

한 심아이엔큐 다가와 여러 번 할 수 있고, 실제 모습을 볼 수 있는 경우에도 275 전송되었기 컷아웃할 표시됨과 권장안을) 가 바로 그런 경우 8 줄의 코드를 처리할 수 있도록 함으로써, re 상행담관염이라고 괴롭혔다 you& # 39 건, 6 선 you& # 39 에서, C, d 가 4 vs. Bash, 넌 언제나 쓴:

if x == 1: print('first')
elif x == 2: print('second')
elif x == 3: print('third')
else: print('did not place')

39 이 isn& 있지만, s, t 가 아니라 # 39 정확히요 권장됨 PEP 8 it& 판독값 너무 유니디머티스.

이후 이 문제를 놓고 십 년 이상의 경우, PEP 3103 거부되었고, 심지어 약간 더 강력한 검색하기를 버전을 제표를 c 스타일, 는 중부아프리카붉은콜로부스의 죽은입니다. 누구나 it up on 파이썬 한다. 때마다, 또는 - re # 39 라고 누구이뇨 개발, they& 이전 결정을 내렸다.

그러나 이후 몇 년마다 발생할 수 있다는 생각을, 특히 전체 ml 스타일 패턴 매칭 같은 언어를 신속하고 러스트 채택한 것이 특징이다. 문제는 it& # 39 의 대수적 데이터 형식을 사용할 수 있도록 열심히 훨씬 아웃해야 패턴 매칭 없이. 한편, 그동안 이 생각에 # 39, 귀도 sympathetic nobody& 파이썬 잘 끼울 수 있는 방안을 내놓아야 한다. 2014년 (rec.601 읽을 수 있는 [내 스트라우먼] (http://stupidpythonideas.blogspot.com/2014/08/a-pattern-matching-case-statement-for.html) 의 예이다.) 바꿀 수 있는 '이' 에 대한 제안서를 다타클레스 3.7 및 일부 산발적인 이넘 처리할 수 있는 다양한 종류, 더 강력한 '합' 제안서를 기술서임을 로컬 서로 다른 종류의 바인딩 (예: [pep 3150] (https://www.python.org/dev/peps/pep-3150/) 또는 설정되었습니다 현재 논의되고 있는 - 아이디어 제안). # 39, hasn& 얻게된다면 있으나 아직까지 없다.

또한, 이는 "에서 모든 것을 가끔 제안서를 펄 6 스타일 일치 '를 기본적으로 뒤범벅 엘리프 regex 를 단일 발송하십시오 스위칭이란 유형.

해설 (0)

이 솔루션은 내가 사용:

2 명의 솔루션을 결합한 게시하기를 임무야, 이는 비교적 쉽게 읽고 汲摹窍妨绰 설정값으로.

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}.get(whatToUse, lambda x: x - 22)(value)

여기서

.get('c', lambda x: x - 22)(23)

람다 x: 것가운데 '&quot 보인다. 또한 사용하고 있는 x 'x', '= 23 딕트 2&quot -

.get('xxx', lambda x: x - 22)(44)

39 의 기본 '에서는 딕트 doesn&, t, 람다 x: &quot 찾을 수 있습니다. x = x - 22&quot 44 '을 (를)', '.

해설 (0)
# simple case alternative

some_value = 5.0

# this while loop block simulates a case block

# case
while True:

    # case 1
    if some_value > 5:
        print ('Greater than five')
        break

    # case 2
    if some_value == 5:
        print ('Equal to five')
        break

    # else case 3
    print ( 'Must be less than 5')
    break
해설 (1)
def f(x):
    dictionary = {'a':1, 'b':2, 'c':3}
    return dictionary.get(x,'Not Found') 
##Returns the value for the letter x;returns 'Not Found' if x isn't a key in the dictionary
해설 (2)