python菜鳥日記9

2021-07-04 21:34:29 字數 4027 閱讀 8628

1.collections模組中有乙個namedtuple函式,它用來建立乙個自定義的tuple物件,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素,這樣一來,我們用namedtuple可以很方便地定義一種資料型別,它具備tuple的不變性,又可以根據屬性來引用,使用十分方便。

舉例: >>>from collections import namedtuple

>>>b=namedtuple('b',['x','y'])

>>>a=b(1,2)

>>> a.x

1>>> a.y

2這其實就是用namedtuple來自定義了乙個型別為tuple的只有屬性的簡單類,b是型別名,x,y是b的屬性,然後a又相當於b的乙個例項物件。

2.collections模組中有乙個deque函式使用list儲存資料時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性儲存,資料量大的時候,插入和刪除效率很低。

deque是為了高效實現插入和刪除操作的雙向列表,適合用於佇列和棧。

舉例: >>> from collections import deque

>>> a=deque(['1','1','2','3','4','5','6','7','6','6','5','4','4','3','3','2','2','6','7','8'])

說明:deque函式就是將實參列表進行處理返回乙個雙向列表,這樣就加快了列表的增加和刪除大量資料的效率了

3.collections模組中counter函式是乙個簡單的計數器。

舉例: from collections import counter

>>> c=counter()

>>> for i in 'nanjinghebeijing':

c[i]=c[i]+1

>>> c

counter()

說明:從上例中可以發現,其實counter()函式返回的其實乙個字典,因為counter實際上也是dict的乙個子類,而該字典中的key是新新增的,value則是初始值為0

綜上所述:其實collections模組提供了一些有用的集合類,可以根據需要選用

4.base64是一種最常見的二進位制編碼方法,當我們用記事本開啟exe、jpg、pdf這些檔案時,我們都會看到一大堆亂碼,因為二進位制檔案包含很多無法顯示和列印的字元,所以

如果要讓記事本這樣的文字處理軟體能處理二進位制資料,就需要乙個二進位製到字串的轉換方法。

舉例: >>> a='我是漢字'

>>> b=a.encode('utf-8')

>>> type(b)

>>> base64.b64encode(b)

b'5oir5piv5rgj5a2x'

>>> b=b'asdasd'

>>> type(b)

>>> base64.b64encode(b)

b'yxnkyxnk'

說明:3.x版本中base不能直接對漢字字串進行編碼,否則報錯'str' does not support the buffer inte***ce,只能對二進位制的數字,字母字串進行轉碼,所以總的來說,

base64轉碼只能對二進位制字串(也就是byte型別的字串)進行轉碼

5.base64由於=字元也可能出現在base64編碼中,但=用在url、cookie裡面會造成歧義,所以,很多base64編碼後會把=去掉,去掉=後怎麼解碼呢?因為base64是把3個位元組變為4個位元組,所以,base64編碼的長度永遠是4的倍數,因此,需要加上=把base64字串的長度變為4的倍數,就可以正常解碼了,base64是一種任意二進位製到文字字串的編碼方法,常用於在url、cookie、網頁中傳輸少量二進位制資料

6.由於標準的base64編碼後可能出現字元+和/,在url中就不能直接作為引數,所以又有一種"url safe"的base64編碼,其實就是把字元+和/分別變成-和_;

7.python的hashlib提供了常見的摘要演算法,如md5,sha1等等,摘要演算法又稱雜湊演算法、雜湊演算法。它通過乙個函式,把任意長度的資料轉換為乙個長度固定的資料串(通常用16進製制的字串表示)。

md5舉例:>>> import hashlib

>>> a=hashlib.md5()

>>> a.update('wo de mi ma shi ?'.encode('utf-8'))

>>> print(a.hexdigest())

a9c67ba92fab3d497443e0f7f34b5372

>>> type(a)

說明:hashlib.md5()是乙個類,a是類的乙個例項,update()函式裡面的實參是二進位制字串。而對於sha1演算法和md5的用法是一樣的,就把上面的hashlib.md5換成hashlib.sha1

8.python3.x版本中的字串轉換為二進位制:

舉例: >>> a=b'我是誰'

syntaxerror: bytes can only contain ascii literal characters.

>>> a='我是誰'.encode('utf-8')

>>> type(a)

說明:漢字字串只能通過utf-8轉換為二進位制,而不能通過b'漢字'來進行轉換為二進位制

9.有沒有可能兩個不同的資料通過某個摘要演算法得到了相同的摘要?完全有可能,因為任何摘要演算法都是把無限多的資料集合對映到乙個有限的集合中,這種情況稱為碰撞。

10.python的內建模組itertools提供了非常有用的用於操作迭代物件的函式和「無限」迭代器,itertools模組提供的全部是處理迭代功能的函式,它們的返回值不是list,而是iterator

只有用for迴圈迭代的時候才真正計算

一、itertools提供的幾個無限迭代器

count(n)無限迭代器

舉例: >>> import itertools

>>> a=itertools.count(2)

>>> for i in a:

print(i)23

4567

說明:count(n)無限迭代器中,n表示從哪個數字開始,因為count()會建立乙個無限的迭代器,所以上述**會列印出自然數序列,根本停不下來,只能按ctrl+c退出。

cycle無線迭代器:將傳入的序列進行無限重複(字串也是序列)

舉例: >>> import itertools

>>> b=itertools.cycle('abcdefg')

>>> for i in b:

print(i)ab

cdef

gabc

defg

repeat()負責把乙個引數無限重複下去,不過如果提供第二個引數就可以限定重複次數

舉例: >>> a=itertools.repeat('asda',5)

>>> for i in a:

print(i)

asda

asda

asda

asda

asda

二、itertools提供的幾個迭代器操作函式更加有用

chain()可以把一組迭代物件串聯起來,形成乙個更大的迭代器,也就是更大的可迭代物件

舉例:for i in itertools.chain('uyi','uyiyu','asdas','dasdasd'):

print(i)uy

iuyi

y...

takewhile()函式根據條件判斷來截取出乙個有限的序列

舉例: >>> a=itertools.count()

>>> for i in itertools.takewhile(lambda x:x<=5,a):

print(i)01

2345

說明:這個函式的功能就是利用第乙個引數表示式,來限制第二個引數(迭代器)的輸出,其中第乙個引數表示式是乙個函式。

11.序列:包括列表、元組、字串、unicode字串、buffer物件和xrange物件,列中的每個元素被分配乙個序號——即元素的位置,也稱為索引。第乙個索引是 0,第二個則是 1,以此類推。序列中的最後乙個元素標記為 -1,倒數第二個元素為 -2,一次類推,因此,集合和字典不是序列,因為他們都用key指定乙個value而不是用索引

python菜鳥日記5

1.在python中我們可以匯入模組,來呼叫模組裡面的函式,在乙個模組中,我們可以定義很多的函式和變數,但有些函式我們並不希望被別人使用,只希望在模組內部使用,那麼,我們可以通過 下劃線 字首來實現,比如 abc,qiuhe,但是python並沒有強制限制訪問函式或變數,只是一種程式設計的習慣而已 ...

python菜鳥日記6

在函式呼叫的過程中,假設函式裡面有迴圈巢狀的函式,那麼在裡面的函式遇到異常的時候,就終止函式,後面的語句將不會執行,而try後面的語句也將會中止執行,轉而except。異常其實也是乙個類,是乙個物件 此外,如果沒有錯誤發生,可以在except語句塊後面加乙個else,當有錯誤發生時,會自動執行els...

python菜鳥日記8

1.python中的多程序程式設計概念 由於python是跨平台的,自然也應該提供乙個跨平台的多程序支援。multiprocessing模組就是跨平台版本的多程序模組。multiprocessing模組提供了乙個process類來代表乙個程序物件。2.python中的多執行緒程式設計具體做法 當我們...