learn python3 這是我初學Python時寫的一套Python基礎示常式序.主要基於廖雪峰老師的Python3教程和<<深入理解Python>>. 感謝! 下麵是這些示常式序的目錄總結: Chapter1:容器/集合/C ...
# learn-python3
這是我初學Python時寫的一套Python基礎示常式序.主要基於廖雪峰老師的Python3教程和<<深入理解Python>>. 感謝!
下麵是這些示常式序的目錄總結:
Chapter1:容器/集合/Collection
1.字典/哈希表/dictionary/map
2.鏈表/list
3.無序表/set/tuple
4.格式化字元串和字元串連接
Chapter2:Python函數和函數式編程
1.Python參數(*args, **kw ..)
2.(多)返回值 - tuple
3.函數式編程
1).高階函數(map,reduce,filter)
2).匿名函數(lambda表達式)
3).閉包(Closure)
4).裝飾器(decorator)
閉包(Closure):
在python中,函數是對象,函數名作為對此對象的引用。像其他數據結構一樣,函數也可以賦值給變數,並且我們可以在函數中定義對象,將對象作為參數和將對象作為返回值。
在這裡,我們舉一個例子來說明。
def make_printer(msg):
def printer():
print(msg)
return printer
printer = make_printer('Foo!')
printer() #Foo
閉包是指 內部函數(nested function)
訪問 其 外圍函數(enclosing)
作用域的變數,並且外圍函數已經執行完畢。
當 make_printer
被調用,一個新的棧幀入棧,printer
函數作為其常量,msg
的值作為局部變數被保存。然後創建並返回了函數 printer
。因為函數 printer
引用了msg
變數,當 make_printer
函數返回(return)之後它依舊存活(kept alive)。
這裡面有兩個關鍵點:存在內部函數,並且內部函數訪問了外圍局部變數。只有同時滿足這兩點,才稱為閉包。
裝飾器(decorator):
首先,裝飾器是一種設計模式。在不改變原有代碼的基礎上,將其功能模塊進行包裝(wrapper),構建出更加複雜的功能模塊。通常,增強了的功能模塊會調用被增強的(即原有的)功能邏輯。AOP(Aspect Oriented Programming)
就是使用這種編程思想。
從技術上講,Python的裝飾器是使用閉包來實現的。並提供了簡潔的語法糖支持。
裝飾器函數接收函數作為參數,並且在內部通過定義 wrapper
函數來實現增強的邏輯。通常情況下,這個函數會調用原函數,並且,這個函數的參數列表應該和被增強的函數保持一致。最終,我們將這個增強了的函數(wrapper)作為返回值。
def decorator(func):
def wrapper(*args, **kwargs):
maybe some code..
func(*args, **kwargs)
maybe some code...
return wrapper
wrapper_origin_func = decorator(origin_func)
wrapper_origin_func(*args, **kwargs)
語法糖支持:
@decorator1(args)
@decorator2
def func(): pass
#is equivalent to:
def func(): pass
func = decorator1(args)(decorator2(func))
關於裝飾器帶參數的解釋:
def decorator1(args):
def real-decorator(func):
def wrapper(*args, **kwargs):
some code..
func(*args, **kwargs)
some code access args
return wrapper
return real-decorator
Chapter3:面向對象(Oritented-Object)
1.繼承和多態(extends and polymorphic)
2.成員(mumber)
1).類成員
2).實例成員
3.訪問許可權
4.專有方法(special method)
5.動態修改類和slots.
6.Python中的類型(type)
7.元類(metaclass)
Chapter4:協程 -- yield
我們考慮自己來實現一個數字生成器(此生成器是廣義的),即 range()
函數的功能。
首先,我們藉助 list
通過定義最簡單,最直接的函數來實現。
def MyRange(n):
num, list = 0, []
for num < n:
list.append(num)
num += 1
return list
上面的代碼藉助了 list
對象簡單粗暴的將所有可能的值都載入到記憶體中。這種實現方式當n很大時對記憶體的消耗極高甚至會發生記憶體溢出。為此,我們可以定義一個迭代器類,通過維護兩個變數值而不是整個元素來實現延遲計算。