Python 學習第三部分函數——第一章函數基礎
函數是python 為了代碼最大程度的重用和最小代碼冗余而提供的最基本的程序結構。使用它我們可以將復雜的系統分解為可管理的部件。
函數相關語句
def... 創建一個對象並將其賦值給某一個對象
return 將一個結果對象發送給調用者
global 聲明了一個模塊級的變量並賦值
nonlocal 聲明了將要賦值的一個封閉的函數變量
yield 向調用者發回一個結果對象,但是記住它離開的地方
lambda 創建一個對象,將其結果返回
函數定義和調用
實例一:
1 def times(x,y): #函數定義 2 return x*y #函數主體 3 4 #函數調用 5 a = times(3,4) 6 b = times(‘hello‘,4) 7 print(a,b) #12 hellohellohellohello
實例二:求兩個集合的交集
1 def intersect(seq1,seq2): 2 res = [] 3 for i in seq1: 4 for i in seq2: 5 res.append(i) 6 return res 78 #函數調用 9 10 s1 = ‘admin‘ 11 s2 = ‘awsemis‘ 12 print(intersect(s1,s2)) #[‘a‘,‘m‘,‘i‘]
作用域
在任何情況下,一個變量的作用域(它所使用的地方)總是由在代碼中被賦值的地方所決定,並且與函數調用完全沒有關系。實際上,變量可以在3個不同的地方分配,分別對應3種不同的作用域:
1. 如果一個變量在def內賦值,它被定位在這個函數內。
2. 如果一個變量在一個嵌套的def中賦值,對於嵌套的函數來說,它是非本地的。
3. 如果在def之外賦值,它就是整個文件全局的。
a = 99 #a為全局變量 def num_a(): a=88 # a為本地變量(只在def語句內是可見的) return a print(a) #99 print(num_a()) #88
盡管這兩個變量名都是 a,但是它們的作用域可以把它們區別開來。實際上,函數的作用域有助於防止程序之中變量名的沖突域,並且有助於函數成為更加獨立的程序單元。
作用於法則:
函數定義了本地作用域,而模塊定義的是全局作用域。這兩個作用域有如下的關系
1.內嵌的模塊是全局作用域。
2.全局作用域的作用範圍僅限於單個文件
3.每次對函數的調用都創建了一個新的本地作用域。
4.賦值的變量名除非聲明為全局變量或非本地變量,否則均為本地變量
5.所有其他的變量名都可以歸納為本地、全局或者內置的。
python 的作用域的關系如下:
變量名引用分為三個作用域進行查找:首先是本地(L),之後是函數內(E)(如果有的話),之後全局(G),最後是內置(B)。
實例:
#Global scope 全局作用域 x = 99 # x和func為全局作用域(global scope) def func(y): #Local scope 本地作用域 z = x + y #y和z 為本地作用域(local scope) return z print(func(1)) #100
global語句
它是一個命名空間的聲明。它告訴python函數打算生成一個或多個全局變量名。
全局變量名總結:
1. 全局變量是位於模塊文件內部的頂層的變量名。
2. 全局變量如果是在函數內被賦值的話,必須經過聲明。
3. 全局變量名在函數的內部不經過聲明也可以被引用。
x = 88 # x 為global def func(): global x #聲明後,函數外部的變量x就會被改變。不加這個聲明是不能改變外部變量的。 x = 99 func() print(x) #99
嵌套作用域實例
x = 99 #global 全局作用域 def f1(): x=88 # enclosing 函數內作用域 def f2(): print(x) #先找本地,本地找不到找函數內,遵循LEGB法則 f2() #在函數裏面調用函數f2 f1() #88 #調用f1函數
nonlocal語句
nonlocal和global一樣,聲明了將要在一個嵌套的作用域中修改的名稱。
區別之處:nonlocal應用於一個嵌套的函數的作用域中的一個名稱,而不是所有def之外的全局模塊作用域;而且在聲明nonlocal名稱的時候,它必須已經存在於該嵌套函數的作用域中。
未完待續。。。。。
Python 學習第三部分函數——第一章函數基礎