Python中switch Case文法實現

來源:互聯網
上載者:User

 

其他語言中,switch語句大概是這樣的
 
switch (var)
{
    case value1: do_some_stuff1();
    case value2: do_some_stuff2();
    ...
    case valueN: do_some_stuffN();
    default: do_default_stuff();
}
 
而python本身沒有switch語句,解決方案有以下3種:
 
A.使用dictionary

values = {
           value1: do_some_stuff1,
           value2: do_some_stuff2,
           ...
           valueN: do_some_stuffN,
         }
values.get(var, do_default_stuff)()
 
B.使用lambda

result = {
  'a': lambda x: x * 5,
  'b': lambda x: x + 7,
  'c': lambda x: x - 2
}[value](x)
 
C.Brian Beck提供了一個類 switch 來實現其他語言中switch的功能
http://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.
 
---------------------------------------------------------------------------------------
擷取網站類型例子:


import sys
from urllib.parse import urlparse
 
def getWebType(url):
    
    r = urlparse(url)
 
    urlDomain = r.netloc
    urlPrefix = urlDomain.split('.')[0]
    
    def www():
        return "www"
    def blog():
        return "blog部落格"
    def bbs():
        return "BBS論壇"
    def tieba():
        return "tieba貼吧"
    def wiki():
        return "wiki維基"
    def baike():
        return "baike百科"
    def img():
        return "img圖片"
    def ask():
        return "ask問答"
    def other():
        return "other"
 
    web ={
        "www":www,
        "bbs":bbs,
        "wiki":wiki,
        "baike":baike,
        "tieba":tieba,
        "iask":ask,
        "ask":ask,
        "img":img,
        "image":img,
        }
    return web.get(urlPrefix,other)()
 
url = 'http://www.111cn.net'
webtype = getWebType(url)
print(webtype)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.