前言:大四剛剛畢業,學的土木可是很喜歡程式設計,奈何進的網際網路運營崗,琢磨著轉崗,工科出身的還是想做技術。從六月份學了這麼久,不寫些部落格沉澱一下技術,感覺都忘光了,不多說了。以後詳細介紹。。。
第一章 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__著兩個魔法函式,通過這個例子也能看到魔法函式的強大之處。
# 一摞有序的紙牌>>> from collections import nametupleimport 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來定義一種資料型別,它具備元組的不變性,又可以根據屬性來引用,十分方便。
>>>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 變數名稱...