5. if switch

判斷、多條件判斷

【if 語法】

if (判斷式1):

程式區塊1

elif(判斷式2):

程式區塊2

else:

程式區塊3

※如果「判斷式1」成立、執行「程式區塊1」,否則、如果,「判斷式2」成立、執行「程式區塊2」,否則執行「程式區塊3」。

冒號之後按Enter則下一行縮排,縮排是Python用來決定執行那些程式區塊的依據。

【switch 用法】

Python語言少了switch這個指令,最常用的方式是使用「字典」來對應。

英文參考網址:https://code.activestate.com/recipes/410692/

字典來做判斷

def foo(var):

return {

'a': 1

'b': 2,

'c': 3,

}.get(var,'error')#如果沒找到就回傳error


另一個例子:

def f(x):

return {

'a': 1,

'b': 2,

}.get(x, 9) # 9 will be returned default if x is not found

【使用匿名函式

def foo(var,x):

return {

'a': lambda x: x 1,

'b': lambda x: x 2,

'c': lambda x: x 3,

}[var](x)

【以類別來判斷】

節錄自:https://code.activestate.com/recipes/410692/

# This class provides the functionality we want. You only need to look at

# this if you want to know how this works. It only needs to be defined

# once, no need to muck around with its internals.

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!"

# Since Pierre's suggestion is backward-compatible with the original recipe,

# I have made the necessary modification to allow for the above usage.