當前位置:首頁 » 編程語言 » python的switchcase

python的switchcase

發布時間: 2022-12-16 11:00:39

① 為什麼python中沒有Switch/Case語句

因為作為一門解釋型語言,switch/case是沒有存在必要的,if/elif/else就可以實現的功能,為什麼要再提供重復的?
if else的得一個if一個if的判斷過去,如果匹配的是最後一個條件,前面所有if都得判斷一遍的。
看過匯編就知道,C語言的switch/case,在case值連續的時候,是可以根據case值直接計算該跳轉的地址的。

② Python里怎麼實現switch case

學習Python過程中,發現沒有switch-case,過去寫C習慣用Switch/Case語句,官方文檔說通過if-elif實現。所以不妨自己來實現Switch/Case功能。
方法一
通過字典實現
def foo(var):
return {
'a': 1,
'b': 2,
'c': 3,
}.get(var,'error') #'error'為默認返回值,可自設置

方法二
通過匿名函數實現
def foo(var,x):
return {
'a': lambda x: x+1,
'b': lambda x: x+2,
'c': lambda x: x+3,
}[var](x)

方法三
通過定義類實現
參考Brian Beck通過類來實現Swich-case
# 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 nno 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 nno 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.

查看Python官方:PEP 3103-A Switch/Case Statement
發現其實實現Switch Case需要被判斷的變數是可哈希的和可比較的,這與Python倡導的靈活性有沖突。在實現上,優化不好做,可能到最後最差的情況匯編出來跟If Else組是一樣的。所以Python沒有支持。

③ 為什麼Python中沒有Switch/Case語句

不同於我用過的其它編程語言,Python 沒有 switch / case 語句。為了實現它,我們可以使用字典映射:

Python

1
2
3
4
5
6
7

def numbers_to_strings(argument):
switcher = {
0: "zero",
1: "one",
2: "two",
}
return switcher.get(argument, "nothing")

這段代碼類似於:

Python

1
2
3
4
5
6
7
8
9
10
11
12

function(argument){
switch(argument) {
case 0:
return "zero";
case 1:
return "one";
case 2:
return "two";
default:
return "nothing";
};
};

Python 代碼通常比處理 case 的標准方法更為簡短,也可以說它更難理解。當我初次使用 Python 時,感覺很奇怪並且心煩意亂。而隨著時間的推移,在 switch 中使用字典的 key 來做標識符變得越來越習以為常。
函數的字典映射
在 Python 中字典映射也可以包含函數或者 lambda 表達式:

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

def zero():
return "zero"

def one():
return "one"

def numbers_to_functions_to_strings(argument):
switcher = {
0: zero,
1: one,
2: lambda: "two",
}
# Get the function from switcher dictionary
func = switcher.get(argument, lambda: "nothing")
# Execute the function
return func()

雖然 zero 和 one 中的代碼很簡單,但是很多 Python 程序使用這樣的字典映射來調度復雜的流程。
類的調度方法
如果在一個類中,不確定要使用哪種方法,可以用一個調度方法在運行的時候來確定。

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

class Switcher(object):
def numbers_to_methods_to_strings(self, argument):
"""Dispatch method"""
# prefix the method_name with 'number_' because method names
# cannot begin with an integer.
method_name = 'number_' + str(argument)
# Get the method from 'self'. Default to a lambda.
method = getattr(self, method_name, lambda: "nothing")
# Call the method as we return it
return method()

def number_0(self):
return "zero"

def number_1(self):
return "one"

def number_2(self):
return "two"

很靈活,對吧?
官方說明
官方的解釋說,「用if... elif... elif... else序列很容易來實現 switch / case 語句」。而且可以使用函數字典映射和類的調度方法。
可以說官方的說明並沒有解釋什麼,只是給出了解決方案。換句話說,沒有回答為什麼。我認為其實官方真正想說的是:「Python 不需要 switch / case 語句」。
真的是這樣嗎?
是的。但是還有別的原因。我聽牛人說過,在代碼中 switch/case 語句真的很難調試。
就我個人而言,我發現當運行到大量嵌套的用作代碼分支映射的字典里,上述說法就站不住腳了。想想吧,一個超過100條語句的嵌套字典,和一個嵌套100個以上 case 的 switch/case 代碼塊一樣,都是難以調試的。
字典映射運行更快?
Python 沒有 case 語句,使用其它語言的衡量標準是沒有意義的,因為在某種語言中運行更快並不意味著在另一種語言中也一樣。讓我們繼續。
Python 實現方法的顯著優點
有時候我會遇到 Python 的實現方法比 switch/case 語句更好用的情況,例如在運行的時候,需要從映射里添加或者刪除一些潛在的選項。每當這時,多年來使用字典映射和調度方法的實踐讓我受益匪淺。現在我覺得,我再也無法回到依賴 switch/case 語句的日子了。
結束語
Python 迫使我積累了很多映射的實踐經驗,對我來說是塞翁失馬,焉知非福。沒有 switch/case 語句可用的約束,促使我想到了可能不會用來開發的方法和主意。
有意或無意中,Python 沒有 switch/case 語句已成為一種社會建構,並讓我成為一個更優秀的程序員。
綜上所述,所以我認為這種意外的社會構建解釋比官方的「用這個來代替」的說明要好得多。

④ 在python中沒有switch-case語句

開發者認為switch case語句不好,反正也可以用if else來做乾脆就不支持了

熱點內容
雲伺服器歷史演進順序 發布:2025-01-24 09:36:58 瀏覽:739
研究ftp的意義 發布:2025-01-24 09:31:22 瀏覽:253
聯想安卓升級包在哪裡下載 發布:2025-01-24 09:15:20 瀏覽:591
認票的演算法 發布:2025-01-24 09:00:45 瀏覽:927
android調用列印機 發布:2025-01-24 09:00:32 瀏覽:808
網易版我的世界伺服器如何 發布:2025-01-24 08:55:47 瀏覽:968
編譯器鼻祖 發布:2025-01-24 08:54:11 瀏覽:844
如何用安卓編譯項目 發布:2025-01-24 08:30:46 瀏覽:863
計算機同時輸出和存儲設備的區別 發布:2025-01-24 08:29:21 瀏覽:581
食物語上傳 發布:2025-01-24 07:58:44 瀏覽:754