*全文較長,大約需要10-20分鐘看完,程式碼可左右滑動檢視
背景
PHP的$和->讓人輸入的手疼(PHP確實非常簡潔和強大,適合WEB程式設計),Ruby的#、@、@@也好不到哪裡(OO人員最該學習的一門語言)。
Python應該是寫起來最舒服的動態語言了,一下是一些讀書筆記,最後會介紹一下高階的用法:Mixin、Open Class、Meta Programming和AOP。
文中有些地方是用2.7開發的,如果您安裝的是3.x,有幾點需要註意:
- print “xxx” 要換成 print(“xxx”)
- __metaclass__ = type 刪除掉。
型別和運算式部分
你好,世界!
# coding=utf-8
print "你好,世界。"
乘方
print 2**10
變數
var = 1
print var
var = "段光偉"
print var
註:這裡的var = xxxx不叫變數賦值,而叫變數系結,python維護了一個符號表(變數名)以及符合對應的值,這個對應關係就叫做系結,一個符號可以系結任意型別的值。
獲取使用者輸入
#獲取使用者輸入
x = input("x:")
y = input("y:")
print x*y
註:input接受的是Python程式碼,輸入中可以訪問當前執行環境中的變數,如果想獲取原始輸入需要使用 raw_input。
函式定義
def say_b():
print "b"
強型別
Javascript和Php是弱型別的,Python和Ruby是強型別的。弱型別允許不安全的型別轉換,強型別則不允許。
#1 + “1” 這行程式碼在Python中會報錯。
print 1 + int("1")
print str(1) + "1"
字串
#字串
print '''' 段
光
偉'''
print r'C:\log.txt'
print 'C:\\log.txt'
序列
這裡先介紹三種序列:串列、元祖和字串。
序列通用操作
可變的串列
不可變的元祖
print (1, 2) #元祖以小括號形式宣告。
print (1,) #一個元素的元祖。
字串格式化
字典
print 陳述句
序列解包
bool值
bool運算
陳述句塊
:開始陳述句快,縮排的所有內容都是一個陳述句塊。
三元運運算元
print("10 > 1" if 10 > 1 else "不可能發生")
相等比較
迴圈
函式部分
形參和引數之間是按值傳遞的,當然有些型別的值是取用(物件、串列和字典等)。
作用域
模組
幾個模組相關的規則:
- 一個檔案代表一個模組。
- 可以用import module匯入模組,也可以用form module import member匯入模組的成員。
- 如果匯入的是module,必須使用module.member進行訪問;如果匯入的member,可以直接訪問member。
- 匯入的module或member都會變成當前module的member。
輸出
b
a
__main__
a
b
b
異常管理
面向物件
先上一張圖
幾個規則:
- 一切都是物件,python中一切都是物件,每個物件都包含一個__class__屬性以標記其所屬型別。
- 每個物件(記得一切都是物件啊)都包含一個__dict__屬性以儲存所有屬性和方法。
- 每個型別都包含一個__bases__屬性以標記其父類。
- 屬性和方法的訪問規則:依次搜尋instance、子類、父類、父類的父類、直到object的__dict__,如果找到就傳回。
- 屬性和方法的設定規則:直接設定instance.__dict__。
- 以上屬性和方法訪問或設定規則沒有考慮“魔法方法”,下文會解釋。
示例
系結方法和未系結方法
系結方法已經系結了物件示例,呼叫的時刻不用也不能傳入self引數了。
註:使用物件訪問實體方法為何會傳回系結方法?這個還得等到學完“魔法方法”才能解釋,內部其實是攔截對方法成員的訪問,傳回了一個Callable物件。
私有成員
難怪訪問不了了,名稱已經被修改了,增加了訪問的難度而已。
多重繼承
如果繼承的多個型別之間有重名的成員,左側的基類優先順序要高,上例子Base2會勝出。
介面那裡去了,鴨子型別比介面更好用。
呼叫父類
魔法方法
詳細內容參考:http://www.rafekettler.com/magicmethods.html
物件構造相關:__new__、__init__、__del__。
運運算元多載:所有運運算元都能多載。
屬性訪問。
集合實現。
可呼叫物件,像方法一樣呼叫物件。
資源管理
物件描述符。
摻入模組:playable.py
摻入標的模組:test.py
Open Class(開啟型別,從新定義成員)
Meta Programming(超程式設計)
備註
Python在作用域方面非常接近Javascript,型別和物件系統也有幾份相似(雖然Javascript是基於原型的),Javascript、PHP、Python和Ruby這幾門語言交叉學習會帶來意想不到的收穫。
朋友會在“發現-看一看”看到你“在看”的內容