1.集合的基本操做(set)
集合是一個無序的,不重複的元素集合,他的主要做用是
去重:把一個列表變爲集合就自動去重了。
關係測試:測試兩組數據之間的交集,差集,並集等關係python
list_1 = [1,4,6,6,7,89]
list_1 = set(list_1)
list_2 = set([1,9,4,542,2,26,4,7,2])
#交集
list_1.instersection(list_2)
#並集
list_1.union(list_2)
#差集 -左邊有右邊沒有的
list_1.difference(list_2)
#子集判斷
list_1.issubset(list_2)#判斷一是否是二的子集
list_2.issuperset(list_1)#判斷一是否是二的父集
#對稱差集
list_1.symmetric_difference(list_2)
#若是兩個集合有一個空交集,則返回真
list_1.isdisjoint(list_2)編程
文件IO數據結構
讀文件:打開一個文件用open()方法open()返回一個文件對象,它是可迭代的
f = open('test.txt', 'r')
r表示是文本文件,rb是二進制文件。(這個mode參數默認值就是r)
若是文件不存在,open()函數就會拋出一個IOError的錯誤,而且給出錯誤碼和詳細的信息告訴你文件不存在
文件使用完畢後必須關閉,由於文件對象會佔用操做系統的資源,而且操做系統同一時間能打開的文件數量也是有限的
因爲文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。因此,爲了保證不管是否出錯都能正確地關閉文件,咱們可使用try ... finally來實現
try:
f = open('/path/to/file', 'r')
print(f.read())
finally:
if f:
f.close()
可是每次都這麼寫實在太繁瑣,因此,Python引入了with語句來自動幫咱們調用close()方法:
with open('/path/to/file', 'r') as f:
print(f.read())
python文件對象提供了三個「讀」方法: read()、readline() 和 readlines()。每種方法能夠接受一個變量以限制每次讀取的數據量。函數式編程
read() 每次讀取整個文件,它一般用於將文件內容放到一個字符串變量中。若是文件大於可用內存,爲了保險起見,能夠反覆調用read(size)方法,每次最多讀取size個字節的內容。
readlines() 之間的差別是後者一次讀取整個文件,像read() 同樣。readlines() 自動將文件內容分析成一個行的列表,該列表能夠由 Python 的 for ... in ... 結構進行處理。
readline() 每次只讀取一行,一般比readlines() 慢得多。僅當沒有足夠內存能夠一次讀取整個文件時,才應該使用 readline()。函數
注意:這三種方法是把每行末尾的'\n'也讀進來了,它並不會默認的把'\n'去掉,須要咱們手動去掉。測試
文件打開模式網站
r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】
w,只寫模式【不可讀;不存在則建立;存在則清空內容】
x, 只寫模式【不可讀;不存在則建立,存在則報錯】
a, 追加模式【可讀; 不存在則建立;存在則只追加內容】,文件指針自動移到文件尾。
"+" 表示能夠同時讀寫某個文件編碼
r+, 讀寫【可讀,可寫】
w+,寫讀【可讀,可寫】,消除文件內容,而後以讀寫方式打開文件。
x+ ,寫讀【可讀,可寫】
a+, 寫讀【可讀,可寫】,以讀寫方式打開文件,並把文件指針移到文件尾。
"b"表示以字節的方式操做,以二進制模式打開文件,而不是以文本模式。操作系統
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
注:以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,不能指定編碼設計
字符編碼
先說python2
py2裏默認編碼是ascii
文件開頭那個編碼聲明是告訴解釋這個代碼的程序 以什麼編碼格式 把這段代碼讀入到內存,由於到了內存裏,這段代碼實際上是以bytes二進制格式存的,不過即便是2進制流,也能夠按不一樣的編碼格式轉成2進制流,你懂麼?
若是在文件頭聲明瞭#_*_coding:utf-8*_,就能夠寫中文了,不聲明的話,python在處理這段代碼時按ascii,顯然會出錯, 加了這個聲明後,裏面的代碼就全是utf-8格式了
在有#_*_coding:utf-8*_的狀況下,你在聲明變量若是寫成name=u"大保健",那這個字符就是unicode格式,不加這個u,那你聲明的字符串就是utf-8格式
utf-8 to gbk怎麼轉,utf8先decode成unicode,再encode成gbk
再說python3
py3裏默認文件編碼就是utf-8,因此能夠直接寫中文,也不須要文件頭聲明編碼了,乾的漂亮
你聲明的變量默認是unicode編碼,不是utf-8, 由於默認便是unicode了(不像在py2裏,你想直接聲明成unicode還得在變量前加個u), 此時你想轉成gbk的話,直接your_str.encode("gbk")便可以
但py3裏,你在your_str.encode("gbk")時,感受好像還加了一個動做,就是就是encode的數據變成了bytes裏,我擦,這是怎麼個狀況,由於在py3裏,str and bytes作了明確的區分,你能夠理解爲bytes就是2進制流,你會說,我看到的不是010101這樣的2進制呀, 那是由於python爲了讓你能對數據進行操做而在內存級別又幫你作了一層封裝,不然讓你直接看到一堆2進制,你能看出哪一個字符對應哪段2進制麼?什麼?本身換算,得了吧,你連超過2位數的數字加減運算都費勁,還仍是省省心吧。
那你說,在py2裏好像也有bytes呀,是的,不過py2裏的bytes只是對str作了個別名(python2裏的str就是bytes, py3裏的str是unicode),沒有像py3同樣給你顯示的多出來一層封裝,但其實其內部仍是封裝了的。 這麼講吧, 不管是2仍是三, 從硬盤到內存,數據格式都是 010101二進制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes類型-->按照指定編碼轉成你能看懂的文字
編碼應用比較多的場景應該是爬蟲了,互聯網上不少網站用的編碼格式很雜,雖然總體趨向都變成utf-8,但如今仍是很雜,因此爬網頁時就須要你進行各類編碼的轉換,不過生活正在變美好,期待一個不須要轉碼的世界。
1.函數
定義: 函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名便可
特性:
減小重複代碼
使程序變的可擴展
使程序變得易維護
2.函數參數與局部變量
形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。
所以,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量
實參能夠是常量、變量、表達式、函數等,不管實參是何種類型的量,在進行函數調用時,
它們都必須有肯定的值,以便把這些值傳送給形參。所以應預先用賦值,輸入等辦法使參數得到肯定值
3.全局與局部變量
在子程序中定義的變量稱爲局部變量,在程序的一開始定義的變量稱爲全局變量。
全局變量做用域是整個程序,局部變量做用域是定義該變量的子程序。
當全局變量與局部變量同名時:
在定義局部變量的子程序內,局部變量起做用;在其它地方全局變量起做用。
4.遞歸
在函數內部,能夠調用其餘函數。若是一個函數在內部調用自身自己,這個函數就是遞歸函數。
遞歸特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小
3. 遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,
每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,
因此,遞歸調用的次數過多,會致使棧溢出)
5. 匿名函數
匿名函數就是不須要顯式的指定函數
#這段代碼
def calc(n):
return n**n
print(calc(10))
#換成匿名函數
calc = lambda n:n**n
print(calc(10))
#將匿名函數與其餘函數一塊兒使用纔是正確的用法
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
print(i)
6.函數式編程
函數是Python內建支持的一種封裝,咱們經過把大段代碼拆成函數,
經過一層一層的函數調用,就能夠把複雜任務分解成簡單的任務,這種分解能夠稱之爲面向過程的程序設計。
函數就是面向過程的程序設計的基本單元。
函數式編程中的函數這個術語不是指計算機中的函數(其實是Subroutine),而是指數學中的函數,即自變量的映射。
也就是說一個函數的值僅決定於函數參數的值,不依賴其餘狀態。好比sqrt(x)函數計算x的平方根,只要x不變,
不論何時調用,調用幾回,值都是不變的。
7.高階函數變量能夠指向函數,函數的參數能接收變量,那麼一個函數就能夠接收另外一個函數做爲參數,這種函數就稱之爲高階函數。