python之路告別枯燥60秒學(xué)會(huì)一個(gè)小例子系統(tǒng)學(xué)習(xí)Python從入門到_第1頁(yè)
python之路告別枯燥60秒學(xué)會(huì)一個(gè)小例子系統(tǒng)學(xué)習(xí)Python從入門到_第2頁(yè)
python之路告別枯燥60秒學(xué)會(huì)一個(gè)小例子系統(tǒng)學(xué)習(xí)Python從入門到_第3頁(yè)
python之路告別枯燥60秒學(xué)會(huì)一個(gè)小例子系統(tǒng)學(xué)習(xí)Python從入門到_第4頁(yè)
python之路告別枯燥60秒學(xué)會(huì)一個(gè)小例子系統(tǒng)學(xué)習(xí)Python從入門到_第5頁(yè)
已閱讀5頁(yè),還剩215頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

個(gè)例子感受Pytho之美|一、Pyto基礎(chǔ)二、Pytho字符串和正則|三、Pytho文件和日期四、Python三大利器|五、Python繪圖|六、Python之坑|七、Python第包|八、機(jī)器學(xué)習(xí)和深度學(xué)必知算法|九、Pytho實(shí)戰(zhàn)十、Panas數(shù)據(jù)分析案例實(shí)戰(zhàn)歡迎關(guān)注《Python小例子》,與作者取得交一行代碼交換a,baa,b=b,[[1,2,3][::-1]#{{**{'a':1,'b':2},**{'c':3}}#{'a':1,'b':2,'c':setset([1,2,2,3,3,3])#{1,2,maxmax(max([[1,2,3],[5,1],[4]],key=lambdav:max(v)))#listlist(range(10,-1,-1))#[10,9,8,7,6,5,4,3,2,1,僅適用Pyto的常用繪圖庫(kù):Matli,就能制作出動(dòng)畫(huà),輔助算法新手基本的排序算法。如下為一個(gè)隨機(jī)序列,使用快速排序算法,由小到大排序的過(guò)程動(dòng)畫(huà)展示:使用turtuletimelinepdpd.pivot_table(df,index=['Manager','Rep'],values=['Price'],Python機(jī)器學(xué)習(xí)庫(kù)Sklearn功能強(qiáng)大,接口易用,包括數(shù)據(jù)預(yù)處理模塊、回歸、分類、聚類、降維fromsklearnfromsklearn.clusterimportKMeansKMeans(n_clusters=3)Python-PyQt設(shè)計(jì)器開(kāi)發(fā)UI,能夠迅速通過(guò)拖動(dòng)組建搭建出來(lái),使用方便。如下為使用Pyt總之,在這個(gè)Python,你都能學(xué)到關(guān)于使用Python干活的方方面面的有趣的小例子,歡迎關(guān)Python基礎(chǔ)主要總結(jié)Python常用內(nèi)置函數(shù);Python獨(dú)有的語(yǔ)法特性、nonlocal,global等;內(nèi)置數(shù)據(jù)結(jié)構(gòu)包括:列表(list),字典(dict),集合(set),元組(tuple)以及相關(guān)的高級(jí)模塊collections中的Counter,namedtuple,defauict,heapq模塊。目前共有90個(gè)小例子。InIn[1]:abs(-Out[1]:接受一個(gè)迭代器,如果迭代器的所有元素都為真,那么返回True,否則返回InIn[2]:Out[2]:In[3]:Out[3]:接受一個(gè)迭代器,如果迭代器里至少有個(gè)元素為真,那么返回True,否則返回InIn[4]:Out[4]:In[5]:Out[5]:ascii調(diào)用對(duì)象的repr()InIn[1]:classinitself.id=idreprreturn'id='+self.id+',name=In[2]:xiaoming=In[3]:print(xiaoming)id=001,name=xiaomingIn[4]:Out[4]:'id=001,name=將轉(zhuǎn)換為InIn[1]:Out[1]:將轉(zhuǎn)換為InIn[1]:Out[1]:將轉(zhuǎn)換為InIn[1]:Out[1]:測(cè)試一個(gè)對(duì)象是True,還是InIn[1]:Out[1]:Out[2]:FalseIn[3]:Out[3]:將一個(gè)轉(zhuǎn)換成InIn[1]:s=In[2]:bytes(s,encoding='utf-8')Out[2]:b'apple'、等轉(zhuǎn)換為InIn[1]:i=In[2]:Out[2]:callable對(duì)象,比如函數(shù)str用的,但是例子4中xiaoming

InIn[1]:callable(str)Out[1]:TrueIn[2]:callable(int)Out[2]:TrueIn[3]:Out[3]:id=001,name=In[4]:callable(xiaoming)Out[4]:FalseIn[1]:classIn[2]:t=In[1]:classIn[2]:t=In[3]:Icanbemynameisinitself.id=idreprreturn'id='+self.id+',name=callprint('Icanbeprint(f'mynameis十轉(zhuǎn)查看十進(jìn)制整數(shù)對(duì)應(yīng)的ASCIIInIn[1]:Out[1]:ASCIIASCIIInIn[1]:Out[1]:

裝飾器對(duì)應(yīng)的函數(shù)不需要實(shí)例化,不需要self的clsinitself.id=id=namereprreturn'id='+self.id+',name=InIn[1]:classdeff(cls):InIn[1]:s=In[2]:r=compile(s,"<string>",In[3]:Out[3]:<codeobject<module>atDE75D0,file"<string>",lineIn[4]:InIn[1]:Out[1]:InIn[1]:In[2]:hasattr(xiaoming,'id')Out[2]:FalseInIn[1]:Out[1]:In[2]:dict(a='a',b='b')Out[2]:{'a':'a','b':'b'}In[3]:Out[3]:{'a':1,'b':In[4]:Out[4]:{'a':1,'b':不帶參數(shù)時(shí)返回當(dāng)前范圍內(nèi)的變量、方法和定義的類型列表;帶參數(shù)時(shí)返回參數(shù)InIn[96]:dir(xiaoming)['class','delattr','dict','dir'doc'eq'format'ge'getattribute','gt','hash'init'init_subclass','le','lt'module'ne'new'reduce','reduce_ex','repr','setattr','sizeof','str','subclasshook','weakref',InIn[1]:Out[1]:(3,InIn[1]:s=...:fori,vin 123將字符串strInIn[1]:s="1+3...:Out[1]:InIn[1]:importIn[2]:a=In[3]:sys.getsizeof(a)#占用240Out[3]:在函數(shù)中設(shè)定過(guò)濾條件,迭代元素,保留返回值為TrueInIn[1]:fil=filter(lambdax:In[2]:Out[2]:[11,45,InIn[1]:Out[1]:如果不能轉(zhuǎn)化為浮點(diǎn)數(shù),則會(huì)報(bào)ValueErrorInIn[2]:Traceback(mostrecentcall<ipython-input-11-99859da4e72c>in>1ValueError:couldnotconvertstringtofloat:格式化輸出字符串 In[104]:print("iam{0},age{1}".format("tom",18))In[104]:print("iam{0},age{1}".format("tom",18))iamtom,age1835數(shù)字補(bǔ)零(填充左邊,寬度為5數(shù)字補(bǔ)x(填充右邊,寬度為數(shù)字補(bǔ)x(填充右邊,寬度為'(默認(rèn),寬度為'18左對(duì)齊(寬度為'18中間對(duì)齊(寬度為InIn[1]:Out[1]:frozenset({1,2,setaddpopInIn[1]:classinitself.id=idreprreturn'id='+self.id+',name=In[2]:xiaoming=In[3]:getattr(xiaoming,'name')#獲取xiaoming這個(gè)實(shí)例的nameOut[3]:InIn[1]:classinitself.id=idreprreturn'id='+self.id+',name=In[2]:xiaoming=Student(id='001',name='xiaoming')In[3]:hasattr(xiaoming,'name')Out[3]:In[4]:hasattr(xiaoming,'address')Out[4]:Falselist,dict,set等可變對(duì)象都是不In[2]:Traceback(mostrecentcall<ipython-input-32-fb5b1b1d9906>in>1TypeError:unhashabletype:InIn[1]:HelponStudentinmodulemainclass|||||||||||||Methodsdefinedinit(self,id,reprDatadescriptorsdefineddictionaryforinstancevariables(iflistofweakreferencestotheobject(ifInIn[1]:id(xiaoming)Out[1]:int(x,base=10),x可能為字符串或數(shù)值,將x轉(zhuǎn)換為一個(gè)普通整數(shù)。如果參數(shù)是字符串,那么它可能包InIn[1]:Out[1]:InIn[1]:classinitself.id=idreprreturn'id='+self.id+',name=In[2]:xiaoming=In[3]:isinstance(xiaoming,Student)Out[3]:TrueInIn[1]:class def def In[2]:issubclass(undergraduate,Student)Out[2]:TrueIn[3]:issubclass(object,Student)Out[3]:FalseIn[4]:issubclass(Student,object)Out[4]:TrueInIn[1]:issubclass(int,(int,float))Out[1]:TrueIn[1]:classInIn[1]:classIn[2]:t=In[3]:t()#因?yàn)閷?shí)現(xiàn)了call,所以t iscalled,whichwouldreturn1Out[3]:1In[4]:foreinTestIter():#因?yàn)閷?shí)現(xiàn)了iter方法,所以t iteris132345InIn[1]:lst=In[2]:foriin 135initcall(self):#定義了callitem=print("calliscalled,fowhichwouldreturniter(self):#支持迭代協(xié)議(即定義有iter()函數(shù)print("iterisreturnobjectInIn[1]:o=Out[2]:objectInIn[1]:fo=open('D:/a.txt',mode='r',encoding='utf-In[2]:Out[2]:'\ufefflifeisnotsolong,\nIusePython mode文本模式(默認(rèn)打開(kāi)用于更新(與寫(xiě)入InIn[1]:pow(3,2,Out[1]:InIn[5]:lst=In[6]:[1,3,In[7]:print(f'lst:{lst}')lst:[1,3,5]In[8]:lst:[1,3,In[9]:lst:[1,3,返回propertyclassclassdefdefinit(self):self._x=Nonedefgetx(self):returnself._xdefsetx(self,value):self._x=valuedel#使用property類創(chuàng)建propertyx=property(getx,setx,delx,"I'mthe'x'classclassdefinit(self):self._x=returndefx(self,value):self._x=del1)range(stop)2)range(start,InIn[1]:Out[1]:range(0,In[2]:Out[2]:range(0,InIn[1]:rev=In[2]:foriin 13241四舍五入,ndigitsInIn[11]:Out[11]:,In[12]:Out[12]:InIn[159]:a=In[160]:Out[160]:{1,2,3,classslice(start,stop[,返回一個(gè)表示由range(start,stop,step)所指定索引集的slice對(duì)象,它讓代碼可讀性、可性變好InIn[1]:a=In[2]:my_slice_meaning=In[3]:Out[3]:[1,2,InIn[1]:a=In[2]:Out[2]:[4,3,2,1,In[3]:a=...:In[4]:sorted(a,key=lambdax:x['age'],reverse=False)[{'name':'xiaoming','age':18,'gender':{'name':'xiaohong','age':20,'gender':InIn[181]:a=In[182]:Out[182]:In[185]:sum(a,10)#求和的初始值為10Out[185]:21InIn[16]:i_am_list=In[17]:i_am_tuple=tuple(i_am_list)In[18]:i_am_tupleOut[18]:(1,3,classtype(name,bases,傳入一個(gè)參數(shù)時(shí),返回objectInIn[1]:classinitself.id=idreprreturn'id='+self.id+',name=In[2]:xiaoming=Student(id='001',name='xiaoming')In[3]:type(xiaoming)Out[3]:mainIn[4]:type(tuple())Out[4]:tupleInIn[1]:x=In[2]:y=In[3]:Out[3]:[(4,3),(5,2),(6,In[4]:a=In[5]:b=list('abcde')In[6]:bOut[6]:['a','b','c','d',In[7]:[str(y)+str(x)forx,yinzip(a,b)]Out[7]:['a0','b1','c2','d3','e4']nonlocal常用于函數(shù)嵌套中,變量i為非局部變量;如果不,i+=1表明i為函數(shù)wrapper內(nèi)的局部變量,因?yàn)樵趇+=1(reference)時(shí),i未被,所以會(huì)報(bào)unreferencedvariable的錯(cuò)誤。defdefexcepter(f):i=0t1=time.time()defwrapper():exceptExceptionase:nonlocalii+=print(f'{e.args[0]}:{i}')t2=time.time()ifi==print(f'spendingtime:{round(t2-t1,2)}')returnwrapper先回答為什么要有g(shù)lobal,一個(gè)變量被多個(gè)函數(shù),想讓全局變量被所有函數(shù)共享。有的伙伴可能會(huì)ii=5deff和g兩個(gè)函數(shù)都能共享變量i,程序沒(méi)有報(bào)錯(cuò),所以他們依然不明白為什么要用global但是,如果要有個(gè)函數(shù)對(duì)i遞增,這樣defdefi+=此時(shí)執(zhí)行程序,bang,UnboundLocalError,原來(lái)編譯器在解釋i+=1時(shí)會(huì)把i解析為函數(shù)h()內(nèi)的局部變量,很顯然在此函數(shù)內(nèi),編譯器找不到對(duì)變量i的定義,所以會(huì)報(bào)錯(cuò)。global就是為解決此問(wèn)題而被提出,在函數(shù)h內(nèi),顯示地告訴編譯器i為全局變量,然后編譯器會(huì)在函數(shù)外面尋找i的定義,執(zhí)行完i+=1后,i還為全局變量,值加1:ii=0i+=1ii=print(1<i<3)#Falseprint(1<i<=3)#fromfromoperatorimportdefcalculator(a,b,k):return{'+':'-':'*':'/':'**':}[k](a,calculator(1,2,'+')#calculator(3,4,'**')#fromfromoperatorimport(add,defadd_or_sub(a,b,return(addifoper=='+'elsesub)(a,add_or_sub(1,2,'-')#-defdefswap(a,b):returnb,print(swap(1,0))#defdefscore_mean(lst):returnlst=[9.1,9.0,8.1,9.7,19,8.2,score_mean(lst)#7*8=567*9=638*9=72一共有10行,第i行的第j列等于:j*i,ij根據(jù)例子分析forforiinforjinrange(1,i+1):如何完全展開(kāi)成一維的。這個(gè)小例子實(shí)現(xiàn)的flatten是遞歸版,兩個(gè)參數(shù)分別表示帶展開(kāi)的數(shù)組,輸出fromfromcollections.abcimportdefflatten(lst,out_lst=None):ifout_lstisNone:foriinlst:ifisinstance(i, ble):#判斷iflatten(i,out_lst)# return4,numpy里的flattenimportimportb=numpy.array([[1,2,3],[4,5]])array([list([1,2,3]),list([4,5])],fromfrommathimportdefdivide(lst,size):ifsize<=0:returnreturn[lst[i*size:(i+1)*size]foriinrange(0,ceil(len(lst)/r=divide([1,3,5,7,9],print(r)#[[1,3],[5,7],r=divide([1,3,5,7,9],print(r)#[[1,3,5,7,rr=divide([1,3,5,7,9],-print(r)#[[1,3,5,7,defdefreturnlist(filter(bool,r=filter_false([None,0,False,'',[],'ok',[1,2]])print(r)#['ok',[1,2]]defdefreturnmax(*lst,key=lambdav:r=max_length([1,2,3],[4,5,6,7],print(f'更長(zhǎng)的列表是{r}')#[4,5,6,r=max_length([1,2,3],[4,5,6,7],[8,print(f'更長(zhǎng)的列表是{r}')#[4,5,6,defdefreturnmax(lst,default='列表為空',key=lambdav:lst=[1,3,3,2,1,1,r=print(f'{lst}中出現(xiàn)次數(shù)最多的元素為:{r}')#[1,3,3,2,1,1,2]中出現(xiàn)次數(shù)最多的元素defdefreturnmax(max(*lst,key=lambdav:r=max_lists([1,2,3],[6,7,8],[4,print(r)#xx=[1,1,2,2,3,2,3,4,5,y=[1,2,3,4,defdefreverse(lst):returnlst[::-1]r=reverse([1,-2,3,4,1,print(r)#[2,1,4,3,-2,defdefrang(start,stop,start,stop,n=float('%.2f'%start),float('%.2f'%stop),int('%.d'%n)step=(stop-start)/nwhilen>0:start,n=start+step,n-1lst.append(round((start),2))returnrang(1,8,10)#[1.0,1.7,2.4,3.1,3.8,4.5,5.2,5.9,6.6,7.3,defdefbif_by(lst,return[[xforxinlstiff(x)],[xforxinlstifnotrecords=bif_by(records,lambdax:x<80)#[[25,31,34],list(map(lambdax,y:x*y+1,lst1,lst2))###[4,9,16,25,16,13]defdefmax_pairs(dic):returnmax_val=max(map(lambdav:v[1],return[itemforitemindic.items()ifitem[1]==r=max_pairs({'a':-10,'b':5,'c':3,'d':print(r)#[('b',5),('d',defdefmerge_dict(dic1,return{**dic1,**dic2}#python3.5后支持的行代碼實(shí)現(xiàn)合并字典merge_dict({'a':1,'b':2},{'c':3})#{'a':1,'b':2,'c':fromfromheapqimport#返回字典d前ndeftopn_dict(d,returnnlargest(n,d,key=lambdak:topn_dict({'a':10,'b':8,'c':9,'d':10},3)#['a','d',fromfromcollectionsimport#defanagram(str1,returnCounter(str1)==anagram('eleven+two','twelve+one')#True這是 的變位anagram('eleven','twelve')#(1)dic1dic1={'x':1,'y':2dic2={'y':3,'z':4merged1={**dic1,**dic2}#{'x':1,'y':3,'z':修改merged['x']=10,dic1中的x不變,merged是重新生成的一個(gè)新字典但是,ChainMap卻不同,它在內(nèi)部創(chuàng)建了一個(gè)容納這些字典的列表。因此使用ChainMap合并字典,修改merged['x']=10后,dic1中的x值,如下所示:fromfromcollectionsimportChainMapmerged2=ChainMap(dic1,dic2)print(merged2)#ChainMap({'x':1,'y':2},{'y':3,'z':fromfromcollectionsimportPoint=namedtuple('Point',['x','y','z'])#定義名字為Pointlst=[Point(1.5,2,3.0),Point(-0.3,-1.0,2.1),Point(1.3,2.8,-print(lst[0].y-使用sample抽樣,如下例子從100個(gè)樣本中隨機(jī)抽樣10fromfromrandomimportlst=[randint(0,50)for_inrange(100)]print(lst[:5])#[38,19,11,3,6]lst_sample=print(lst_sample)#[33,40,35,49,24,15,48,29,37, fromfromrandomimportlst=[randint(0,50)for_inrange(100)]print(lst[:5])#[50,3,48,1,random模塊中的uniform(a,b)生成[a,b)內(nèi)的一個(gè)隨機(jī)數(shù),如下生成10fromfromrandomimportIn[1]:[(uniform(0,10),uniform(0,10))for_inrange(10)][(9.244361194237328,(8.129267671737324,(9.505278771040661,(3.84320100484284,(6.095385729409376,(8.522913365698605,(8.827829601859406,(1.4749644859469302,(9.005430657826324,(8.700789540392917,random模塊中的gauss(u,sigma)生成均值為u,標(biāo)準(zhǔn)差為sigma的滿足分布的值,如下生成10個(gè)10chain函數(shù)串聯(lián)a和bfromfromitertoolsimporta=b=###1350246InIn[31]:def print('i\'mIn[32]:def print('i\'mIn[33]:i'mlistlist(range(10,-1,-1))#[10,9,8,7,6,5,4,3,2,1,defdeff(a,*b,c=10,**d):默認(rèn)參數(shù)c不能位于可變關(guān)鍵字參數(shù)d后調(diào)用InIn[10]:a:1,b:(2,5),c:10,d:{'width':10,'height':可變位置參數(shù)b實(shí)參后被解析為元組(2,5;而c取得默認(rèn)值10;d被解析為字典再次調(diào)用InIn[11]:f(a=1,c=12)注意觀察參數(shù)a,f(1,也可以f(a=1)其可讀性比第一種更好,建議使用f(a=1)。如果要強(qiáng)制使用f(a=1),需要面添加一個(gè)星號(hào):defdeff(*,a,*b):此時(shí)f(1)TypeError:f()takes0positionalargumentsbut1wasf(a=1才能說(shuō)明前面的*發(fā)揮作用,它變?yōu)橹荒軅魅腙P(guān)鍵字參數(shù),那么如何查看這個(gè)參數(shù)的類型呢?借助n的inspect模塊:InIn[22]:forname,valin 可看到參數(shù)aKEYWORD_ONLY,也就是僅僅為關(guān)鍵字參數(shù)。defdeff(a,*b):InIn[24]:forname,valin 可以看到參數(shù)a使用slice生成關(guān)于蛋糕的序列InIn[1]:cake1=list(range(5,0,-In[2]:b=In[3]:Out[3]:[4,In[4]:Out[4]:[5,4,3,2,InIn[5]:fromrandomimport...:cake2=[randint(1,100)for_in...:#同樣以間隔為2切前10個(gè)元素,得到切片...:d=cake2[1:10:2]In[6]:dOut[6]:[75,33,63,93,你看,我們使用同一種切法,分別切開(kāi)兩個(gè)蛋糕cake1,cake2.后來(lái)發(fā)現(xiàn)這種切法,又拿它去切perfect_cake_slice_way=slice(1,10,2)perfect_cake_slice_way=slice(1,10,2)cake1_slice=cake1[perfect_cake_slice_way]cake2_slice=cake2[perfect_cake_slice_way]In[11]:Out[11]:[4,In[12]:Out[12]:[75,33,63,93,對(duì)于逆向序列切片,slicea=[1,3,5,7,9,0,3,5,7]a=[1,3,5,7,9,0,3,5,7]a_=a[5:1:-1]named_slice=slice(5,1,-1)a_slice=a[named_slice]In[14]:Out[14]:[0,9,7,In[15]:Out[15]:[0,9,7,lambda函數(shù)不太會(huì)用,問(wèn)我能不能解釋一下。比如,下面求這個(gè)lambda函數(shù):defdefreturnmax(*lists,key=lambdav:參數(shù)vlambda函數(shù)有返回值嗎?如果有,返回值是多少?rr=max_len([1,2,3],[4,5,6,7],參數(shù)v的可能取值為*lists,也就 lambdalambdav行代碼夠燒腦,不信試試defdefproduct(*args,pools=[tuple(pool)forpoolinargs]*repeatresult=[[]]forpoolinresult=[x+[y]forxinresultforyinpool]forprodinresult:yieldrtnrtn=product('xyz','12',repeat=3)快去手動(dòng)敲敲,看看輸出啥吧xiaoming,xiaohong 都是學(xué)生,這類群體叫做StudentPythonInIn[36]:class xiaoming,xiaohong xiaomingxiaoming=Student()xiaohong=Student()xiaozhang=創(chuàng)建后,xiaoming 屬性,返回的便是StudentInIn[38]:xiaoming.class main.Student問(wèn)題在于,Student類 屬性,如果有,返回的又是什么InIn[39]:xiaoming.class.class Out[39]:typeStudentStudent類就是一個(gè)對(duì)象,它的類型就是所以,Python中一切皆對(duì)象,類也是對(duì)象Python中,將描 類的類被稱為:元類按照此邏輯延伸,描述元類的類被稱為:元元類,開(kāi)玩笑了~例就叫:類了。真聰明

說(shuō)對(duì)了,type類一定能創(chuàng)建實(shí)例,比 類了InIn[40]:Student=In[41]:StudentOut[41]:main.Student Python的類,因?yàn)橛质菍?duì)象,所以和xiaoming,xiaohong對(duì)象操作相似。支持:InIn[43]:StudentMirror=Student#類直接賦值#In[44]:Student.class_property='class_property'#Out[46]:True元類,確實(shí)使用不是那么多,也許先了解這些,就能應(yīng)付一些場(chǎng)合。就連Python界的都對(duì)象序列化,是指將內(nèi)存中的對(duì)象轉(zhuǎn)化為可或傳輸?shù)倪^(guò)程。很多場(chǎng)景,直接一個(gè)類對(duì)象,傳輸不便。web請(qǐng)求,一般使用json串傳輸。實(shí)際使用中,一般對(duì)類對(duì)象序列化。先創(chuàng)建一個(gè)Studentclassclassdefinit(self,**args):self.ids=args['ids']=args['name']self.address=args['address']xiaoming=Student(ids=1,name='xiaoming',address=' xiaohong=Student(ids=2,name='xiaohong',address= 導(dǎo)入json模塊,調(diào)用dump方法,就會(huì)將列表對(duì)象[xiaoming,xiaohong],序列化到文件importimportwithopen('json.txt','w')asjson.dump([xiaoming,xiaohong],f,default=lambdaobj:obj.dict,ensure_ascii=False,indent=2,sort_keys=True)[[{"address":" "ids":1,"name":{"address":" "ids":2,"name":}]包括基本的字符串操作;高級(jí)字符串操作之正則。目前共有25個(gè)小例子In[1]:[str("java"[i%3*4:]+"python"[i%5*6:]ori)foriinrange(1,15)]InIn[4]:mystr=...:...:...:...:...:...:...:...:...:...:...:...:...:In[5]:','.join(mystr)#Out[5]:defdefreturn(len(mystr.encode('utf-str_byte_len('ilovepython')#13(個(gè)字節(jié))str_byte_len('字符')#6(個(gè)字節(jié))importimportss='ilovepythonverymuch'pat='python'r=re.search(pat,s)print(r.span())#(7,13)ss='山東省濰坊市青州第1中學(xué)高三1班'pat='1'r=re.finditer(pat,s)foriinr:#<re.Matchobject;span=(9,10),match='1'>#<re.Matchobject;span=(14,15),\d匹配數(shù)字[0-ss='共20行代碼運(yùn)行時(shí)間pat=r'\d+'#+表示匹配數(shù)字(\d表示數(shù)字的通用字符)1次或多次r=re.findall(pat,s)#['20','13',ss='共20行代碼運(yùn)行時(shí)間pat=r'\d+\.?\d+'表示匹配小數(shù)點(diǎn)(\.)0次或1次,這種寫(xiě)法有個(gè)小bug,不能匹配到個(gè)位數(shù)的整r=re.findall(pat,s)#['20',#pat=r'\d+\.\d+|\d+'#A|B,匹配A失敗才匹配ss='ThismoduleprovidesregularexpressionmatchingoperationssimilartothosefoundinPerl'pat=r'^[emrt]'#查找以字符e,m,r或tr=re.findall(pat,s)#[],因?yàn)樽址拈_(kāi)頭是字符`T`,不在emrtIN[11]:s2=' formeisguoz re.findall('^[emrt].*',s2)#匹配以e,m,r,t開(kāi)始的字符串,后面是多個(gè)任意字符Out[11]:[' formeisguoz ss='That'pat=r=re.findall(pat,s,re.I)In[22]:rOut[22]:['T',importimportpat pile('\W+')#\Whas_special_chars=pat.search('ed#2@edc')ifhas_special_chars:print(f'strcontainsspecial#strcontainsspecial###再次使用pat正則編譯對(duì)象做匹配again_pattern=pat.findall('guozif'@'inagain_pattern:print('possiblyitiss='ThismoduleprovidesregularexpressionmatchingoperationssimilartothosefoundinPerl'pat=r'\s([a-zA-Z]+)'r=re.findall(pat,s)print(r)#['module','provides','regular','expression','matching','operations','similar','to','those','found','in','Perl']看到提取單詞中未包括第一個(gè)單詞,使用表示前面字符出現(xiàn)0次或1次,但是此字符還有表示貪心或非ss='ThismoduleprovidesregularexpressionmatchingoperationssimilartothosefoundinPerl'pat=r'\s?([a-zA-Z]+)'r=re.findall(pat,s)print(r)#['This','module','provides','regular','expression','matching','operations','similar','to','those','found','in','Perl']使用以上方法分割單詞不是簡(jiǎn)潔的,僅僅是為了演示。分割單詞最簡(jiǎn)單還是使用splitss='ThismoduleprovidesregularexpressionmatchingoperationssimilartothosefoundinPerl'pat=r=print(r)#['This','module','provides','regular','expression','matching','operations','similar','to','those','found','in','Perl']###上面這句話也可直接使用str自帶的splits.split('')####但是,對(duì)于風(fēng)格符更加復(fù)雜的情況 s= module; provides||regular;words=re.split('[,\s;|]+',s)#這樣分隔出來(lái),最后會(huì)有個(gè)空字符串words=[iforiinwordsifmatch,search1)match###mystr=pat= pat.match(mystr)#Nonepat.match(mystr,1)#從位置1處開(kāi)始匹配Out[90]:<re.Matchobject;span=(1,3),2)search函數(shù)searchInIn[91]:mystr=...:pat ...:Out[91]:<re.Matchobject;span=(1,3),sub oopile(r'\d+')#print(m) o opile(r"<div>(.*)</div>")#貪婪模式print(m)#匹配結(jié)果為:僅添加一個(gè)問(wèn)號(hào)),得到結(jié)果完全不同,這是非貪心匹配,通過(guò)這個(gè)例子體會(huì)貪心和非貪心的匹配的print(m)#['graph','math']..^$*前面的原子重復(fù)0次、1?前面的原子重復(fù)0次或者1+前面的原子重復(fù)1{n}前面的原子出現(xiàn)了n{n,}前面的原子至少出現(xiàn)n{n,m}前面的原子出現(xiàn)次數(shù)介于n-m()分組,\s\s\w匹配任意字母/數(shù)字/\W和小寫(xiě)w相反,匹配任意字母/數(shù)字/\d\D匹配除了十進(jìn)制數(shù)以外的值[0-9]匹配個(gè)0-9之間的數(shù)字[a-z]匹配小寫(xiě)英文字母[A-Z]安全要求:1)要求為6到20位;2)只包含英文字母和數(shù)patpatpile(r'\w{6,20}')#這是錯(cuò)誤的,因?yàn)閈w#使用最穩(wěn)的方法:\da-zA-Z滿足` pat= 選用最的fullmatch方法,查看是否整個(gè)字符串都匹配patpat.fullmatch('qaz12')#返回None,長(zhǎng)度小于6pat.fullmatch('qaz12wsxedcrfvtgb67890942234343434'None長(zhǎng)度大于22pat.fullmatch('qaz_231')#None含有下劃線Out[4]:<re.Matchobject;span=(0,10),爬取首頁(yè)標(biāo)importimportfromurllibimport#爬蟲(chóng)爬 首頁(yè)內(nèi)#分析網(wǎng)頁(yè),print(result)<re.Matchobject;span=(1358,1382),下,你就知道result.group()下,你就知道批量轉(zhuǎn)化為駝峰格式##s指匹配:t\n\r\f\v]#A|B:表示匹配A串或B串#re.sub(pattern,newchar, ##title():# oworld'.title()#o##print(re.sub(r"\s|_|","","Hes=re.sub(r"(\s|_|-)+"," ce("")#結(jié)果:SomeDatabaseFieldName##s=s[0].lower()+s[1:]#importimportredefcamel(s):s=re.sub(r"(\s|_|-)+","",s).title().re ce("","")returns[0].lower()+s[1:]defreturn[camel(s)forsin:#['studentId','studentName',fromfromcollectionsimport defis_permutation(str1,ifstr1isNoneorstr2isNone:returnFalseiflen(str1)!=len(str2):returnFalseunq_s1=defauict(int)unq_s2=defauict(int)forc1instr1:unq_s1[c1]+=1forc2instr2:unq_s2[c2]+=returnunq_s1==這個(gè)小例子,使用python內(nèi)置的defau ict,默認(rèn)類型初始化為int,計(jì)數(shù)默次數(shù)都為0.這個(gè)解法 ict:unq_s1,unq_s2,如果相等,就表明str1、str2互為排序詞。rr=is_permutation('nice','cine')print(r)#Truer=is_permutation('','')print(r)#Truer=is_permutation('',None)print(r)#Falser=is_permutation('work','woo')print(r)#False以上就是使用 stringbookbookstring,str1str2str1str2+str2defdefis_rotation(s1:str,s2:str)->bool:ifs1isNoneors2isNone:returniflen(s1)!=len(s2):returnFalsedefis_substring(s1:str,s2:str)->bool:returns1ins2returnis_substring(s1,s2+print(r)#Truer=is_rotation('greatman','maneatgr')print(r)#False^^ *0次,1次或多次表示數(shù)字出現(xiàn)0次,1次或多次*連起來(lái)就求出所有大于1.00.01.0之間的正浮點(diǎn)數(shù),怎么求,干嘛不直接匯總到上面的正則表達(dá)式中呢?這樣寫(xiě)不行嗎:^[0-9]\d*\.\d*$InIn[85]:importIn=pile(r'^[0-InOut[88]:<re.Matchobject;span=(0,5),

竟然匹配到000.2,認(rèn)為它是一個(gè)正浮點(diǎn)數(shù)所以知道為啥要先匹配大于1.00.0到1.0^0\.\d*[1-Python文件IO操作涉及文件讀寫(xiě)操作,獲取文件后綴名,修改后綴名,獲取文件修改時(shí)間,壓縮件,加密Python日期章節(jié),由表示大日期的calendar,datedatetime,timePython希望透過(guò)5個(gè)小例子,幫助你對(duì)多線程模型編程本質(zhì)有些更清晰的認(rèn)識(shí)。一共總結(jié)最常用的26個(gè)關(guān)于文件和時(shí)間處理模塊的例子。importimportfile_ext=os.path.splitext('./data/py/test.py')front,ext=file_extIn[5]:Out[5]:In[6]:extOut[6]:'.py'importimportos創(chuàng)建文件夾def ists=os.path.exists(path)ifnoti defopenfile(filename):f=open(filename)fllist=f.read()returnfllist#返 內(nèi)####wf=open(r"./data/test.txt","w",encoding="utf-8")##af=open(r"./data/test.txt","a",encoding="utf-8")##withwithopen(r"./data/test.txt","w")asf: oworld!")InIn[11]:import...:file_ext=...:ipath,ifile=In[12]:ipathOut[12]:'./data/py'In[13]:ifileOut[13]:'test.py'本例子使用Python的os模塊和argparse模塊,將工作 work_dir下所有后綴名為old_ext的文件修改為后綴名為new_extargparse模塊的主要用法。importimportargparseimportosparser=argparse.ArgumentParser( parser.add_argument('work_dir',metavar='WORK_DIR',type=str,nargs=1, parser.add_argument('old_ext',type=str,nargs=1,help='原來(lái)的后綴')parser.add_argument('new_ext',metavar='NEW_EXT',type=str,nargs=1,help='新的后綴 forfilenameinos.listdir(work_dir):#獲取得到文件后綴split_file=os.path.splitext(filename)file_ext=split_file[1]#定位后綴名為old_extifold_ext==##newfile=split_file[0]+new_ext#實(shí)現(xiàn)重命名操作os.path.join(work_dir,filename),os.path.join(work_dir,newfile))實(shí)現(xiàn)defdefmain():#parser=args=vars(parser.parse_args())#從命令行參數(shù)中依次解析出參數(shù)work_dir=args['work_dir'][0]old_ext=args['old_ext'][0]ifold_ext[0]!='.':old_ext='.'+old_extnew_ext=args['new_ext'][0]ifnew_ext[0]!='.':new_ext='.'+batch_rename(work_dir,old_ext,importimportdefxls_to_xlsx(work_dir): old_ext,new_ext='.xls','.xlsx'forfilenameinos.listdir(work_dir):#split_file=os.path.splitext(filename)file_ext=split_file[1]#定位后綴名為old_extifold_ext==file_ext:#newfile=split_file[0]+new_ext#實(shí)現(xiàn)重命名操作os.path.join(work_dir,filename),os.path.join(work_dir,newfile))##['cut_words.csv',_list.xlsx',_test.docx', _test.xlsx','geo_data.png','iotest.txt','pyside2.md','PySimpleGUI-4.7.1-py3-none-any.whl','test.txt','test_excel.xlsx','ziptest','ziptest.zip']##cnt=withopen(statfile,encoding='utf-8')asf:whilef.readline():cnt+=return##more表示含 defdiff(more,cnt,less):difflist=[]withopen(less,encoding='utf-8')asl:withopen(more,encoding='utf-8')asm:lines=fori,lineinifline.strip()!=m.readline().strip():ifcnt-i>1:difflist.extend(range(i+1,cnt))return[no+1fornoin##返回的結(jié)果行號(hào)從1#list表示fileA和fileBcntA cntB= ifcntA>cntB:returndiff(fileA,cntA,fileB)returndiff(fileB,cntB,fileA)exceptExceptionase:比較兩個(gè)文件A和B\n和空格。file_diff_line_nosififname=='main':importosfileA=o'nicetomeetyou'\fileB="' 'nicetomeetyou'\'yes'"diff=file_diff_line_nos('./testdir/a.txt','./testdir/b.txt')print(diff)#[4,5]關(guān)于文件比較的,實(shí)際上,在Python中有對(duì)應(yīng)模塊difflib,提供其他格式的文件更詳細(xì)的比?ib.html?highlight=di?ib#module-importimportdeffind_file(work_dir,extension='jpg'):lst=[]forfilenameinos.listdir(work_dir):splits=os.path.splitext(filename)ext=splits[1]#拿到擴(kuò)展名ifext=='.'+extension:returnreturnr=find_file('.','md')print(r)#返回所有 ##獲 importfromdatetimeimportprint(f"當(dāng)前時(shí)間:{datetime.now().strftime('%Y-%m-%dH:%M:%S')}")defget_modify_time(indir):forroot,_,filesinos.walk(indir):#循環(huán) 和forfileinabsfile=os.path.join(root,modtime=datetime.fromtimestamp(os.path.getmtime(absfile))now=datetime.now()difftime=now-ifdifftime.days<20:#修改時(shí)間[{modtime.strftime('%Y-%m-%d)#當(dāng)前時(shí)間:2019-12-22距今[1天6時(shí)當(dāng)前時(shí)間:2019-12-22距今[1天6時(shí)距今[19天8時(shí)距今[19天8時(shí)距今[19天8時(shí)修改時(shí)間[2019-12-13距今[9天8時(shí)修改時(shí)間[2019-12-05距今[17天8時(shí)修改時(shí)間[2019-12-05距今距今[17天16時(shí)importimportzipfile#導(dǎo)入zipfile,這個(gè)是用來(lái)做壓縮和解壓的Pythonimportosdefstart_dir=start_dir#file_news=start_dir+'.zip'#z=zipfile.ZipFile(file_news,'w',zipfile.ZIP_DEFLATED)fordir_path,dir_names,file_namesin#這句很重要,不 ce的話,就從 開(kāi)f_path= ce(start_dir,f_path=f_pathandf_path+os.sep#forfilenameinreturn32importimport#對(duì)字符串s實(shí)現(xiàn)32defm=hashlib.md5()returnm.hexdigest()print(hash_cry32(1))#c4ca4238a0b923820dcc509a6f75849b importimportfromdatetimeimportdatemydate=date.today()year_calendar_str=calendar.calendar(2019)12345612312378956789123456712345128967893456789123456712342345678importimportfromdatetimeimportmydate=is_leap=print_leap_str="%s年是閏年"ifis_leapelse"%s年不是閏年\n"print(print_leap_str%mydate.year)importimportfromdatetimeimportmydate=month_calendar_str=calendar.month(mydate.year,123456789importimportfromdatetimeimportmydate=weekday,days=calendar.monthrange(mydate.year,mydate.month)print(f'{mydate.year}年-{mydate.month}月的第天是那周的第{weekday}天\n')20192019年-12月的第天是那周的第6fromfromdatetimeimportdatemydate=date.today()month_first_day=date(mydate.year,mydate.month,1)print(f"當(dāng)月第天:{month_first_day}\n")當(dāng)月第天當(dāng)月第天:2019-12-fromfromdatetimeimportdateimportcalendarmydate=_,days=calendar.monthrange(mydate.year,mydate.month)month_last_day=date(mydate.year,mydate.month,days)print(f"當(dāng)月最后天:{month_last_day}\n")當(dāng)月最后當(dāng)月最后天:2019-12-fromfromdatetimeimportdate,datetimefromtimeimportlocaltimetoday_date=date.today()print(today_date)#2019-12-22today_time=datetime.today()print(today_time)#2019-12-2218:02:33.398894local_time=print(strftime("%Y-%m-%d%H:%M:%S",local_time))#轉(zhuǎn)化為定制的格式2019-12-22fromfromtimeimport#parsestrtimetostructstruct_time=strptime('2019-12-2210:10:08',"%Y-%m-%d%H:%M:%S")print(struct_time)#struct_time類型就是time中的個(gè)類tm_sec=8,tm_wday=6,tm_yday=356,tm_isdst=-1)fromfromtimeimportstrftime,strptime,In[2]:print(localtime())#Out[2]:time.struct_time(tm_year=2019,tm_mon=12,tm_mday=22,tm_hour=18,tm_min=24,tm_sec=56,tm_wday=6,tm_yday=356,tm_isdst=0)print(strftime("%m-%d-%Y%H:%M:%S",localtime()))##這是字符串表示的時(shí)間 12-22-2019導(dǎo)入線程相關(guān)的模塊threading:importimportthreading的類方法current_threadtt=print(t)#<_MainThread(MainThread,started所以,驗(yàn)證了程序默認(rèn)是在MainTheadt.getNamegetNameidisAlive判斷線程是printprint(t.getName())#MainThreadprint(t.ident)#139908235814720print(t.isAlive())#True以上這些僅是介紹多線程的背景知識(shí),因?yàn)榈侥壳盀橹梗覀冇星覂H有一個(gè)"干活"my_threadmy_thread=my_threadmy_threadmy_thread=創(chuàng)建線程的目的是告訴它幫助我們做些什么,做些什么通過(guò)參數(shù)targetcallabledefdefmy_thread=my_thread線程已經(jīng)全副,但是我們得按下發(fā)射按鈕,啟動(dòng)start(),它才開(kāi)始真正起飛args指定函數(shù)print_i需要的參數(shù)i至此,多線程相關(guān)的知識(shí)點(diǎn),已經(jīng)總結(jié)完畢。但是,僅僅知道這些,還不夠!光紙上談兵,當(dāng)然遠(yuǎn)不夠。cpython,這個(gè)假定有些多余。開(kāi)辟3個(gè)線程,裝到threads中:importimportfromdatetimeimportdatetimeimportthreadingdeffor_inrange(5):#在每個(gè)線程中打印5次time.sleep(0.1)#模擬打印前的相關(guān)處理邏輯threads=[threading.Thread(name='t%d'%(i,),target=print_time)foriin[[t.start()fortint0,t1,t2三個(gè)線程,根據(jù)操作系統(tǒng)的調(diào)度算法,輪詢獲得CPUt2當(dāng)前線程當(dāng)前線程t0,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t1,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t2,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t0,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t1,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t2,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t0,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t2,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t1,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t0,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t1,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t2,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t2,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t0,打印結(jié)束時(shí)間為:2020-01-12當(dāng)前線程t1,打印結(jié)束時(shí)間為:2020-01-12比如下面例子,創(chuàng)建的10個(gè)線程同時(shí)競(jìng)爭(zhēng)全局變量aimportimporta=defa+=1print('%saddsato1:threads=[threading.Thread(name='t%d'%(i,),target=add1)foriinrange(10)][t.start()fortinthreads]a1a2a3a4a5a6a7a8a9a結(jié)果一切正常,每個(gè)線程執(zhí)行一次,把a(bǔ)的值加1,最后a變?yōu)?0,一切正常。多線程中,只要存在同時(shí)和修改一個(gè)全局變量的情況,如果不采取其他措施,就一定不是線程安的。盡管,有時(shí),某些情況的資源競(jìng)爭(zhēng),出問(wèn)題的概率極低極低本例中,如果線程 a=a+1這種修改操作,花費(fèi)的時(shí)間太短了,短到我們無(wú)法想象。所以,線程間輪為了模擬這個(gè)寫(xiě)入動(dòng)作,簡(jiǎn)化期間,我們只需要延長(zhǎng)修改變量aimportimportthreadingimporttimea=defglobalglobalatmp=a+1time.sleep(0.2)#延時(shí)0.2a=print('%saddsato1:threads=[threading.Thread(name='t%d'%(i,),target=add1)foriinrange(10)][t.start()fortinthreads]a1a1a1a1a1a1a1a1a1a1看到,10a的值只相當(dāng)于一個(gè)線程執(zhí)行的結(jié)果。這是一個(gè)很有說(shuō)服力的例子,因?yàn)樵谛薷腶前,有0.秒的休眠時(shí)間,某個(gè)線程延時(shí)后,P.2秒的休眠時(shí)長(zhǎng)還沒(méi)耗盡,這樣每個(gè)線程gt到的值都是,所以才出現(xiàn)上面的結(jié)果。tmptmp=a+time.sleep(0.2)#延時(shí)0.2a=通過(guò)to線程再爭(zhēng)鎖,執(zhí)行代碼,釋放鎖,重復(fù)以上。lockaimportimportthreadingimporttimelocka=

獲得鎖,通過(guò)locka.release()aa=deflocka.acquire()#tmp=a+time.sleep(0.2#延時(shí)0.2locka.release()#print('%saddsato1:threads=[threading.Thread(name='t%d'%(i,),target=add1)foriinrange(10)][t.start()fortinthreads]a1a2a3a4a5a6a7a8a9a為線程創(chuàng)建開(kāi)銷,浪費(fèi)時(shí)間的副作用。程序中只有一把鎖,通過(guò)try...finally還能確保不發(fā)生死鎖。但是,當(dāng)程序中啟用多把鎖,還是很timestruct_time,9個(gè)整數(shù)組成的元組記住下面5個(gè)最常用函數(shù)timeimportimportInIn[58]:seconds=time.time()In[60]:seconds InIn[61]:local_time=In[62]:Out[62]:time.struct_time(tm_year=2020,tm_mon=2,tm_mday=22,tm_hour=11,tm_min=19,tm_sec=19,tm_wday=5,tm_yday=53,tm_isdst=0)asasconvertInIn[63]:str_time=In[64]:Out[64]:'SatFeb2211:19:19stringstringformatInIn[65]:format_time=time.strftime('%Y-%m-%dIn[66]:Out[66]:'2020-02-22InIn[68]:str_to_struc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論