1. 程式人生 > >Python核心資料型別——元祖、檔案及其他

Python核心資料型別——元祖、檔案及其他

最後一個Python集合型別——元組(tuple)

屬性如下:
任意物件的有序集合
通過偏移存取
屬於不可變序列型別
固定長度、異構、任意巢狀
物件引用的陣列

實際應用中的元組:

>>> (1,2)+(3,4)
(1, 2, 3, 4)
>>> (1,2)*4
(1, 2, 1, 2, 1, 2, 1, 2)
>>> T = (1,2,3,4)
>>> T[0],T[1:3]
(1, (2, 3))
元組的特殊語法:逗號和圓括號

因為圓括號也可以把表示式括起來,如果圓括號裡的單一物件是元組物件而不是一個簡單的表示式,需要對Python進行特別說明,如果確實想得到一個元組,只要在這一單個元素之後、關閉圓括號之前加一個逗號就可以了。
>>> x = (40)
>>> x
40
>>> y = (40,)
>>> y
(40,)
作為特殊情況,在不會引起語法衝突的情況下,Python允許忽略元組的圓括號
===========================================================================================

轉換、方法以及不可變性

如果你想對元組進行排序,通常先得將它轉換為列表並使其成為一個可變物件,才能獲得使用排序方法的許可權,或者使用新的sorted內建方法,它接受任何序列物件:

>>> T = ('cc','aa','dd','bb')
>>> T.sort()
Traceback (most recent call last):
  File "<pyshell#91>", line 1, in <module>
    T.sort()
AttributeError: 'tuple' object has no attribute 'sort'
>>> tmp = list(T)
>>> tmp.sort()
>>> tmp
['aa', 'bb', 'cc', 'dd']
>>> T = tuple(tmp)
>>> T
('aa', 'bb', 'cc', 'dd')
>>> sorted(T)
['aa', 'bb', 'cc', 'dd']
列表解析也可用於元組的轉換。例如,下面這個由元組生成的列表,過程中將每一項都加上20:
>>> T = (1,2,3,4,5)
>>> L = [x +20 for x in T]
>>> L
[21, 22, 23, 24, 25]
【列表解析是名副其實的序列操作——它們總會建立新的列表,但也可以用於遍歷包括元組、字串以及其他列表在內的任何序列物件。我們將會看到,列表解析甚至可以用在某些並非實際儲存的序列之上——任何可遍歷的物件都可以,包括可自動逐行讀取的檔案】

===========================================================================================
檔案
內建open函式會建立一個Python檔案物件,可以作為計算機上的一個檔案連結

操作 解釋
output=open(r'C:\spam','w') 建立輸出檔案(‘w’是指寫入)
input=open('data','r') 建立輸入檔案(‘r’是指讀寫)
input=open('data') 與上一行相同(‘r’是預設值)
aString=input.read() 把整個檔案讀進單一字串
aString=input.read(N) 讀取之後的N個位元組(一個或多個)到一個字串
aString=input.readLine() 讀取下一行(包括行末識別符號)到一個字串
aList=input.readlines() 讀取檔案到字串列表
output.write(aString) 寫入位元組字串到檔案
output.writelines(aList) 把列表內所有的字串寫入檔案
output.close() 手動關閉(當檔案收集完成時會替你關閉檔案)
output.flush() 把輸出緩衝區刷到硬碟中,但不關閉檔案
anyFile.seek(N) 修改檔案位置到偏移量N處以便進行下一個操作
for line in open('data'):use line 檔案迭代器一行一行地讀取
open('f.txt',encoding='latin-1') Python3.0 Unicode文字檔案(str字串)
open('f.bin','rb') Python3.0二進位制byte檔案(bytes字串)

-----------------------------------------------------------------------------------------------------------------------------------------------------------

開啟檔案

為了開啟一個檔案,程式會呼叫內建open函式,首先是外部名,接著是處理模式。模式典型地用字串‘r’代表為輸入開啟檔案(預設值),‘w’代表為輸出生成並開啟檔案,‘a’代表為在檔案尾部追加內容而開啟檔案。

-----------------------------------------------------------------------------------------------------------------------------------------------------------
使用檔案

基礎用法提示:
檔案迭代器是最好的讀取行工具
內容是字串,不是物件
close是通常選項
檔案是緩衝的並且是可查詢的

-----------------------------------------------------------------------------------------------------------------------------------------------------------

實際應用中的檔案

>>> myfile = open('myfile.txt','w')
>>> myfile.write('hello text file\n')
16
>>> myfile.write('goodbye text file\n')
18
>>> myfile.close()
>>> myfile = open('myfile.txt','r')
>>> myfile.readline()
'hello text file\n'
>>> myfile.readline()
'goodbye text file\n'
>>> myfile.readline()
''
注意第三個readline呼叫返回一個空字串,這是Python檔案方法告訴我們已經到達檔案底部(檔案的空行是含有新行符的字串,而不是空字串)

如果想要顯示帶有行末字元解釋的檔案內容,用檔案物件的read方法把整個檔案讀入到一個字串中,並列印它:

>>> open('myfile.txt').read();
'hello text file\ngoodbye text file\n'

>>> print(open('myfile.txt').read())
hello text file
goodbye text file
如果想要一行一行地掃描一個文字檔案,檔案迭代器往往是最佳選擇:
>>> for line in open('myfile.txt'):
	print(line,end='')

	
hello text file
goodbye text file
【int和一些其他轉換方法會忽略數字旁邊的空白】
【eval函式能夠把字串當作可執行程式程式碼(從技術上講,就是一個含有Python表示式的字串)】
-----------------------------------------------------------------------------------------------------------------------------------------------------------
pickle模組是能夠讓我們直接在檔案中儲存幾乎任何Python物件的高階工具,也並不要求我們把字串轉換來轉換去,它就好像是超級通用的資料格式化的解析工具。例如,想要在檔案中儲存字典,就直接用pickle來儲存。
>>> D ={'a':1,'b':2}
>>> F = open('datafile.pkl','wb')
>>> import pickle
>>> pickle.dump(D,F)
>>> F.close()
之後,將來想要取回字典時,只要簡單地再用一次pickle進行重建就可以了:
>>> F = open('datafile.pkl','rb')
>>> E = pickle.load(F)
>>> E
{'a': 1, 'b': 2}
我們取回等價的字典物件,沒有手動斷開或轉換的要求。pickle模組執行所謂的物件序列化(object serialization),也就是物件和位元組字串之間的相互轉換。
===========================================================================================

重訪型別分類

現在我們已經看到所有實際中的Python核心內建型別,讓我們再看一看它們所共有的一些屬性,以此來結束我們的物件型別之旅。

1.物件根據分類來共享操作;例如,字串、列表和元組都共享諸如合併、長度和索引等序列操作;
2.只有可變物件(列表、字典和集合)可以在原處修改;我們不能原處修改數字、字串或元組
3.集合類似於一個無值的字典的鍵,但是,它們不能對映為值,並且沒有順序;因此,集合不是一個對映型別或者序列型別。

===========================================================================================

“==”操作符測試值的相等性。Python執行相等測試,遞迴地比較所有內嵌物件。
“is”操作符測試物件的一致性。Python測試二者是否是同一個物件(也就是說,在同一個記憶體地址中)

數字如果為非零,則為真
其他物件如果非空,則為真

留意迴圈資料結構:如果遇到一個複合物件包含指向自身的引用,就稱之為迴圈物件。無論何時Python在物件中檢測到迴圈,都會列印成[...],而不會陷入無限迴圈

#這樣可以交換元素值
>>> X = 'spam'
>>> Y = 'eggs'
>>> X,Y = Y,X
>>> X
'eggs'
>>> Y
'spam'