Python-元組(tuple),文件


基礎:

1. 元組由簡單對象組構成。

2. 元組與列表類似,不過不能在原處修改(它們是不可變的),並且通常寫成圓括號(),而不是方框號[]中的一系列項。

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

>>> (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))

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

>>> x = (40)  # An integer!

>>> x

40

>>> y = (40,)  #A tuple containing an integer

>>> y

(40,)

注:在不會引發語法沖突的情況系啊,Python允許忽略元組的圓括號。

如果圓括號里的單一對象是元組對象而不是一個簡單的表達式(圓括號可以把表達式括起來), 需要對Python進行特別說明。

如果確實像得到一個遠足,只要在這一單個元素之后,關閉圓括號之前加一個逗號即可。

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

>>> T = ('cc', 'aa', 'dd', 'bb’)

>>> tmp = list(T)          # Make a list from a tuple's items

>>> tmp.sort()

>>> tmp

['aa', 'bb', 'cc', 'dd']

>>> T = tuple(tmp)          # Make a tumple from the list's items

>>> T

('aa', 'bb', 'cc', 'dd')

>>> sorted(T)            # Or use the sorted built-in

['aa', 'bb', 'cc', 'dd']

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

>>> T = (1, [2,3], 4)

>>> T[1] = 'spam'        # This fails: can't change tuple itself

TypeError

>>> T[1][0] = 'spam'       # This works: can change mutables inside

>>> T

(1, ['spam', 3], 4)

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

eval能夠把字符串當做可執行程序代碼(從技術上來講,就是一個含有Python表達式的字符串)

>>> line = "[1,2,3]${'a':1, 'b':2}\n"

>>> line

"[1,2,3]${'a':1, 'b':2}\n"

>>> parts = line.split('$')

>>> parts

['[1,2,3]',"{'a':1, 'b':2}\n"]

>>> eval(parts[0])

[1,2,3]

>>> objects = [eval(P) for P in parts]

>>> objects

[[1,2,3], {'a':1, 'b':2}]

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

用pickle存儲Python的原生對象

pickle與eval的區別:

eval能夠執行Python的任何表達式,有可能會刪除計算機上所有文件的表達式;

pickle能夠存儲Python原生對象,也不要求把字符串轉換。

>>> D = {'a': 1, 'b': 2}

>>> F = open('datafile.pkl', 'wb')

>>> import pickle

>>> pickle.dump(D, F)      # Pickle any object to file

>>> F.close()

之后想要取回字典時,只要簡單的再用一次pickle進行重建就可以了;

>>> F = open('datafile.pkl', 'wb')

>>> E = pickle.load(F)

>>> E

{'a': 1, 'b': 2}

>>> open('datafile.pkl', 'rb').read()        # Format is prone to change!

b'\x90\x03}q\x00(X\x01\x00\x00…….'

注:在這里是使用二進制模式打開用於儲存pickle化的對象的文件,因為二進制模式總是Python 3.X中必須的,同時pickle程序創建和使用一個bytes字符串對象,並且這些對象意味着二進制模式文件(文本模式文件意味着Python 3.X中的str字符串)

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

struct模塊能夠創造並解析打包的二進制數據;

從某種意義上說,它是另一個數據轉換工具。

>>> F = open('data.bin', 'wb')

>>> import struct

>>> data = struct.pack('>i4sh', 7, 'spam', 8)      # Make packed binary data

>>> data

b'\x00\x00\x00\x07spam\x00\x08'

>>> F.wirte(data)                    # Write byte string

>>> F.close()

 

>>> F = open('data.bin', 'rb')

>>> data = F.read()

>>> data

b'\x00\x00\x00\x07spam\x00\x08'

>>> values = struct.unpack('>i4sh', data)        # Convert to Python objects

>>> values

(7, 'spam', 8)

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

引用:

>>> X = [1,2,3]

>>> L = ['a', X, 'b']

>>> D = {'x': X, 'y': 2}

>>> X[1] = 'surprise'

>>> L 

['a', [1, 'surprise', 3], 'b']

>>> D

{'x': [1, 'surprise', 3], 'y': 2}

 

復制:

>>> L = [1,2,3]

>>> D = {'a': 1, 'b': 2}

>>> A = L[:]

>>> B = D.copy()

>>> A[1] = 'N1'

>>> D['c'] = 'spam'

>>> L,D

([1,2,3], {'a': 1, 'c': 'spam', 'b': 2})

>>> A,B

([1, 'Ni', 3], {'a': 1, 'b': 2})

如果將引用中修改為

>>> X = [1,2,3]

>>> L = ['a': X[:], 'b']

>>> D = {'x': X[:], 'y': 2]

則X的修改不會影響到L與D

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

判斷“一致性”與“相等性”

>>> L1 = [1,('a', 3)]

>>> L2 = [1,('a', 3)]

>>> L1 == L2, L1 is L2

(True, False)

“==”判斷相等性,“is”判斷一致性;

>>> S1 = 'spam'

>>> S2 = 'spam'

>>> S1 == S2, S1 is S2

(True, True)

>>> S1 = 'a longer string'

>>> S2 = 'a longer string'

>>> S1 == S2, S1 is S2

(True, false)

理由:

Python內部暫時存儲並重復使用段字符串作為最佳化,因為'spam'實際上在內存中只存在一個字符串用於分享;

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

None對象

None是Python中一種特殊數據類型的唯一值,一般起一個空的占位作用,與C語言中的NULL指針類似。

None不是意味着“未定義”。None是某些內容,而不是沒有內容。它是一個真正的對象,並且有一塊內存,由Python給定一個內置的名稱。

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

復制

>>> L = [4, 5, 6]

>>> X = L * 4

>>> Y = [L] * 4

>>> X

[4,5,6,4,5,6,4,5,6,4,5,6]

>>> Y

[[4,5,6],[4,5,6],[4,5,6],[4,5,6]]

>>> L[1] = 0                # Impacts y but not X

>>> X

[4,5,6,4,5,6,4,5,6,4,5,6]          # 賦值

>>> Y

[[4,0,6],[4,0,6],[4,0,6],[4,0,6]]      # 引用

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

嵌套,無限循環

無論何時Python在對象中檢測到循環,都會打印成[...],而不會陷入無限循環

>>> L = ['grail']

>>> L.append(L)

>>> L

['grail', [...]]

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

不可變類型不可以在原處改變

如果需要,可以通過分片、合並等操作來,通過創建一個新的對象,然后向后賦值給原因用

T = (1,2,3)

T[2] = 4      #Error!

T = T[:2] +(4,)    #OK: (1,2,4)

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

 元組支持所有一般的序列操作,但是他們沒有方法,因為是不可變的而不能進行任何在原處的修改。

注:

  內置函數與表達式可以跨越多種對象類型,如內置的len函數會傳回Python任何容器對象的長度(包含元素的數目),包括元組在內;

  方法特定於一種單個的對象類型,盡管通過某些方式可以在多種類型上使用(例如,索引,在列表和元組上都有效)

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

>>> L = [1,2,3,4]

>>> L[3:1] = ['?']

>>> L

[1,2,3,'?',4]

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

>>> L = [1,2,3,4]

>>> L[2] = []

>>> L

[1,2,[],4]

>>> L[2:3] = []

>>> L

[1,2,4]

>>> del L[0]

>>> L

[2,4]

>>> del L[1:]

>>> L

[2]

>>> L[1:2] =1

TypeError

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

元組的賦值運算

>>> X = 'spam'

>>> Y = 'eggs'

>>> X, Y = Y, X

>>> X

'eggs'

>>> Y

'spam'

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

+ 不適用於字典,因為那不是序列;

append方法只適用於列表,不適用於字符串;

append假設其目標是可變的,因為這是一個原地的擴展,字符串是不可變的。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM