版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Python核心知識筆記目錄TOC\h\h基礎(chǔ)\h字符編碼\h輸入和輸出\h常用數(shù)據(jù)類型\h列表\h元組\h字符串\h字典\h集合\h函數(shù)\h定義函數(shù)\h函數(shù)參數(shù)魔法\h函數(shù)式編程\h高階函數(shù)\hmap/reduce/filter\h匿名函數(shù)\h攜帶狀態(tài)的閉包\h會打扮的裝飾器\hpartial函數(shù)\h類\h類和實例\h繼承和多態(tài)\h類方法和靜態(tài)方法\h定制類和魔法方法\hslots魔法\h使用@property\h你不知道的super\h陌生的metaclass\h高級特性\h迭代器\h生成器\h上下文管理器\h文件和目錄\h讀寫文本文件\h讀寫二進制文件\hos模塊\h進程、線程和協(xié)程\h進程\h線程\hThreadLocal\h協(xié)程\h異常處理\h單元測試\h正則表達式\hre模塊\hHTTP服務(wù)\hHTTP協(xié)議簡介\hGET請求\h標準模塊\hargparse\hbase64\hcollections\hitertools\hdatetime\hhashlib\hhmac\h第三方模塊\hcelery\hclick基礎(chǔ)本章主要介紹兩個方面的內(nèi)容:字符編碼輸入和輸出其中,字符編碼的概念很重要,不管你用的是Python2還是Python3,亦或是C++等其他編程語言,希望讀者厘清這個概念,當遇到UnicodeEncodeError和UnicodeDecodeError時才能從容應(yīng)對,而不是到處查找資料。-11-字符編碼字符編碼字符編碼是計算機編程中不可回避的問題,不管你用Python2還是Python3,亦或是C++,Java等,我都覺得非常有必要厘清計算機中的字符編碼概念。本文主要分以下幾個部分介紹:基本概念常見字符編碼簡介Python的默認編碼Python2中的字符類型UnicodeEncodeError&UnicodeDecodeError根源基本概念字符(Character)在電腦和電信領(lǐng)域中,字符是一個信息單位,它是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數(shù)字等。比如,一個漢字,一個英文字母,一個標點符號等都是一個字符。字符集(Characterset)字符集是字符的集合。字符集的種類較多,每個字符集包含的字符個數(shù)也不同。比如,常見的字符集有ASCII字符集、GB2312字符集、Unicode字符集等,其中,ASCII字符集共有128個字符,包含可顯示字符(比如英文大小寫字符、阿拉伯數(shù)字)和控制字符(比如空格鍵、回車鍵);GB2312字符集是中國國家標準的簡體中文字符集,包含簡化漢字、一般符號、數(shù)字等;Unicode字符集則包含了世界各國語言中使用到的所有字符,字符編碼(Characterencoding)字符編碼,是指對于字符集中的字符,將其編碼為特定的二進制數(shù),以便計算機處理。常見的字符編碼有ASCII編碼,UTF-8編碼,GBK編碼等。一般而言,字符集和字符編碼往往被認為是同義的概念,比如,對于字符集ASCII,它除了有「字符的集合」這層含義外,同時也包含了「編碼」的含義,也就是說,ASCII既表示了字符集也表示了對應(yīng)的字符編碼。下面我們用一個表格做下總結(jié):概念概念描述舉例字符一個信息單位,各種文字和符號的總稱‘中’,‘a(chǎn)’,‘1’,‘$’,‘¥’,…ASCII字符集,GB2312字符集,Unicode字符集字符的集合字符集字符編將字符集中的字符,編碼為特定的二進制數(shù)ASCII編碼,GB2312編碼,Unicode編碼碼計算機中存儲數(shù)據(jù)的單元,一個8位(bit)的-12-字符編碼二進制數(shù)常見字符編碼簡介常見的字符編碼有ASCII編碼,GBK編碼,Unicode編碼和UTF-8編碼等等。這里,我們主要介紹ASCII、Unicode和UTF-8。ASCII計算機是在美國誕生的,人家用的是英語,而在英語的世界里,不過就是英文字母,數(shù)字和一些普通符號的組合而已。在20世紀60年代,美國制定了一套字符編碼方案,規(guī)定了英文字母,數(shù)字和一些普通符號跟二進制的轉(zhuǎn)換關(guān)系,被稱為ASCII(AmericanStandardCodeforInformationInterchange,美國信息互換標準編碼)碼。比如,大寫英文字母A的二進制表示是01000001(十進制65),小寫英文字母a的二進制表示是01100001(十進制97),空格SPACE的二進制表示是00100000(十進制32)。UnicodeASCII碼只規(guī)定了128個字符的編碼,這在美國是夠用的??墒?,計算機后來傳到了歐洲,亞洲,乃至世界各地,而世界各國的語言幾乎是完全不一樣的,用ASCII碼來表示其他語言是遠遠不夠的,所以,不同的國家和地區(qū)又制定了自己的編碼方案,比如中國大陸的GB2312編碼和GBK編碼等,日本的Shift_JIS編碼等等。雖然各個國家和地區(qū)可以制定自己的編碼方案,但不同國家和地區(qū)的計算機在數(shù)據(jù)傳輸?shù)倪^程中就會出現(xiàn)各種各樣的亂碼(mojibake),這無疑是個災(zāi)難。怎么辦?想法也很簡單,就是將全世界所有的語言統(tǒng)一成一套編碼方案,這套編碼方案就叫Unicode,它為每種語言的每個字符設(shè)定了獨一無二的二進制編碼,這樣就可以跨語言,跨平臺進行文本處理了,是不是很棒!Unicode1.0版誕生于1991年10月,至今它仍在不斷增修,每個新版本都會加入更多新的字符,目前最新的版本為2016年6月21日公布的9.0.0。Unicode標準使用十六進制數(shù)字,而且在數(shù)字前面加上前綴U+,比如,大寫字母「A」的unicode編碼為U+0041,漢字「嚴」的unicode編碼為U+4E25。更多的符號對應(yīng)表,可以查詢\h,或者專門的\h漢字對應(yīng)表。UTF-8-13-字符編碼Unicode看起來已經(jīng)很完美了,實現(xiàn)了大一統(tǒng)。但是,Unicode卻存在一個很大的問題:資源浪費。為什么這么說呢?原來,Unicode為了能表示世界各國所有文字,一開始用兩個字節(jié),后來發(fā)現(xiàn)兩個字節(jié)不夠用,又用了四個字節(jié)。比如,漢字「嚴」的unicode編碼是十六進制數(shù)4E25,轉(zhuǎn)換成二進制有十五位,即100111000100101,因此至少需要兩個字節(jié)才能表示這個漢字,但是對于其他的字符,就可能需要三個或四個字節(jié),甚至更多。這時,問題就來了,如果以前的ASCII字符集也用這種方式來表示,那豈不是很浪費存儲空間。比如,大寫字母「A」的二進制編碼為01000001,它只需要一個字節(jié)就夠了,如果unicode統(tǒng)一使用三個字節(jié)或四個字節(jié)來表示字符,那「A」的二進制編碼的前面幾個字節(jié)就都是0,這是很浪費存儲空間的。為了解決這個問題,在Unicode的基礎(chǔ)上,人們實現(xiàn)了UTF-16,UTF-32和UTF-8。下面只說一下UTF-8。UTF-8(8-bitUnicodeTransformationFormat)是一種針對Unicode的可變長度字符編碼,它使用一到四個字節(jié)來表示字符,例如,ASCII字符繼續(xù)使用一個字節(jié)編碼,阿拉伯文、希臘文等使用兩個字節(jié)編碼,常用漢字使用三個字節(jié)編碼,等等。因此,我們說,UTF-8是Unicode的實現(xiàn)方式之一,其他實現(xiàn)方式還包括UTF-16(字符用兩個或四個字節(jié)表示)和UTF-32(字符用四個字節(jié)表示)。Python的默認編碼Python2的默認編碼是ascii,Python3的默認編碼是utf-8,可以通過下面的方式獲?。篜ython21.Python2.7.11(default,Feb242016,10:48:05)2.[GCC4.2.1CompatibleAppleLLVM7.0.2(clang-700.1.81)]ondarwin3.Type"help","copyright","credits"or"license"formoreinformation.4.>>>importsys5.>>>sys.getdefaultencoding()6.'ascii'Python31.Python3.5.2(default,Jun292016,13:43:58)2.[GCC4.2.1CompatibleAppleLLVM7.3.0(clang-703.0.31)]ondarwin3.Type"help","copyright","credits"or"license"formoreinformation.-14-字符編碼5.>>>sys.getdefaultencoding()6.'utf-8'Python2中的字符類型Python2中有兩種和字符串相關(guān)的類型:str和unicode,它們的父類是basestring。其中,str類型的字符串有多種編碼方式,默認是ascii,還有g(shù)bk,utf-8等,unicode類型的字符串使用u'...'的形式來表示,下面的圖展示了str和unicode之間的關(guān)系:兩種字符串的相互轉(zhuǎn)換概括如下:把UTF-8編碼表示的字符串‘xxx’轉(zhuǎn)換為Unicode字符串u’xxx’用decode('utf-8')方法:1.>>>'中文'.decode('utf-8')2.u'\u4e2d\u6587'把u’xxx’轉(zhuǎn)換為UTF-8編碼的‘xxx’用encode('utf-8')方法:1.>>>u'中文'.encode('utf-8')2.'\xe4\xb8\xad\xe6\x96\x87'UnicodeEncodeError&UnicodeDecodeError根源-15-字符編碼用Python2編寫程序的時候經(jīng)常會遇到UnicodeEncodeError和UnicodeDecodeError,它們出現(xiàn)的根源就是如果代碼里面混合使用了str類型和unicode類型的字符串,Python會默認使用ascii編碼嘗試對unicode類型的字符串編碼(encode),或?qū)tr類型的字符串解碼(decode),這時就很可能出現(xiàn)上述錯誤。下面有兩個常見的場景,我們最好牢牢記住:在進行同時包含str類型和unicode類型的字符串操作時,Python2一律都把str解碼(decode)成unicode再運算,這時就很容易出現(xiàn)UnicodeDecodeError。讓我們看看例子:1.>>>s='你好'#str類型,utf-8編碼2.>>>u=u'世界'#unicode類型3.>>>s+u#會進行隱式轉(zhuǎn)換,即s.decode('ascii')+u4.Traceback(mostrecentcalllast):5.File"<stdin>",line1,in<module>UnicodeDecodeError:'ascii'codeccan'tdecodebyte0xe4inposition0:ordinal6.notinrange(128)為了避免出錯,我們就需要顯示指定使用‘utf-8’進行解碼,如下:1.>>>s='你好'#str類型,utf-8編碼2.>>>u=u'世界'3.>>>4.>>>s.decode('utf-8')+u#顯示指定'utf-8'進行轉(zhuǎn)換5.u'\u4f60\u597d\u4e16\u754c'#注意這不是錯誤,這是unicode字符串如果函數(shù)或類等對象接收的是str類型的字符串,但你傳的是unicode,Python2會默認使用ascii將其編碼成str類型再運算,這時就很容易出現(xiàn)UnicodeEncodeError。讓我們看看例子:1.>>>u_str=u'你好'2.>>>str(u_str)3.Traceback(mostrecentcalllast):4.File"<stdin>",line1,in<module>UnicodeEncodeError:'ascii'codeccan'tencodecharactersinposition0-1:5.ordinalnotinrange(128)在上面的代碼中,u_str是一個unicode類型的字符串,由于str()的參數(shù)只能是str類型,此時Python會試圖使用ascii將其編碼成ascii,也就是:-16-字符編碼1.u_str.encode('ascii')//u_str是unicode字符串上面將unicode類型的中文使用ascii編碼轉(zhuǎn),肯定會出錯。再看一個使用raw_input的例子,注意raw_input只接收str類型的字符串:1.>>>name=raw_input('inputyourname:')2.inputyourname:ethan3.>>>name4.'ethan'5.6.>>>name=raw_input('輸入你的姓名:')7.輸入你的姓名:小明8.>>>name9.'\xe5\xb0\x8f\xe6\x98\x8e'10.>>>type(name)11.<type'str'>12.>>>name=raw_input(u'輸入你的姓名:')#會試圖使用u'輸入你的姓13.名'.encode('ascii')14.Traceback(mostrecentcalllast):15.File"<stdin>",line1,in<module>UnicodeEncodeError:'ascii'codeccan'tencodecharactersinposition0-5:16.ordinalnotinrange(128)17.>>>name=raw_input(u'輸入你的姓名:'.encode('utf-8'))#可以,但此時name不是18.unicode類型19.輸入你的姓名:小明20.>>>name21.'\xe5\xb0\x8f\xe6\x98\x8e'22.>>>type(name)23.<type'str'>24.25.>>>name=raw_input(u'輸入你的姓名:'.encode('utf-8')).decode('utf-8')#推薦26.輸入你的姓名:小明27.>>>name28.u'\u5c0f\u660e'29.>>>type(name)30.<type'unicode'>再看一個重定向的例子:-17-字符編碼1.hello=u'你好'2.printhello將上面的代碼保存到文件hello.py,在終端執(zhí)行pythonhello.py可以正常打印,但是如果將其重定向到文件pythonhello.py>result會發(fā)現(xiàn)UnicodeEncodeError。這是因為:輸出到控制臺時,print使用的是控制臺的默認編碼,而重定向到文件時,print就不知道使用什么編碼了,于是就使用了默認編碼ascii導(dǎo)致出現(xiàn)編碼錯誤。應(yīng)該改成如下:1.hello=u'你好'2.printhello.encode('utf-8')這樣執(zhí)行pythonhello.py>result就沒有問題。小結(jié)UTF-8是一種針對Unicode的可變長度字符編碼,它是Unicode的實現(xiàn)方式之一。Unicode字符集有多種編碼標準,比如UTF-8,UTF-7,UTF-16。在進行同時包含str類型和unicode類型的字符串操作時,Python2一律都把str解碼(decode)成unicode再運算。如果函數(shù)或類等對象接收的是str類型的字符串,但你傳的是unicode,Python2會默認使用ascii將其編碼成str類型再運算。參考資料\h字符-維基百科,自由的百科全書\hUTF-8-維基百科,自由的百科全書\h字符,字節(jié)和編碼-Characters,BytesAndEncoding\h字符編碼筆記:ASCII,Unicode和UTF-8-阮一峰的網(wǎng)絡(luò)日志\h字符串和編碼-廖雪峰的官方網(wǎng)站\hpython-Dangersofsys.setdefaultencoding(‘utf-8’)-StackOverflow-18-輸入和輸出輸入和輸出Python2提供了input,raw_input,print等用于輸入輸出,但在Python3中發(fā)生了一些改變,raw_input已經(jīng)沒有了,input的用法發(fā)生了變化,print也從原來的語句變成了一個函數(shù)。本文將對這兩種情況進行介紹。輸入首先看Python2中的raw_input,它的用法如下:1.raw_input(prompt)其中,prompt表示輸入提示。raw_input會讀取控制臺的輸入,并返回字符串類型。讓我們看幾個例子:1.>>>name=raw_input('pleaseenteryourname:')2.pleaseenteryourname:ethan#輸入一個字符串3.>>>name4.'ethan'5.>>>type(name)6.<type'str'>7.>>>8.>>>num=raw_input('pleaseenteryourid:')9.pleaseenteryourid:12345#輸入一個數(shù)值10.>>>num11.'12345'12.>>>type(num)13.<type'str'>14.>>>15.>>>sum=raw_input('pleaseentera+b:')16.pleaseentera+b:3+6#輸入一個表達式17.>>>sum18.'3+6'19.>>>type(sum)20.<type'str'>可以看到,不管我們輸入一個字符串、數(shù)值還是表達式,raw_input都直接返回一個字符串?,F(xiàn)在看一下Pythn2中的input。-19-輸入和輸出input的用法跟raw_input類似,形式如下:1.input(prompt)事實上,input本質(zhì)上是使用raw_input實現(xiàn)的,如下:1.definput(prompt):2.return(eval(raw_input(prompt)))也就是說,調(diào)用input實際上是通過調(diào)用raw_input再調(diào)用eval函數(shù)實現(xiàn)的。這里的eval通常用來執(zhí)行一個字符串表達式,并返回表達式的值,它的基本用法如下:1.>>>eval('1+2')2.33.>>>a=14.>>>eval('a+9')5.10現(xiàn)在,讓我們看看input的用法:1.>>>name=input('pleaseinputyourname:')2.pleaseinputyourname:ethan#輸入字符串如果沒加引號會出錯3.Traceback(mostrecentcalllast):4.File"<stdin>",line1,in<module>5.File"<string>",line1,in<module>6.NameError:name'ethan'isnotdefined7.>>>8.>>>name=input('pleaseinputyourname:')9.pleaseinputyourname:'ethan'#添加引號10.>>>name11.'ethan'12.>>>13.>>>num=input('pleaseinputyourid:')14.pleaseinputyourid:12345#輸入數(shù)值15.>>>num#注意返回的是數(shù)值類型,而不是字符串16.1234517.>>>type(num)18.<type'int'>19.>>>20.>>>sum=input('pleaseentera+b:')#輸入數(shù)字表達式,會對表達式求值21.pleaseentera+b:3+6-20-輸入和輸出22.>>>sum23.924.>>>type(sum)25.<type'int'>26.>>>27.>>>sum=input('pleaseentera+b:')#輸入字符串表達式,會字符串進行運算28.pleaseentera+b:'3'+'6'29.>>>sum30.'36'可以看到,使用input的時候,如果輸入的是字符串,必須使用引號把它們括起來;如果輸入的是數(shù)值類型,則返回的也是數(shù)值類型;如果輸入的是表達式,會對表達式進行運算。再來看一下Python3中的input。事實上,Python3中的input就是Python2中的raw_input,也就是說,原Python2中的raw_input被重命名為input了。那如果我們想使用原Python2的input功能呢?你可以這樣做:1.eval(input())也就是說,手動添加eval函數(shù)。輸出Python2中的print是一個語句(statement),而Python3中的print是一個函數(shù)。Python2中的print簡單輸出使用print最簡單的方式就是直接在print后面加上數(shù)字、字符串、列表等對象,比如:1.#Python2.7.11(default,Feb242016,10:48:05)2.>>>print1233.1234.>>>print'abc'5.abc6.>>>x=107.>>>printx8.10-21-輸入和輸出9.>>>d={'a':1,'b':2}10.>>>printd11.{'a':1,'b':2}12.>>>13.>>>print(123)14.12315.>>>print('abc')16.abc17.>>>print(x)18.1019.>>>print(d)20.{'a':1,'b':2}在Python2中,使用print時可以加括號,也可以不加括號。格式化輸出有時,我們需要對輸出進行一些格式化,比如限制小數(shù)的精度等,直接看幾個例子:1.>>>s='hello'2.>>>l=len(s)3.>>>print('thelengthof%sis%d'%(s,l))4.thelengthofhellois55.>>>6.>>>pi=3.141597.>>>print('%10.3f'%pi)#字段寬度10,精度38.3.1429.>>>print('%010.3f'%pi)#用0填充空白10.000003.14211.>>>print('%+f'%pi)#顯示正負號12.+3.141590換行輸出print默認是換行輸出的,如果不想換行,可以在末尾加上一個`,’,比如:1.>>>foriinrange(0,3):2....printi3....4.05.16.27.>>>foriinrange(0,3):-22-輸入和輸出8....printi,#加了,9....10.012#注意會加上一個空格Python3中的print在Python3中使用print跟Python2差別不大,不過要注意的是在Python3中使用print必須加括號,否則會拋出SyntaxError。另外,如果不想print換行輸出,可以參考下面的方式:1.>>>foriinrange(0,3):2....print(i)3....4.05.16.27.>>>foriinrange(0,3):8....print(i,end='')#加上一個end參數(shù)9....10.012小結(jié)在Python2中,raw_input會讀取控制臺的輸入,并返回字符串類型。在Python2中,如無特殊要求建議使用raw_input()來與用戶交互。在Python3中,使用input處理輸入,如有特殊要求,可以考慮加上eval。參考資料\hpython-What’sthedifferencebetweenraw_input()andinput()in\hpython3.x?-StackOverflow-23-常用數(shù)據(jù)類型常用數(shù)據(jù)類型在介紹Python的常用數(shù)據(jù)類型之前,我們先看看Python最基本的數(shù)據(jù)結(jié)構(gòu)-序列(sequence)。序列的一個特點就是根據(jù)索引(index,即元素的位置)來獲取序列中的元素,第一個索引是0,第二個索引是1,以此類推。所有序列類型都可以進行某些通用的操作,比如:索引(indexing)分片(sliceing)迭代(iteration)加(adding)乘(multiplying)除了上面這些,我們還可以檢查某個元素是否屬于序列的成員,計算序列的長度等等。說完序列,我們接下來看看Python中常用的數(shù)據(jù)類型,如下:列表(list)元組(tuple)字符串(string)字典(dict)集合(set)其中,列表、元組和字符串都屬于序列類型,它們可以進行某些通用的操作,比如索引、分片等;字典屬于映射類型,每個元素由鍵(key)和值(value)構(gòu)成;集合是一種特殊的類型,它所包含的元素是不重復(fù)的。通用的序列操作索引序列中的元素可以通過索引獲取,索引從0開始。看看下面的例子:1.>>>nums=[1,2,3,4,5]#列表2.>>>nums[0]3.14.>>>nums[1]-24-常用數(shù)據(jù)類型5.26.>>>nums[-1]#索引-1表示最后一個元素7.58.>>>s='abcdef'#字符串9.>>>s[0]10.'a'11.>>>s[1]12.'b'13.>>>14.>>>a=(1,2,3)#元組15.>>>a[0]16.117.>>>a[1]18.2注意到,-1則代表序列的最后一個元素,-2代表倒數(shù)第二個元素,以此類推。分片索引用于獲取序列中的單個元素,而分片則用于獲取序列的部分元素。分片操作需要提供兩個索引作為邊界,中間用冒號相隔,比如:1.>>>numbers=[1,2,3,4,5,6]2.>>>numbers[0:2]#列表分片3.[1,2]4.>>>numbers[2:5]5.[3,4,5]6.>>>s='hello,world'#字符串分片7.>>>s[0:5]8.'hello'9.>>>a=(2,4,6,8,10)#元組分片10.>>>a[2:4]11.(6,8)這里需要特別注意的是,分片有兩個索引,第1個索引的元素是包含在內(nèi)的,而第2個元素的索引則不包含在內(nèi),也就是說,numbers[2:5]獲取的是numbers[2],numbers[3],numbers[4],沒有包括numbers[5]。下面列舉使用分片的一些技巧。訪問最后幾個元素-25-常用數(shù)據(jù)類型假設(shè)需要訪問序列的最后3個元素,我們當然可以像下面這樣做:1.>>>numbers=[1,2,3,4,5,6]2.>>>numbers[3:6]3.[4,5,6]有沒有更簡潔的方法呢?想到可以使用負數(shù)形式的索引,你可能會嘗試這樣做:1.>>>numbers=[1,2,3,4,5,6]2.>>>numbers[-3:-1]#實際取出的是numbers[-3],numbers[-2]3.[4,5]4.>>>numbers[-3:0]#左邊索引的元素比右邊索引出現(xiàn)得晚,返回空序列5.[]上面的兩種使用方式并不能正確獲取序列的最后3個元素,Python提供了一個捷徑:1.>>>numbers=[1,2,3,4,5,6,7,8]2.>>>numbers[-3:]3.[6,7,8]4.>>>numbers[5:]5.[6,7,8]也就是說,如果希望分片包含最后一個元素,可將第2個索引置為空。如果要復(fù)制整個序列,可以將兩個索引都置為空:1.>>>numbers=[1,2,3,4,5,6,7,8]2.>>>nums=numbers[:]3.>>>nums4.[1,2,3,4,5,6,7,8]使用步長使用分片的時候,步長默認是1,即逐個訪問,我們也可以自定義步長,比如:1.>>>numbers=[1,2,3,4,5,6,7,8]2.>>>numbers[0:4]3.[1,2,3,4]4.>>>numbers[0:4:1]#步長為1,不寫也可以,默認為15.[1,2,3,4]6.>>>numbers[0:4:2]#步長為2,取出numbers[0],numbers[2]7.[1,3]-26-常用數(shù)據(jù)類型8.>>>numbers[::3]#等價于numbers[0:8:3],取出索引為0,3,6的元素9.[1,4,7]另外,步長也可以是負數(shù),表示從右到左取元素:1.>>>numbers=[1,2,3,4,5,6,7,8]2.>>>numbers[0:4:-1]3.[]4.>>>numbers[4:0:-1]#取出索引為4,3,2,1的元素5.[5,4,3,2]6.>>>numbers[4:0:-2]#取出索引為4,2的元素7.[5,3]8.>>>numbers[::-1]#從右到左取出所有元素9.[8,7,6,5,4,3,2,1]10.>>>numbers[::-2]#取出索引為7,5,3,1的元素11.[8,6,4,2]12.>>>numbers[6::-2]#取出索引為6,4,2,0的元素13.[7,5,3,1]14.>>>numbers[:6:-2]#取出索引為7的元素15.[8]這里總結(jié)一下使用分片操作的一些方法,分片的使用形式是:1.#左索引:右索引:步長2.left_index:right_index:step要牢牢記住的是:左邊索引的元素包括在結(jié)果之中,右邊索引的元素不包括在結(jié)果之中;當使用一個負數(shù)作為步長時,必須讓左邊索引大于右邊索引;對正數(shù)步長,從左向右取元素;對負數(shù)步長,從右向左取元素;加序列可以進行「加法」操作,如下:1.>>>[1,2,3]+[4,5,6]#「加法」效果其實就是連接在一起2.[1,2,3,4,5,6]3.>>>(1,2,3)+(4,5,6)4.(1,2,3,4,5,6)5.>>>'hello,'+'world!'-27-常用數(shù)據(jù)類型6.'hello,world!'7.>>>[1,2,3]+'abc'8.Traceback(mostrecentcalllast):9.File"<stdin>",line1,in<module>10.TypeError:canonlyconcatenatelist(not"str")tolist這里需要注意的是:兩種相同類型的序列才能「加法」操作。乘序列可以進行「乘法」操作,比如:1.>>>'abc'*32.'abcabcabc'3.>>>[0]*34.[0,0,0]5.>>>[1,2,3]*36.[1,2,3,1,2,3,1,2,3]in為了檢查一個值是否在序列中,可以使用in運算符,比如:1.>>>'he'in'hello'2.True3.>>>'hl'in'hello'4.False5.>>>10in[6,8,10]6.True參考資料《Python基礎(chǔ)教程》-28-列表列表字符串和元組是不可變的,而列表是可變(mutable)的,可以對它進行隨意修改。我們還可以將字符串和元組轉(zhuǎn)換成一個列表,只需使用list函數(shù),比如:1.>>>s='hello'2.>>>list(s)3.['h','e','l','l','o']4.>>>a=(1,2,3)5.>>>list(a)6.[1,2,3]本文主要介紹常用的列表方法:indexcountappendextendinsertpopremovereversesortindexindex方法用于從列表中找出某個元素的位置,如果有多個相同的元素,則返回第一個元素的位置??纯蠢樱?.>>>numbers=[1,2,3,4,5,5,7,8]2.>>>numbers.index(5)#列表有兩個5,返回第一個元素的位置3.44.>>>numbers.index(2)5.16.>>>words=['hello','world','you','me','he']7.>>>words.index('me')8.39.>>>words.index('her')#如果沒找到元素,則會拋出異常10.Traceback(mostrecentcalllast):-29-列表11.File"<stdin>",line1,in<module>12.ValueError:'her'isnotinlistcountcount方法用于統(tǒng)計某個元素在列表中出現(xiàn)的次數(shù)??纯蠢樱?.>>>numbers=[1,2,3,4,5,5,6,7]2.>>>numbers.count(2)#出現(xiàn)一次3.14.>>>numbers.count(5)#出現(xiàn)了兩次5.26.>>>numbers.count(9)#沒有該元素,返回07.0appendappend方法用于在列表末尾增加新的元素??纯蠢樱?.>>>numbers=[1,2,3,4,5,5,6,7]2.>>>numbers.append(8)#增加8這個元素3.>>>numbers4.[1,2,3,4,5,5,6,7,8]5.>>>numbers.append([9,10])#增加[9,10]這個元素6.>>>numbers7.[1,2,3,4,5,5,6,7,8,[9,10]]extendextend方法將一個新列表的元素添加到原列表中??纯蠢樱?.>>>a=[1,2,3]2.>>>b=[4,5,6]3.>>>a.extend(b)-30-列表4.>>>a5.[1,2,3,4,5,6]6.>>>7.>>>a.extend(3)8.Traceback(mostrecentcalllast):9.File"<stdin>",line1,in<module>10.TypeError:'int'objectisnotiterable11.>>>a.extend([3])12.>>>a13.[1,2,3,4,5,6,3]注意到,雖然append和extend可接收一個列表作為參數(shù),但是append方法是將其作為一個元素添加到列表中,而extend則是將新列表的元素逐個添加到原列表中。insertinsert方法用于將某個元素添加到某個位置??纯蠢樱?.>>>numbers=[1,2,3,4,5,6]2.>>>numbers.insert(3,9)3.>>>numbers4.[1,2,3,9,4,5,6]poppop方法用于移除列表中的一個元素(默認是最后一個),并且返回該元素的值??纯蠢樱?.>>>numbers=[1,2,3,4,5,6]2.>>>numbers.pop()3.64.>>>numbers5.[1,2,3,4,5]6.>>>numbers.pop(3)7.48.>>>numbers9.[1,2,3,5]-31-列表removeremove方法用于移除列表中的某個匹配元素,如果有多個匹配,則移除第一個??纯蠢樱?.>>>numbers=[1,2,3,5,6,7,5,8]2.>>>numbers.remove(5)#有兩個5,移除第1個3.>>>numbers4.[1,2,3,6,7,5,8]5.>>>numbers.remove(9)#沒有匹配的元素,拋出異常6.Traceback(mostrecentcalllast):7.File"<stdin>",line1,in<module>8.ValueError:list.remove(x):xnotinlistreversereverse方法用于將列表中的元素進行反轉(zhuǎn)??纯蠢樱?.>>>numbers=[1,2,3,5,6,7,5,8]2.>>>numbers.reverse()3.>>>numbers4.[8,5,7,6,5,3,2,1]sortsort方法用于對列表進行排序,注意該方法會改變原來的列表,而不是返回新的排序列表,另外,sort方法的返回值是空。看看例子:1.>>>a=[4,3,6,8,9,1]2.>>>b=a.sort()3.>>>b==None#返回值為空4.True5.>>>a6.[1,3,4,6,8,9]#原列表已經(jīng)發(fā)生改變-32-列表如果我們不想改變原列表,而是希望返回一個排序后的列表,可以使用sorted函數(shù),如下:1.>>>a=[4,3,6,8,9,1]2.>>>b=sorted(a)#返回一個排序后的列表3.>>>a4.[4,3,6,8,9,1]#原列表沒有改變5.>>>b6.[1,3,4,6,8,9]#這是對原列表排序后的列表注意到,不管是sort方法還是sorted函數(shù),默認排序都是升序排序。如果你想要降序排序,就需要指定排序參數(shù)了。比如,對sort方法,可以添加一個reverse關(guān)鍵字參數(shù),如下:1.>>>a=[4,3,6,8,9,1]2.>>>a.sort(reverse=True)#反向排序3.>>>a4.[9,8,6,4,3,1]該參數(shù)對sorted函數(shù)同樣適用:1.>>>a=[4,3,6,8,9,1]2.>>>sorted(a,reverse=True)3.[9,8,6,4,3,1]除了reverse關(guān)鍵字參數(shù),還可以指定key關(guān)鍵字參數(shù),它為每個元素創(chuàng)建一個鍵,然后所有元素按照這個鍵來排序,比如我們想根據(jù)元素的長度來排序:1.>>>s=['ccc','a','bb','dddd']2.>>>s.sort(key=len)#使用len作為鍵函數(shù),根據(jù)元素長度排序3.>>>s4.['a','bb','ccc','dddd']另外,我們還可以使用sorted進行多列(屬性)排序??纯蠢樱?.>>>students=[2.('john','B',15),3.('jane','A',12),4.('dave','B',10),5.('ethan','C',20),6.('peter','B',20),-33-列表7.('mike','C',16)8.]9.>>>10.#對第3列排序(從小到大)11.>>>sorted(students,key=lambdastudent:student[2])12.[('dave','B',10),13.('jane','A',12),14.('john','B',15),15.('mike','C',16),16.('ethan','C',20),17.('peter','B',20)]18.19.#對第2列排序(從小到大),再對第3列從大到小排序20.>>>sorted(students,key=lambdastudent:(student[1],-student[2]))21.[('jane','A',12),22.('peter','B',20),23.('john','B',15),24.('dave','B',10),25.('ethan','C',20),26.('mike','C',16)]如果你想了解更多關(guān)于排序的知識,可以參\h考此文。小結(jié)列表是可變的。列表常用的方法有index,count,append,extend等。參考資料《Python基礎(chǔ)教程》\hHowTo/Sorting-PythonWiki-34-元組元組在Python中,元組是一種不可變序列,它使用圓括號來表示:1.>>>a=(1,2,3)#a是一個元組2.>>>a3.(1,2,3)4.>>>a[0]=6#元組是不可變的,不能對它進行賦值操作5.Traceback(mostrecentcalllast):6.File"<stdin>",line1,in<module>7.TypeError:'tuple'objectdoesnotsupportitemassignment空元組創(chuàng)建一個空元組可以用沒有包含內(nèi)容的圓括號來表示:1.>>>a=()2.>>>a3.()一個值的元組創(chuàng)建一個值的元組需要在值后面再加一個逗號,這個比較特殊,需要牢牢記?。?.>>>a=(12,)#在值后面再加一個逗號2.>>>a3.(12,)4.>>>type(a)5.<type'tuple'>6.>>>7.>>>b=(12)#只是使用括號括起來,而沒有加逗號,不是元組,本質(zhì)上是b=128.>>>b9.1210.>>>type(b)11.<type'int'>元組操作-35-元組元組也是一種序列,因此也可以對它進行索引、分片等。由于它是不可變的,因此就沒有類似列表的append,extend,sort等方法。小結(jié)元組是不可變的。創(chuàng)建一個值的元組需要在值后面再加一個逗號。-36-字符串字符串字符串也是一種序列,因此,通用的序列操作,比如索引,分片,加法,乘法等對它同樣適用。比如:1.>>>s='hello,'2.>>>s[0]#索引3.'h'4.>>>s[1:3]#分片5.'el'6.>>>s+'world'#加法7.'hello,world'8.>>>s*2#乘法9.'hello,hello,'但需要注意的是,字符串和元組一樣,也是不可變的,所以你不能對它進行賦值等操作:1.>>>s='hello'2.>>>s[1]='ab'#不能對它進行賦值3.Traceback(mostrecentcalllast):4.File"<stdin>",line1,in<module>5.TypeError:'str'objectdoesnotsupportitemassignment除了通用的序列操作,字符串還有自己的方法,比如join,lower,upper等。字符串的方法特別多,這里只介紹一些常用的方法,如下:findsplitjoinstripreplacetranslatelower/upperfindfind方法用于在一個字符串中查找子串,它返回子串所在位置的最左端索引,如果沒有找到,則返回-1??纯蠢樱?37-字符串1.>>>motto="tobeornottobe,thatisaquestion"2.>>>motto.find('be')#返回'b'所在的位置,即33.34.>>>motto.find('be',4)#指定從起始位置開始找,找到的是第2個'be'5.166.>>>motto.find('be',4,7)#指定起始位置和終點位置,沒有找到,返回-17.-1splitsplit方法用于將字符串分割成序列??纯蠢樱?.>>>'/user/bin/ssh'.split('/')#使用'/'作為分隔符2.['','user','bin','ssh']3.>>>'1+2+3+4+5'.split('+')#使用'+'作為分隔符4.['1','2','3','4','5']5.>>>'thatisaquestion'.split()#沒有提供分割符,默認使用所有空格作為分隔符6.['that','is','a','question']需要注意的是,如果不提供分隔符,則默認會使用所有空格作為分隔符(空格、制表符、換行等)。joinjoin方法可以說是split的逆方法,它用于將序列中的元素連接起來??纯蠢樱?.>>>'/'.join(['','user','bin','ssh'])2.'/user/bin/ssh'3.>>>4.>>>'+'.join(['1','2','3','4','5'])5.'1+2+3+4+5'6.>>>''.join(['that','is','a','question'])7.'thatisaquestion'8.>>>''.join(['h','e','ll','o'])9.'hello'10.>>>'+'.join([1,2,3,4,5])#不能是數(shù)字11.Traceback(mostrecentcalllast):12.File"<stdin>",line1,in<module>-38-字符串13.TypeError:sequenceitem0:expectedstring,intfoundstripstrip方法用于移除字符串左右兩側(cè)的空格,但不包括內(nèi)部,當然也可以指定需要移除的字符串??纯蠢樱?.>>>'helloworld!'.strip()#移除左右兩側(cè)空格2.'helloworld!'3.>>>'%%%helloworld!!!####'.strip('%#')#移除左右兩側(cè)的'%'或'#'4.'helloworld!!!'5.>>>'%%%helloworld!!!####'.strip('%#')#移除左右兩側(cè)的'%'或'#'或空格6.'helloworld!!!'replacereplace方法用于替換字符串中的所有匹配項。看看例子:1.>>>motto='TobeornotTobe,thatisaquestion'2.>>>motto.replace('To','to')#用'to'替換所有的'To',返回了一個新的字符串3.'tobeornottobe,thatisaquestion'4.>>>motto#原字符串保持不變5.'TobeornotTobe,thatisaquestion'translatetranslate方法和replace方法類似,也可以用于替換字符串中的某些部分,但translate方法只處理單個字符。translate方法的使用形式如下:1.str.translate(table[,deletechars]);其中,table是一個包含256個字符的轉(zhuǎn)換表,可通過maketrans方法轉(zhuǎn)換而來,deletechars是字符串中要過濾的字符集??纯蠢樱?39-字符串1.>>>fromstringimportmaketrans2.>>>table=maketrans('aeiou','12345')3.>>>motto='tobeornottobe,thatisaquestion'4.>>>motto.translate(table)5.'t4b24rn4tt4b2,th1t3s1q52st34n'6.>>>motto7.'tobeornottobe,thatisaquestion'8.>>>motto.translate(table,'rqu')#移除所有的'r','q','u'9.'t4b24n4tt4b2,th1t3s12st34n'可以看到,maketrans接收兩個參數(shù):兩個等長的字符串,表示第一個字符串的每個字符用第二個字符串對應(yīng)位置的字符替代,在上面的例子中,就是‘a(chǎn)’用‘1’替代,’e’用‘2’替代,等等,注意,是單個字符的代替,而不是整個字符串的替代。因此,motto中的o都被替換為4,e都被替換為2,等等。lower/upperlower/upper用于返回字符串的大寫或小寫形式??纯蠢樱?.>>>x='PYTHON'2.>>>x.lower()3.'python'4.>>>x5.'PYTHON'6.>>>7.>>>y='python'8.>>>y.upper()9.'PYTHON'10.>>>y11.'python'小結(jié)字符串是不可變對象,調(diào)用對象自身的任意方法,也不會改變該對象自身的內(nèi)容。相反,這些方法會創(chuàng)建新的對象并返回。translate針對單個字符進行替換。參考資料-40-字符串《python基礎(chǔ)教程》-41-字典字典字典是Python中唯一的映射類型,每個元素由鍵(key)和值(value)構(gòu)成,鍵必須是不可變類型,比如數(shù)字、字符串和元組。字典基本操作這里先介紹字典的幾個基本操作,后文再介紹字典的常用方法。創(chuàng)建字典遍歷字典判斷鍵是否在字典里面創(chuàng)建字典字典可以通過下面的方式創(chuàng)建:1.>>>d0={}#空字典2.>>>d03.{}4.>>>d1={'name':'ethan','age':20}5.>>>d16.{'age':20,'name':'ethan'}7.>>>d1['age']=21#更新字典8.>>>d19.{'age':21,'name':'ethan'}10.>>>d2=dict(name='ethan',age=20)#使用dict函數(shù)11.>>>d212.{'age':20,'name':'ethan'}13.>>>item=[('name','ethan'),('age',20)]14.>>>d3=dict(item)15.>>>d316.{'age':20,'name':'ethan'}遍歷字典遍歷字典有多種方式,這里先介紹一些基本的方式,后文會介紹一些高效的遍歷方式。1.>>>d={'name':'ethan','age':20}-42-字典2.>>>forkeyind:3....print'%s:%s'%(key,d[key])4....5.age:206.name:ethan7.>>>d['name']8.'ethan'9.>>>d['age']10.2011.>>>forkeyind:12....ifkey=='name':13....deld[key]#要刪除字典的某一項14....15.Traceback(mostrecentcalllast):16.File"<stdin>",line1,in<module>17.RuntimeError:dictionarychangedsizeduringiteration18.>>>19.>>>forkeyind.keys():#python2應(yīng)該使用這種方式,python3使用list(d.keys())20....ifkey=='name':21....deld[key]22....23.>>>d24.{'age':20}在上面,我們介紹了兩種遍歷方式:forkeyind和forkeyind.keys(),如果在遍歷的時候,要刪除鍵為key的某項,使用第一種方式會拋出RuntimeError,使用第二種方式則不會。判斷鍵是否在字典里面有時,我們需要判斷某個鍵是否在字典里面,這時可以用in進行判斷,如下:1.>>>d={'name':'ethan','age':20}2.>>>'name'ind3.True4.>>>d['score']#訪問不存在的鍵,會拋出KeyError5.Traceback(mostrecentcalllast):6.File"<stdin>",line1,in<module>7.KeyError:'score'8.>>>'score'ind#使用in判斷key是否在字典里面9.False-43-字典字典常用方法字典有自己的一些操作方法,這里只介紹部分常用的方法:clearcopygetsetdefaultupdatepoppopitemkeys/iterkeysvalues/itervaluesitems/iteritemsfromkeysclearclear方法用于清空字典中的所有項,這是個原地操作,所以無返回值(或者說是None)??纯蠢樱?.>>>d={'name':'ethan','age':20}2.>>>rv=d.clear()3.>>>d4.{}5.>>>printrv6.None再看看一個例子:1.>>>d1={}2.>>>d2=d13.>>>d2['name']='ethan'4.>>>d15.{'name':'ethan'}6.>>>d27.{'name':'ethan'}8.>>>d1={}#d1變?yōu)榭兆值?.>>>d210.{'name':'ethan'}#d2不受影響-44-字典在上面,d1和d2最初對應(yīng)同一個字典,而后我們使用d1={}使其變成一個空字典,但此時d2不受影響。如果希望d1變成空字典之后,d2也變成空字典,則可以使用clear方法:1.>>>d1={}2.>>>d2=d13.>>>d2['name']='ethan'4.>>>d15.{'name':'ethan'}6.>>>d27.{'name':'ethan'}8.>>>d1.clear()#d1清空之后,d2也為空9.>>>d110.{}11.>>>d212.{}copycopy方法實現(xiàn)的是淺復(fù)制(shallowcopy)。它具有以下特點:對可變對象的修改保持同步;對不可變對象的修改保持獨立;看看例子:1.#name的值是不可變對象,books的值是可變對象2.>>>d1={'name':'ethan','books':['book1','book2','book3']}3.>>>d2=d1.copy()4.>>>d2['name']='peter'#d2對不可變對象的修改不會改變d15.>>>d26.{'books':['book1','book2','book3'],'name':'peter'}7.>>>d18.{'books':['book1','book2','book3'],'name':'ethan'}9.>>>d2['books'].remove('book2')#d2對可變對象的修改會影響d110.>>>d211.{'books':['book1','book3'],'name':'peter'}12.>>>d113.{'books':['book1','book3'],'name':'ethan'}14.>>>d1['books'].remove('book3')#d1對可變對象的修改會影響d215.>>>d116.{'books':['book1'],'name':'ethan'}-45-字典17.>>>d218.{'books':['book1'],'name':'peter'}和淺復(fù)制對應(yīng)的是深復(fù)制(deepcopy),它會創(chuàng)造出一個副本,跟原來的對象沒有關(guān)系,可以通過copy模塊的deepcopy函數(shù)來實現(xiàn):1.>>>fromcopyimportdeepcopy2.>>>d1={'name':'ethan','books':['book1','book2','book3']}3.>>>d2=deepcopy(d1)#創(chuàng)造出一個副本4.>>>5.>>>d2['books'].remove('book2')#對d2的任何修改不會影響到d16.>>>d27.{'books':['book1','book3'],'name':'ethan'}8.>>>d19.{'books':['book1','book2','book3'],'name':'ethan'}10.>>>11.>>>d1['books'].remove('book3')#對d1的任何修改也不會影響到d212.>>>d113.{'books':['book1','book2'],'name':'ethan'}14.>>>d215.{'books':['book1','book3'],'name':'ethan'}get當我們試圖訪問字典中不存在的項時會出現(xiàn)KeyError,但使用get就可以避免這個問題??纯蠢樱?.>>>d={}2.>>>d['name']3.Traceback(mostrecentcalllast):4.File"<stdin>",line1,in<module>5.KeyError:'name'6.>>>printd.get('name')7.None8.>>>d.get('name','ethan')#'name'不存在,使用默認值'ethan'9.'ethan'10.>>>d11.{}-46-字典setdefaultsetdefault方法用于對字典設(shè)定鍵值。使用形式如下:1.dict.setdefault(key,default=None)看看例子:1.>>>d={}2.>>>d.setdefault('name','ethan')#返回設(shè)定的默認值'ethan'3.'ethan'4.>>>d#d被更新5.{'name':'ethan'}6.>>>d['age']=207.>>>d8.{'age':20,'name':'ethan'}9.>>>d.setdefault('age',18)#age已存在,返回已有的值,不會更新字典10.2011.>>>d12.{'age':20,'name':'ethan'}可以看到,當鍵不存在的時候,setdefault返回設(shè)定的默認值并且更新字典。當鍵存在的時候,會返回已有的值,但不會更新字典。updateupdate方法用于將一個字典添加到原字典,如果存在相同的鍵則會進行覆蓋??纯蠢樱?.>>>d={}2.>>>d1={'name':'ethan'}3.>>>d.update(d1)#將字典d1添加到d4.>>>d5.{'name':'ethan'}6.>>>d2={'age':20}7.>>>d.update(d2)#將字典d2添加到d8.>>>d9.{'age':20,'name':'ethan'}10.>>>d3={'name':'michael'}#將字典d3添加到d,存在相同的key,則覆蓋11.>>>d.update(d3)-47-字典12.>>>d13.{'age':20,'name':'michael'}items/iteritemsitems方法將
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職數(shù)字媒體藝術(shù)設(shè)計(數(shù)字理論)試題及答案
- 2026年黑龍江單招專升本銜接備考題含答案想沖職業(yè)本科考生專用
- 2026年天津單招城市軌道交通運營管理職業(yè)適應(yīng)性題庫含答案
- 2026年天津單招職業(yè)適應(yīng)性測試時事政治職業(yè)認知模擬題含答案
- 2026年寧夏單招會計專業(yè)中職生技能高頻題含答案含賬務(wù)處理
- 2026年遼寧單招學(xué)前教育專業(yè)技能模擬卷含答案玩教具制作方向
- 2026年河南單招康復(fù)治療專業(yè)職業(yè)適應(yīng)性題庫含答案
- 2026年遼寧單招工業(yè)機器人技術(shù)維護專業(yè)技能經(jīng)典題集含答案
- 2026年山西單招文化素質(zhì)省統(tǒng)考經(jīng)典題含答案2023-2025年精校版
- 2026年浙江中職生單招專業(yè)技能對口沖刺卷含答案原專業(yè)11適配
- 企業(yè)數(shù)據(jù)安全管理制度
- 2025年公務(wù)員多省聯(lián)考《申論》題(陜西A卷)及參考答案
- 摘菜勞動課件
- 2025義齒行業(yè)市場分析報告
- DB34∕T 4796-2024 藥品臨床綜合評價質(zhì)量控制規(guī)范
- 2025年公共管理與公共政策專業(yè)考試試卷及答案
- 2025年秋北京版(2024)小學(xué)英語五年級上冊(期中)綜合詞匯句子專項訓(xùn)練題及答案
- 蔚來智駕安全培訓(xùn)課件
- 液壓設(shè)備結(jié)構(gòu)設(shè)計與安全規(guī)范
- DB65T 2201-2014 新疆主要造林樹種苗木質(zhì)量分級
- 高校教學(xué)副院長工作匯報
評論
0/150
提交評論