函數是在程式設計中 剪剪貼貼的代替。
有函數以後,才有全局作用域的麻煩。
def 是可執行的代碼, 在運作這個之前,函數并不存在。
函數也是對象-函數對象,def建立一個函數對象,并複制給你定義的函數名字。
def這個語句是實時執行的, 建立函數對象,指派給函數名
在子產品導入的時候,會執行一遍子產品中的代碼。
依賴類型的行為稱為多态。
函數是多态的。
作用域就是 命名空間
變量被指派的地點,綁定一個特定的命名空間。
全局作用域僅限單個檔案。
函數内部可以引用全局變量,前提是函數内部沒有相同名稱的變量。
内置變量會被最後搜尋的, 是以你可以使用内置變量,而不需要導入
__builtin__
子產品
全局變量不經過聲明也可以在函數内部引用
但如果要在函數内部改變全局變量的話,必須要global聲明。
名字查找規則:本地作用域,上一層的本地作用域,全局作用域,内置作用域。
函數也可以聲明 全局作用域
包閉,在函數内,定義函數 。 或者叫 工廠函數 ,能夠在動态的改變函數。
定義
__call__
方法後,變量可以像函數一樣被使用。
函數的參數
1,普通的位置确定的參數
2,關鍵字的參數
3,參數預設值
4,* 和** 任意參數
這有個醜陋的例子
def f(*arg):
print arg
f(1,2,3,4)
def f2(**arg):
print arg
f2(a=2,b=3,c=4)
還有另一種叫 解包參數,這像是一種偷懶的參數傳遞方法。
函數對象: 屬性和注解
函數是一個對象,就像字元串或者數字那樣
函數可以附加任意的使用者定義的屬性。
lambda 是一種函數速寫
map 序列中的映射函數
filter 生成一個 符合條件的新的清單
reduce 将一個清單中的每個元素,都按照某種方式,應用于一個函數,最後得到一個結果。
清單解析: 要實作一個功能,有很多的方法。清單解析就是一個。
生成器函數: 包含yield的def函數,支援疊代協定。