I want to 고정된 값을 반환하는 함수를 작성할 Python 의 값에 따라 서로 다른 입력 색인입니다.
꼭 이래야겠어요 다른 언어로 사용할 수 있지만, 파이썬 나타나지 않을 경우 '스위치' 또는 '' 기술서임을 투명지에 '스위치' 발표했다. 파이썬 솔루션뀉뀉뀉뀉 이 시나리오에서의 권장됨 어떤 것이 있습니까?
def f(x):
return {
'a': 1,
'b': 2
}.get(x, 9) # 9 is default if x not found
또 사전에 대한 서버리스 (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 에 비해 괜찮게 시리즈를 보면 어떤 것이 더 가깝다.
제가 제일 좋아하는 파이썬 레시피 스위치 / 비유하사:
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'))
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.
제가 제일 좋아하는 하나는 정말 잘 [레시피] (http://code.activestate.com/recipes/410692/). # 39 you&, ll really like it. # 39 에 가장 가까운 it& I& # 39 한 경우, ve seen, 특히 실제 스위치에서도 제표를 피쳐들입니다.
"'파이썬 클래스 스위치 (객체): 데프 init (자체, 가치): 셀프리발루 = value 셀프스폴 = False
데프 iter (self): ";;;; 방법을 한 번 관심용 stop" " " " 반품해야 일치시킵니다 ". 일드 셀프리마치 스토피테라티온 마련한다.
데프 해당되어서는 (자체, * args): " ";;;; " " suite" 로켈이 을입력할 여부를 나탸내도록 ". 만약 셀프스폴 방관하겠나 args: 진정한 반품하십시오. 에서 엘리프 셀프리발루 args: # 변경할 v1.5, 아래 참조 셀프스폴 = True 진정한 반품하십시오. 다른: 거짓값 반품하십시오. "'
"'파이썬
사건에 대한 스위치 (v): 경우 (& # 39, one& # 39;): 인쇄하십시오 1 브레이크 경우 (& # 39, two& # 39;): 인쇄하십시오 2 브레이크 경우 (& # 39, ten& # 39;): 10 인쇄하십시오. 브레이크 경우 (& # 39, eleven& # 39;): 11 인쇄하십시오. 브레이크 경우 (): # # 39, & # 39, 만약 True& 생략하십시오 조건이거나 그냥 기본 할 수 있다. " ", 인쇄, 무언가!
사건에 대한 스위치 (c): 경우 (& # 39, a& # 39;): # 나머지 suite 비워집니다 전달하십시오 경우에만 필요합니다 경우 (& # 39, b& # 39;): 패스
경우 (& # 39, y& # 39;): 패스 경우 (& # 39, z& # 39;): " ", 인쇄, c 는 소문자화! 브레이크 경우 (& # 39, A& # 39;): 패스
경우 (& # 39, Z& # 39;): " ", 인쇄, c 는 대문자화! 브레이크 경우 (): # 기본 내가 어떤 캜 무서웠느뇨 " " 인쇄하십시오 몰라;;
가져오기의 구체화하십시오 c = A& # 39, & # 39. 사건에 대한 스위치 (c): 경우 ( 스트린g. 로르카스): # 를 인수로 기록하십시오 꺼내기 " ", 인쇄, c 는 소문자화! 브레이크 경우 (* 스트라이지우퍼케이스): " ", 인쇄, c 는 대문자화! 브레이크 경우 (& # 39;! & # 39, & # 39, & # 39, & # 39, # 39 .&?;;): # qic 반군지역 스타일 또한 일반 인수 c 는 " 인쇄하십시오 마디였나 종단기! "; 브레이크 경우 (): # 기본 내가 어떤 캜 무서웠느뇨 " " 인쇄하십시오 몰라;; "'
"'파이썬 class Switch: 데프 init (자체, 가치): 셀프리발루 = value
데프 enter (self): 자체 반품하십시오.
데프 exit (자체 mm_mail_doc., 가치, 역추적):
데프 call (자체, * 값): 의 값을 셀프리발루 반품하십시오.
에서 datetime 가져오기의 datetime
스위치 (다테타임스토데이 스위크데이 () ()) 를 통해 사례: 경우 (0):
보기인쇄 (" 그러하매 much." 월요일 싫다;;) 여기서 필요한 분할합니다 # 참고 꾨т 臾몄젣媛? 엘리프 케이스 (1.2):
보기인쇄 (" 될 경우, 는 주말 " 여기서요?;) 엘리프 케이스 (3.4): 보기인쇄 (,) 는 지난 주말 " near.") 다른:
보기인쇄 (# 39 의 gnu. 이따봐 " Let& ";) # # 39 Didn& t 览侩 荤례 예를 들기 위해 선정된 것입니다. "'
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
(원래 방법은 eschweiler-clarke 'stateCOMMAND', 사용하기 때문에 동일한 패턴을 구현할 수 있는 상태, 즉 ' (자체, & # 39, # 39, state& 그레타르 머시닝할 + 셀프리모데) ')
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&. 그럼 평가하여 반환되었습니다 함수 호출.
여기서 잠깐 드롭합니다 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 파생됨 " there& # 39 의 올바른 방법으로 하나만 something".
복잡한 함수를 사용하여 검색표 경우 사전에 차단할 경우 볼 수 있습니다.
참고: &Quot 못하며창조된 not " 사용하여, (); 이를 통해 사전 검색 기능이 있는 케이스 / 또는 / 경우 사전에 호츨 각 블록 생성됩니다. 이 때문에 각 함수를 사용하여 한 번 할 때만 너희에게베풀어진 호출하십시오 해시보다 스타일입니까 조회.
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()
예를 들어, 이 경우 다음과 같은 코드를 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& 액화천연가스 (lng), pg) = 19 ://elp.chronocv.fr/articles.php?
내가 공통 스위치 구조를 있음을 발견했다.
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)
대신 성명을 통해, 파이썬 버전은 있는 값으로 표현식에서는 평가하고 있다.
난 내가 찾던 어느 위치에든 간단한 답을 찾을 수 없는 didn& # 39, 구글 검색. 하지만 내가 생각 아웃해야 겁니다. # 39 의 it& 정말 아주 간단합니다. 아마 몇 긁힘 방지 else& 방문한 적은 게시물로의 했다 (it), # 39 의 헤드입니다. 중요한 것은 단순히 in" "; 및 튜플을. 다음은 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.
여기에 대답을 할 수 있는 가장 오래된 것 때문에 특히 수락됨 수준들과 규모의 주지하십시오.
첫째, 공식 [파이썬 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')
이후 이 문제를 놓고 십 년 이상의 경우, 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 를 단일 발송하십시오 스위칭이란 유형.
이 솔루션은 내가 사용:
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: 것가운데 '" 보인다. 또한 사용하고 있는 x 'x', '= 23 딕트 2" -
.get('xxx', lambda x: x - 22)(44)
# 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
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