Python 進(jìn)階(下)

1本砰、如何調(diào)整字符串中文本的格式碴裙?

方法:使用 re.sub 
In [113]: import re
In [111]: day = '2017-07-24'
In [115]: re.sub('(\d{4})-(\d{2})-(\d{2})',r'\2/\3/\1',day)
Out[115]: '07/24/2017'

2、如何將多個小字符串拼接成一個大字符串点额?

方法一:使用 “+” 操作符
In [118]: s = ['sdfdsfs','sdfewv','cvxbxcz','yetruywow'] 
In [119]: string = ''                                    
In [120]: for st in s:                                   
     ...:     string+=st                                 
     ...:     print string
sdfdsfs                                                  
sdfdsfssdfewv                                            
sdfdsfssdfewvcvxbxcz                                     
sdfdsfssdfewvcvxbxczyetruywow  # 此方法會有較大的內(nèi)存消耗
方法二:使用 str.join 
In [118]: s = ['sdfdsfs','sdfewv','cvxbxcz','yetruywow']
In [121]: ''.join(s)
Out[121]: 'sdfdsfssdfewvcvxbxczyetruywow'
In [122]: s1 = ['dsd','adev',6545,7711,'ewrewc']
In [123]: ''.join((str(x) for x in s1)) # 對有數(shù)字的列表進(jìn)行處理
Out[123]: 'dsdadev65457711ewrewc'

3舔株、如何對字符串進(jìn)行左、右还棱、居中對齊载慈?

方法一:使用 str.ljust,str.rjust,str.center 
In [124]: s = 'going'
In [125]: s.ljust(20,'-')
Out[125]: 'going---------------'
In [126]: s.rjust(20,'-')
Out[126]: '---------------going'
In [127]: s.center(20,'-')
Out[127]: '-------going--------'
In [133]: d = {'housename':'marryCenter','width':30,'height':20.55,'long':30}
In [137]: for k in d:
     ...:     print k.ljust(max(map(len,d.keys()))),':',d[k]
width     : 30
housename : marryCenter
long      : 30
height    : 20.55
方法二:使用 format 
In [130]: format(s,'<20')
Out[130]: 'going               '
In [131]: format(s,'>20')
Out[131]: '               going'
In [132]: format(s,'^20')
Out[132]: '       going        '

4、如何去掉字符串中不需要的字符珍手?

方法一:使用 strip 
In [145]: s = '///abc*****'
In [148]: s.strip('/*')
Out[148]: 'abc'
方法二:切片拼接
In [149]: s = 'carry?me'
In [151]: s[:5]+s[6:]
Out[151]: 'carryme'
方法三:使用 str.replace 
In [152]: s = 'sweep\nhouse\n'
In [154]: s.replace('\n','')
Out[154]: 'sweephouse'
方法四:使用 re.sub
In [158]: s = 'oh\tmy\ngod'
In [159]: re.sub('[\t\n]','',s)
Out[159]: 'ohmygod'
方法五:使用 str.translate
In [165]: s = 'not\na\tfellower\r'
In [167]: s.translate(None,'\t\r\n')
Out[167]: 'notafellower'

5办铡、如何派生內(nèi)置不可變類型并修改實(shí)例化行為?

方法:實(shí)現(xiàn) __new__ 方法 
例子:將列表中的數(shù)字篩選出來琳要。
In [6]: class IntTuple(tuple):
   ...:     def __new__(cls,iterable):
   ...:         l = (x for x in iterable if isinstance(x,int))
   ...:         return super(IntTuple,cls).__new__(cls,l)
   ...:     def __init__(self,iterable):
   ...:         super(IntTuple,self).__init__(iterable)
In [7]: t = IntTuple([1,0,-1,7,'HAH'])   
In [8]: print t                          
(1, 0, -1, 7)
tips:實(shí)例由內(nèi)置方法__new__創(chuàng)建寡具,所以修改__new__方法就可實(shí)現(xiàn)新型元組。

6稚补、如何為創(chuàng)建大量實(shí)例節(jié)省內(nèi)存童叠?

方法:定義類的__slot__屬性
例子:定義一個學(xué)生類的兩種方法
In [12]: class Student1(object):
    ...:     def __init__(self,mid,name,age,sex):
    ...:         self.mid = mid
    ...:         self.name = name
    ...:         self.age = age
    ...:         self.sex = sex
In [13]: class Student2(object):   # 多了一個__slots__屬性
    ...:     __slots__ = ['mid','name','age','sex']
    ...:     def __init__(self,mid,name,age,sex):
    ...:         self.mid = mid
    ...:         self.name = name
    ...:         self.age = age
    ...:         self.sex = sex
In [14]: s1 = Student1('01','kim','20','male')
In [16]: s2 = Student2('01','kim','20','male')
In [21]: set(dir(s1)) - set(dir(s2)) 
Out[21]: {'__dict__', '__weakref__'}# Student1比Student2多出兩個屬性,所以內(nèi)存占用方面會比較大
In [23]: s1.email = '123@mail.com'  # Student1支持動態(tài)綁定
In [24]: s1.__dict__
Out[24]:
{'age': '20',
 'email': '123@mail.com',
 'mid': '01',
 'name': 'kim',
 'sex': 'male'}
In [28]: s2.email = '123@mail.com'  # Student2不支持動態(tài)綁定
AttributeError: 'Student2' object has no attribute 'email'
tips:__slots__屬性可以節(jié)省__dict__屬性课幕,并且不支持動態(tài)綁定厦坛,從而達(dá)到減少內(nèi)存開銷的目的。

7乍惊、如何讓類支持比較操作杜秸?

方法一:類內(nèi)部實(shí)現(xiàn)__lt__,__le__,__gt__,__ge__,__eq__, __ne__
In [36]: class Rectangle(object):
    ...:     def __init__(self,width,height):
    ...:         self.width = width
    ...:         self.height = height
    ...:     def area(self):
    ...:         return self.width*self.height
    ...:     def __gt__(self,obj):  # 大于
    ...:         print '__gt__'
    ...:         return self.area() > obj.area()
    ...:     def __eq__(self,obj):  # 等于
    ...:         print '__eq__'
    ...:         return self.area() == obj.area()
In [37]: r1 = Rectangle(5,5)
In [38]: r2 = Rectangle(4,6)
In [39]: r1 > r2
__gt__
Out[39]: True 
In [40]: r1 == r2
__eq__
Out[40]: False
方法二:使用 total_ordering 簡化
In [43]: from functools import total_ordering        
In [44]: @total_ordering                             
    ...: class Rectangle(object):                    
    ...:     def __init__(self,width,height):        
    ...:         self.width = width                  
    ...:         self.height = height                
    ...:     def area(self):                         
    ...:         return self.width*self.height       
    ...:     def __lt__(self,obj):    # 小于           
    ...:         print '__lt__'                      
    ...:         return self.area() < obj.area()     
    ...:     def __eq__(self,obj):     # 等于              
    ...:         print '__eq__'                      
    ...:         return self.area() == obj.area()
In [45]: r1 = Rectangle(5,6)                         
In [46]: r2 = Rectangle(3,9)                         
In [47]: r1 > r2   # 可以使用大于
__lt__                                               
__eq__                                               
Out[47]: True 
tips:使用 @total_ordering 修飾,可以根據(jù)給出的兩個運(yùn)算符進(jìn)行推導(dǎo)润绎。
方法二升級:定義一個基類支持多類型比較
In [48]: from abc import ABCMeta,abstractmethod           
    ...: @total_ordering                                  
    ...: class Shape(object):                             
    ...:     @abstractmethod      #子類必須實(shí)現(xiàn)的方法
    ...:     def area(self):                              
    ...:         pass                                     
    ...:     def __lt__(self,obj):                        
    ...:         print '__lt__'                           
    ...:         if not isinstance(obj,Shape):#判斷類型是否有誤
    ...:             raise TypeError('obj is not Shape!') 
    ...:         return self.area() < obj.area()          
    ...:     def __eq__(self,obj):                        
    ...:         print '__eq__'                           
    ...:         if not isinstance(obj,Shape):            
    ...:             raise TypeError('obj is not Shape!') 
    ...:         return self.area() == obj.area() 
In [49]: class Rectangle(Shape):                         
    ...:     def __init__(self,width,height):            
    ...:         self.width = width                      
    ...:         self.height = height                    
    ...:     def area(self):                             
    ...:         return self.width*self.height           
In [50]: class Circle(Shape):                            
    ...:     def __init__(self,r):                       
    ...:         self.r = r                              
    ...:     def area(self):                             
    ...:         return self.r**2*3.14                   
In [51]: r1 = Rectangle(9,5)                             
In [52]: c1 = Circle(4)
In [53]: print r1 > c1                                   
__lt__                                                   
False  
tips:通過定義基類撬碟,可以比較多種類的面積大小诞挨,就達(dá)到簡化程序的目的。

8小作、如何在一個 for 語句中迭代多個可迭代對象亭姥?

方法一:zip 函數(shù)進(jìn)行并行操作
例子:同時迭代4個列表
In [71]: data1 = [randint(60,100) for _ in xrange(10)]
In [72]: data2 = [randint(60,100) for _ in xrange(10)]
In [73]: data3 = [randint(60,100) for _ in xrange(10)]
In [75]: data4 = [randint(60,100) for _ in xrange(10)]
In [74]: for x,y,z,r in zip(data1,data2,data3,data4):# 解包
    ...:     total = x+y+z+r  
    ...:     print total
198
238
234
235
...
方法二:使用 chain 進(jìn)行串行操作
例子:數(shù)據(jù)同上,統(tǒng)計大于80的項(xiàng)
In [78]: from itertools import chain
In [79]: count = 0 
In [81]: for s in chain(data1,data2,data3,data4):
    ...:     if s>80:
    ...:         count += 1
    ...:
In [82]: count
Out[82]: 17
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末顾稀,一起剝皮案震驚了整個濱河市达罗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌静秆,老刑警劉巖粮揉,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異抚笔,居然都是意外死亡扶认,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門殊橙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辐宾,“玉大人,你說我怎么就攤上這事膨蛮〉疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵敞葛,是天一觀的道長誉察。 經(jīng)常有香客問我,道長惹谐,這世上最難降的妖魔是什么持偏? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮氨肌,結(jié)果婚禮上鸿秆,老公的妹妹穿的比我還像新娘。我一直安慰自己怎囚,他們只是感情好谬莹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著桩了,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埠戳。 梳的紋絲不亂的頭發(fā)上井誉,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音整胃,去河邊找鬼颗圣。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的在岂。 我是一名探鬼主播奔则,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔽午!你這毒婦竟也來了易茬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤及老,失蹤者是張志新(化名)和其女友劉穎抽莱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骄恶,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡食铐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僧鲁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虐呻。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寞秃,靈堂內(nèi)的尸體忽然破棺而出斟叼,到底是詐尸還是另有隱情,我是刑警寧澤蜕该,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布犁柜,位于F島的核電站,受9級特大地震影響堂淡,放射性物質(zhì)發(fā)生泄漏馋缅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一绢淀、第九天 我趴在偏房一處隱蔽的房頂上張望萤悴。 院中可真熱鬧,春花似錦皆的、人聲如沸覆履。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽硝全。三九已至,卻和暖如春楞抡,著一層夾襖步出監(jiān)牢的瞬間伟众,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工召廷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凳厢,地道東北人账胧。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像先紫,于是被迫代替她去往敵國和親治泥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容