轉載:http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246121c35b8fd7c714c428896207a52ef0f07bbae616f615466e4c096c957d9bb92282b8d27203541c6171d9152e9911b79d620e118baef5fbcfcab6fcf&p=882a9643d58512a05beace375744cf20&newp=8564c237a4904eac5fbd9b7d0b158c3e5c5bc4387ebad1137c&user=baidu&fm=sc&query=python+partition&qid=ff4e5bcf244c9d94&p1=2
在2.5版中新增加了一個叫partition的函數,它可以做什麼呢?舉一個小例子:
>>> ‘http://www.donews.net/limodou’.partition(‘://’)
(‘http’, ‘://’, ‘www.donews.net/limodou’)
>>> ‘file:/a.html’.partition(‘://’)
(‘file:/a.html’, ”, ”)
從第一個例子可以看出,它用來根據指定的分隔字元將字串進行分割,如果字串包含指定的分隔字元,則返回一個3元的tuple,第一個為分隔字元左邊的子串,第二個為分隔字元本身,第三個為分隔字元右邊的子串。第二個例子說明,如果找不到指定的分隔字元,則返回仍然是一個3元的tuple,第一個為整個字串,第二和第三個為空白串。
那麼有人要問,它與split(sep, 1)有什麼區別呢?首先split返回的可能不是固定長度的傳回值,它返回的是一個list,如果找到,則返回一個2元list,如果沒找到,則返回一個1元的list,如:
>>> ‘a.b.c’.split(‘,’, 1)
['a.b.c']
>>> ‘a.b.c’.split(‘.’, 1)
['a', 'b.c']
同時在找到的情況下,它並不返回分隔字元。
在某些情況下partition(sep)和rpartition(sep)(從右向左匹配)與split(sep, 1)和rsplit(sep, 1)的功能是類似的。不過partition其實是為了替換find,index而產生的,並不是為了替換split而產生的。在許多情況下,我們需要先通過find來找到一個位置,再進行分割。而使用partition就方便得多。如:
>>> a = ‘http://www.donews.net’
>>> pos = a.find(‘://’)
>>> if pos > -1:
… print a[:pos], a[pos+1:]
http www.donews.net
而使用partition:
>>> a = ‘http://www.donews.net’
>>> left, sep, right = a.partition(‘://’)
>>> print left, right
http www.donews.net
是不是簡單一些呢。
同時在2.5版中,startswith和endswith有變化,它的第一個參數可以是一個tuple了。這樣用在判斷幾種情況的時候非常方便。比如要判斷檔案名稱尾碼,原來只支援一個值時,可能要先拆分,再判斷,用不上endswith,如:
>>> a = ‘a.gif’
>>> import os.path
>>> ext = os.path.splitext(a)[1]
>>> if ext in ['.gif', '.png', '.bmp']:
… print ‘found’
…
found
而現在可以:
>>> a = ‘a.gif’
>>> if a.endswith((‘.gif’, ‘png’, ‘.bmp’)):
… print ‘found’
…
found
是不是簡單多了。注意,上面的tuple我換成list就是不行,看來是強制的。