Python學習筆記整理

2022-09-14 01:06:08 字數 4938 閱讀 9458

前言:大四剛剛畢業,學的土木可是很喜歡程式設計,奈何進的網際網路運營崗,琢磨著轉崗,工科出身的還是想做技術。從六月份學了這麼久,不寫些部落格沉澱一下技術,感覺都忘光了,不多說了。以後詳細介紹。。。

第一章 python資料型別(想到**寫**)

python這門語言我最喜歡的還是他的一致性,如果你學過其他語言,可能會對len(colleciton)而不是collection.len()寫法覺得不適合。其實這就是我一直不理解的pythonic,python風格的關鍵。這種設計思想完全體現在python的資料型別上。而資料模型所描述的api,為使用最地道的語言特性來構建你自己的物件提供了工具。

資料模型其實是對python框架的描述,他規範了這門語言自身構建模組的藉口,這些模組包括但不限於序列,迭代器,函式,類,和上下文管理器。不管在那種框架下寫程式,都會花費大量時間去實現那些被框架本身呼叫的方法,python也不例外。python直譯器碰到特殊的語句時,會使用特殊的方法去啟用一些基本的物件操作,這些特殊方法的名字以雙下劃線形式(__getitem__)。比如obj[key]的背後就是__getitem__方法,為了能求得my_collection[key]的值,直譯器實際上會呼叫my_collection._collection.__getitem__(key)。

這些特殊方法名能讓你自己的物件實現和支援以下的語言構架,並與之互動:

迭代集合類

屬性訪問

運算子過載

函式和方法的呼叫

物件的建立和銷毀

字串表示形式和格式化

管理上下文(with模組)

magic和dunder

魔法函式(magic method)是特殊方法的暱稱。有些python開發者在提到__getitem__這個魔法函式的時候,會用「下劃線-下劃線-getitem"這種說法,但是顯然這種說法有點問題,因為像__x這種命名在python裡還有其他含義(python的私有屬性,這個可能後邊會寫)。

一摞python風格的紙牌

接下來我會用乙個非常簡單的例子來展示如何實現__getitem__和__len__著兩個魔法函式,通過這個例子也能看到魔法函式的強大之處。

# 一摞有序的紙牌

import collections

card =collections.namedtuple("card",['rank','suit'])

class frenchdeck:

ranks = [str(n for n in range(2,11))] + list('jqka')

suits = 'spades diamonds clubs hearts'.split()

def __init__(self):

self._cards = [card(rank,suit) for suit in self.suits

for rank in self.ranks]

def __len__(self):

return len(self._cards)

def __getitem__(self,position):

return self._cards[position]

首先,我們用collections.namedtuple 構建了乙個簡單的類來表示一張紙牌。自python2.6開始,nametuple就加入了python中,用以構建只要少數屬性但沒有方法的物件,比如資料庫條目。----

說道這裡我想說一下,collections模組

collections模組是python內建的乙個集合模組,提供了很多有用的集合類。

namedtuple

nametuple是乙個函式,他用來建立乙個自定義的元組物件,並且規定了元組元素的個數,並可以用屬性而不是索引來引用元組的某個元素。可以通過nametuple來定義一種資料型別,它具備元組的不變性,又可以根據屬性來引用,十分方便。

>>> from collections import nametuple

>>>mytuple = nametuple('mytuple',['mytuple',['x','y'])

>>>n = mytuple(11,22)

>>>n.x

11>>>n.y

22

deque模組

使用list儲存資料結構時,按照索引訪問元素很快,但是插入和刪除元素就很慢了,因為list時線性儲存,資料量大的時候,插入和刪除效率很低。deque是為了高效實現插入和刪除操作的雙向列表,適用於佇列和棧。

有序字典的應用。ordereddict的有序性是按照插入的順序,而不是key的順序。

>>>from collections import ordereddict

>>>d = dict(['a',1),('b',2),('c',3)])

>>>d # dict的key是無序的

'a':1,'c':3,'b':2}

>>> od = ordereddict([('a',1),('b',2),('c',3)])

>>> od # ordereddict的key是有序的

orderedict([('a',1),('b',2),('c',3)])

通過ordereddict可以實現乙個fifo(先進先出)的字典,當容量超出限制後,先刪除最早新增的key。

from collections import ordereddict

---class lastupdatedordereddict(ordereddict):

def __init__(self, capacity):

super(lastupdatedordereddict, self).__init__()

self._capacity = capacity

def __setitem__(self, key, value):

containskey = 1 if key in self else 0

if len(self) - containskey >= self._capacity:

last = self.popitem(last=false)

print('remove:', last)

if containskey:

del self[key]

print('set:', (key, value))

else:

print('add:', (key, value))

ordereddict.__setitem__(self, key, value)

counter

簡單的計數器

>>>from collections import orderedict

>>>c = counter()

>>>for ch in 'programming':

... c[ch] = c[ch] + 1

...>>> c

counter ('g:2','m':2,'r':2,'a',1,'i':1,'o':1,'n':1,'p':1})

defaultdict

使用字典時,如果引用key不存在,就會丟擲keyerror,如果希望key不存在時,返回乙個預設值,就可以用defaultdict

>>> from collections import defaultdict

>>> mydict = defaultdict(lambda:'n/a')

>>> mydict['key1'] = 'abc'

>>> mydict['key1'] #字典的key1存在

'abc'

>>> mydict['key2']#字典的key2不存在,返回預設值為'n/a'

'n/a'

注意預設值是呼叫函式返回的,而函式在建立defaultdict物件時傳入。除了key不存在而返回預設值,其他功能與普通字典無異。

然後我們繼續說卡牌的事兒,寫跑偏了。。。。。。

首先,我們用collections.namedtuple構建了乙個簡單的類來表示一張卡牌。自python2.6開始,namedtuple就加入到python了。用以構建只有少數屬性但是沒有方法的物件,比如資料庫條目。如下面這個終端所示,利用nametuple,我們可以

很容易的得到乙個紙牌物件:

>>>beer_card = card('7','diamonds')

>>>beer_card

card(rank='7',suit='diamonds')

當然,我們這個例子主要還是關注frenchdeck這個類,它即短小又精悍。首先,他跟任何標準python集合型別一樣,可以用len()函式來檢視一疊拍有多少張?

>>>deck = frenchdeck

>>>len(deck)

52從一疊牌中抽取特定的一張紙牌,比如說第一張或者最後一張,是很容易的:deck[0]或deck[-1].這都是由__getitem__方法提供的:

>>>deck[0]

card(rank='2',suit='spades')

>>>deck[-1]

card(rank='a',suit='hearts')

我們需要單獨寫乙個方法用來隨機抽取一張紙牌嗎?沒必要,python已經內建了從乙個序列中隨你選出乙個元素的函式random.choice,我們直接把它用在這一摞紙牌例項上就好:

>>> from random import choice

>>> choice(deck)

card(rank='3',suit='hearts')

>>>choice(deck)

card(rank='k',suit='spades')

>>>choice(deck)

card(rank='2',suit='clubs')

python 學習筆記整理

python中比較喜歡用in這個操作,1.在 for 迴圈遍歷 list l 時,for name in l 2.在訪問dict r 時,可以先判斷值是否在 r 中,if nana in r 其中 nana 是 r 中儲存的某個 key 值,r key 是其對應的 value 值。3.遍歷dict ...

《python深度學習》筆記整理

電影二分類問題 新聞多分類問題 通過分類編碼 也叫one hot 編碼 對標籤進行編碼,然後使用categorical crossentropy 作為損失函式。將標籤編碼為整數,然後使用 sparse categorical crossentropy 損失函式。波士頓房價的回歸問題在將原始資料輸入神...

Python學習過程筆記整理(一)

編碼方式 utf8編碼方式 coding utf 8 注釋 行注釋 塊注釋 或 基礎語法 print 輸出預設換行,不換行需要末尾加end 1 print a end 2 print b input 輸入 1 something input 請輸入一些文字 2print something 變數名稱...