Python2和Python3的區(qū)別
一、語法
- Python2 中使用
print輸出語句,Python3 中去掉print語句,使用print()代替; - Python2 中使用內(nèi)建函數(shù)
raw_input(),Python3 中去掉raw_input(),使用input()代替; - Python2 中支持
<>作為!=的同義詞,Python3 中只支持!=,不再支持<>; - Python2 中使用
range生成list對象,xrange創(chuàng)建生成器,Python3 中使用range替代xrange,生成列表需要顯式調(diào)用;例:
>>> list(range(5))
[0,1,2,3,4]
二、編碼
Python2 中有基于ASCII的 str()類型,可使用unicode()函數(shù)轉(zhuǎn)成unicode類型,但沒有byte類型;Python3 中有unicode(utf-8)字符串,以及兩個字節(jié)類bytes和bytearrays。
三、數(shù)據(jù)類型
Python3 中去除long類型,只剩下一種整型int,對應(yīng)Python2 中的long;新增bytes類型,對應(yīng)Python2 中的八位串。
四、除法運算
Python2 中除法運算,整數(shù)相除會將小數(shù)部分忽略掉;Python3 中整數(shù)相除,結(jié)果為浮點數(shù)。
元編程
給函數(shù)添加一個包裝,主要目標(biāo)是創(chuàng)建函數(shù)和類,并用它來操縱代碼,主要技術(shù)是使用裝飾器、類裝飾器和元類。
一個裝飾器就是一個函數(shù),接受一個函數(shù)作為參數(shù)并返回一個新的函數(shù),例:
@timethis
def countdown(n):
pass
等價于:
def countdown(n):
pass
countdown = timethid(countdown)
// TODO 帶參數(shù)的裝飾器和類裝飾器
日志logging
日志級別:DEBUG,INFO,WARNING,ERROR,CRITICAL,優(yōu)先級由低到高,分別對應(yīng)的函數(shù) debug(),info(),warning(),error(),critical()。
網(wǎng)絡(luò)編程
套接字
兩個端點的程序之間的“信息通道”,即實現(xiàn)不同端點上的程序通信。程序可能分布在不同的計算機上(通過網(wǎng)絡(luò)連接),通過套接字相互發(fā)送信息。套接字包括兩個:服務(wù)器套接字和客戶機套接字。在創(chuàng)建一個服務(wù)器套接字后,讓它等待連接。這樣它就在某個網(wǎng)絡(luò)地址處(IP地址和一個端口的組合)監(jiān)聽,直到有客戶端套接字連接。連接完成后兩者即可進行交互。
面向連接的套接字,即在通信之前需要建立一條連接,實現(xiàn)這種連接的主要協(xié)議為傳輸控制協(xié)議(即TCP),創(chuàng)建TCP套接字需指定套接字類型為SOCK_STREAM,例:
tcpSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
無需建立連接即可進行通訊,實現(xiàn)這種連接的主要協(xié)議就是用戶數(shù)據(jù)報協(xié)議(即UDP),創(chuàng)建UDP套接字需指定套接字類型為SOCK_DGRAM,例:
udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
服務(wù)器端套接字函數(shù)
s.bind() 綁定地址(主機,端口號對)到套接字
s.listen() 開始 TCP 監(jiān)聽
s.accept() 被動接受 TCP 客戶的連接,(阻塞式)等待連接的到來
客戶端套接字函數(shù)
s.connect() 主動初始化 TCP 服務(wù)器連接
s.connect_ex() connect()函數(shù)的擴展版本,出錯時返回出錯碼,而不是拋異常
公共用途的套接字函數(shù)
s.recv() 接收 TCP 數(shù)據(jù)
s.send() 發(fā)送 TCP 數(shù)據(jù)
s.sendall() 完整發(fā)送 TCP 數(shù)據(jù)
s.recvfrom() 接收 UDP 數(shù)據(jù)
s.sendto() 發(fā)送 UDP 數(shù)據(jù)
s.getpeername() 連接到當(dāng)前套接字的遠端的地址
s.getsockname() 當(dāng)前套接字的地址
s.getsockopt() 返回指定套接字的參數(shù)
s.setsockopt() 設(shè)置指定套接字的參數(shù)
s.close() 關(guān)閉套接字
創(chuàng)建 TCP 服務(wù)器
ss = socket() # 創(chuàng)建服務(wù)器套接字
ss.bind() # 把地址綁定到套接字上
ss.listen() # 監(jiān)聽連接
inf_loop: # 服務(wù)器無限循環(huán)
cs = ss.accept() # 接受客戶的連接
comm_loop: # 通訊循環(huán)
cs.recv()/cs.send() # 對話(接收與發(fā)送)
cs.close() # 關(guān)閉客戶套接字
ss.close() # 關(guān)閉服務(wù)器套接字(可選)
創(chuàng)建 TCP 客戶端
cs = socket() # 創(chuàng)建客戶套接字
cs.connect() # 嘗試連接服務(wù)器
comm_loop: # 通訊循環(huán)
cs.send()/cs.recv() # 對話(發(fā)送/接收
cs.close() # 關(guān)閉客戶套接字
創(chuàng)建 UDP 服務(wù)器
ss = socket() # 創(chuàng)建一個服務(wù)器套接字
ss.bind() # 綁定服務(wù)器套接字
inf_loop: # 服務(wù)器無限循環(huán)
cs = ss.recvfrom()/ss.sendto() # 對話(接收與發(fā)送)
ss.close() # 關(guān)閉服務(wù)器套接字
創(chuàng)建 UDP 客戶端
cs = socket() # 創(chuàng)建客戶套接字
comm_loop: # 通訊循環(huán)
cs.sendto()/cs.recvfrom() # 對話(發(fā)送/接收)
cs.close() # 關(guān)閉客戶套接字
Web編程
urlparse解析URL ( 統(tǒng)一資源定位符)#####
>>> import urlparse
>>> r = urlparse.urlparse("http://alice:secret
@ www.hostname.com:80/% 7Ealice/python.cgi?
query=text#sample")
>>> r
ParseResult(scheme='http',
netloc='alice:secret @ www.hostname.com:80',
path='/%7Ealice/python.cgi',
params='', query=' query=text', fragment='sample')
>>> r.port
80
URL的拼合
>>> r3 = urlparse.urljoin("http://www.baidu.com","ice.html")
>>> r3
'http://www.baidu.com/ice.html'