입력 인덱스 값을 기반으로 다른 고정 값을 반환하는 함수를 Python으로 작성하고 싶습니다.
다른 언어에서는 switch
or case
문을 사용 하지만 Python에는 문이없는 것 같습니다 switch
. 이 시나리오에서 권장되는 Python 솔루션은 무엇입니까?
답변
사전을 사용할 수 있습니다.
def f(x):
return {
'a': 1,
'b': 2,
}[x]
답변
기본값을 원하면 사전 get(key[, default])
방법을 사용할 수 있습니다 .
def f(x):
return {
'a': 1,
'b': 2
}.get(x, 9) # 9 is default if x not found
답변
나는 항상 이런 식으로하는 것을 좋아했습니다.
result = {
'a': lambda x: x * 5,
'b': lambda x: x + 7,
'c': lambda x: x - 2
}[value](x)
답변
(정말 BTW, 등), 당신은 또한 사용할 수있는 사전 방법뿐만 아니라 if
– elif
– else
얻기 위해 switch
/ case
/ default
기능 :
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
이것은 물론 스위치 / 케이스와 동일하지 않습니다. break
문장 을 빠뜨리는 것처럼 쉽게 넘어 질 수는 없지만 더 복잡한 테스트를 할 수 있습니다. if
기능적으로 그것이 더 가깝더라도 형식은 일련의 중첩 된 것보다 좋습니다 .
답변
스위치 / 케이스에서 가장 좋아하는 Python 레시피는 다음과 같습니다.
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.
답변
내가 가장 좋아하는 것은 정말 좋은 요리법 입니다. 당신은 정말로 그것을 좋아할 것입니다. 실제 기능에 대해 스위치 케이스 문장에서 본 가장 가까운 것입니다.
class switch(object):
def __init__(self, value):
self.value = value
self.fall = False
def __iter__(self):
"""Return the match method once, then stop"""
yield self.match
raise StopIteration
def match(self, *args):
"""Indicate whether or not to enter a case suite"""
if self.fall or not args:
return True
elif self.value in args: # changed for v1.5, see below
self.fall = True
return True
else:
return False
예를 들면 다음과 같습니다.
# The following example is pretty much the exact use-case of a dictionary,
# but is included for its simplicity. Note that you can include statements
# in each suite.
v = 'ten'
for case in switch(v):
if case('one'):
print 1
break
if case('two'):
print 2
break
if case('ten'):
print 10
break
if case('eleven'):
print 11
break
if case(): # default, could also just omit condition or 'if True'
print "something else!"
# No need to break here, it'll stop anyway
# break is used here to look as much like the real thing as possible, but
# elif is generally just as good and more concise.
# Empty suites are considered syntax errors, so intentional fall-throughs
# should contain 'pass'
c = 'z'
for case in switch(c):
if case('a'): pass # only necessary if the rest of the suite is empty
if case('b'): pass
# ...
if case('y'): pass
if case('z'):
print "c is lowercase!"
break
if case('A'): pass
# ...
if case('Z'):
print "c is uppercase!"
break
if case(): # default
print "I dunno what c was!"
# As suggested by Pierre Quentel, you can even expand upon the
# functionality of the classic 'case' statement by matching multiple
# cases in a single shot. This greatly benefits operations such as the
# uppercase/lowercase example above:
import string
c = 'A'
for case in switch(c):
if case(*string.lowercase): # note the * for unpacking as arguments
print "c is lowercase!"
break
if case(*string.uppercase):
print "c is uppercase!"
break
if case('!', '?', '.'): # normal argument passing style also applies
print "c is a sentence terminator!"
break
if case(): # default
print "I dunno what c was!"