第1章 函數的基礎知識
1.1爲何要用函數?
1. 代碼的組織結構不清晰,可讀性差
2. 代碼冗餘
3. 可擴展性差
1.2函數的使用:
必須先定義,後調用
定義的語法:def 函數名(參數1,參數2,)
代碼段
retrun 返回值
定義函數,就相當於定義了一個變量,會申請內存空間將函數體代碼存起來,然後將內存地址綁定給函數名,函數名=函數內存地址
1.3定義函數的三種形式:定義那種形式取決於函數體內部需不需要從外部傳值
1. 無參函數
2. 有參函數
3. 空函數
1.4函數的返回值
def max(x,y):
ifx > y:
returnx
else:
returny
res=max(10,20)
print(res)
1. return是函數結束的標誌,函數內可以有多個return,但只要執行一次return,整個函數就立即結束,並且將return後的返回值當作本次執行的結果
2. 沒有return默認返回none
3. return多個返回值用逗號分隔開,返回一個元祖
第2章 函數參數的使用:
2.1函數參數分爲兩大類:
1. 形參:在函數定義階段括號內定義的參數(變量名),
2. 實參:在函數調用階段括號內傳入的值(變量值)
3. 形參與實參的關係:在調用函數時,實參的值會綁定給形參,這種綁定關係在調用結束後立即解除
def func(x,y,z):
print(x)
print(y)
print(z)
func(1,2,3)
2.2形參與實參的細分:
2.2.1位置參數
位置形參:指在函數定義階段按照從左到右的順序依次定義的形參
特點:必須被傳值,多一個不行,少一個不行
位置實參:指在函數調用階段從左到右依次傳入的值
特點:與形參一一對應
2.2.2關鍵字實參:
在函數調用階段,按照key=value的形式爲指定形參賦值
特點:可以完全打亂順序,但仍然能爲指定的形參賦值
注意:可以混用位置實參和關鍵字實參,但是不能爲同一個形參重複賦值,並且位置實參必須在關鍵字實參的前面
def func(x,y,z):
print(x)
print(y)
print(z)
func(z=1,y=2,x=3)
2.2.3默認參數:
在函數定義階段,就已經爲形參賦值了
特點:在定義階段就已經有值,可以不用傳值,如果傳值,就以傳的爲準
注意:位置形參必須在默認形參前面
默認形參的值只在函數定義階段賦值一次,定義之後的任何改動都無法改變形參的值
默認形參的值通常是不可變類型
m=100
def func(x,y,z=m):
print(x)
print(y)
print(z)
m=200
func(1,2)
2.2.4可變長參數:
指在調用函數時傳入的值,個數不固定
Ø *的用法:
在形參中出現*,*會將溢出的位置實參,存成元祖的形式,賦值給緊跟其後的形參
def func(x,y,*z):
print(x)
print(y)
print(z)
func(1,2,3,4)
在實參中出現*,都會將*後的值,打散成位置實參,然後進行賦值
def func(x,y,z):
print(x)
print(y)
print(z)
func(*{1,2,3})
Ø **的用法:
在形參中出現**,**會將溢出的關鍵字實參,存成字典的形式,賦值給緊跟其後的形參
def func(x,y,**z):
print(x)
print(y)
print(z)
func(1,y=2,z=3,a=4,b=5)
在實參中出現**,都將**後的值打散成關鍵字實參,然後進行賦值
def func(x,y,z):
print(x)
print(y)
print(z)
func(**{'x':1,'y':2,'z':3})
Ø args,**kwargs特殊用法:
def func(*args,**kwargs):
print(args)
print(kwargs)
func(1,2,3,x=1,y=2)
傳給外層函數wrapper的參數格式如何原封不動的轉嫁給wrapper內部調用的函數index?
def index(a,b,c):
print('來自index: ',a,b,c)
def wrapper(*args,**kwargs):
index(*args,**kwargs)
wrapper(1,1,1)
2.2.5命名關鍵字形參:
在定義函數階段,但凡是在*與**之間的參數稱之爲命名關鍵字形參
特點:在傳值時必須按照key=value的形式傳值
第3章 函數對象
3.1函數對象指的是:
函數的內存地址可以像變量值一樣去使用
3.2函數對象如何使用?
1. 可以被引用
def func():
print('hello')
f=func
print(f)
f()
2. 可以當作參數傳給另外一個函數
def func():
print('hello')
def bar(x):
print(x)
x()
bar(func)
3. 可以當作函數的返回值
def func():
print('hello')
def bar():
returnfunc
res=bar()
print(res)
4. 可以當作容器類型的元素
Ø 存到列表中與調用:
def func():
print('hello')
x=[func,]
print(x)
x[0]()
Ø 存到字典中與調用:
def func():
print('hello')
x={'y':func}
print(x)
x['y']()
3.3函數對象的應用:
def login():
print('登陸功能')
def register():
print('註冊功能')
def pay():
print('支付功能')
func_dic={
'1':login,
'2':register,
'3':pay
}
while True:
print("""
0:退出
1:登陸
2:註冊
3:支付
""")
choice=input('出入命令:').strip()
ifchoice == '0' : break
if choicein func_dic:
func_dic[choice]()
else:
print('輸入命令有錯誤')
第4章 函數嵌套
4.1函數的嵌套分爲兩類:
1. 函數的嵌套定義:在函數內部又定義了一個函數
2. 函數的嵌套調用:在調用一個函數的內部又調用了其他函數
def max(x,y):
ifx > y:
returnx
else:
returny
def max1(a,b,c,d):
res1=max(a,b)
res2=max(res1,c)
res3=max(res2,d)
returnres3
print(max1(1,2,3,4))
第5章 名稱空間與作用域
5.1什麼是名稱空間?
存放名字與值的綁定關係的內存空間
5.2名稱空間分爲三種:
5.2.1內置名稱空間:
存放的是python解釋器自帶的名字(len,print),解釋器啓動時創建,解釋器關閉則銷燬
5.2.2全局名稱空間:
存放的是全局的名字,沒有任何縮進,在頂頭定義的名字,python文件執行時創建,文件執行完畢則銷燬
5.2.3局部名稱空間:
在函數內定義的名字,在函數調用時臨時產生,函數調用完畢則立即銷燬
5.3三個名稱空間總結:
加載順序:
1. 先產生內置名稱空間
2. 再產生全局名稱空間
3. 如果調用函數則會產生臨時局部名稱空間
名字的查找順序:從當前位置向上查找
函數的局部名稱空間彼此隔離,但是全局和內置的名稱空間則是所有函數共享的
5.4作用域
全局作用域:內置+全局名稱空間,全局有效
局部作用域:局部名稱空間,臨時存活,函數內有效
global:聲明以後,表示修改全局變量
x=111
def func():
globalx
x=222
func()
print(x)
nonlocal:聲明以後修改上一層中的變量
x=111
def func():
x=222
deff2():
nonlocalx
x=0
f2()
print(x)
func()
print(x)
第6章 閉包函數
6.1什麼是閉包函數?
定義在函數內的函數
6.2爲什麼要用閉包函數?
爲了實現裝飾器功能
6.3如何用閉包函數?
def outter(x):
definner():
print(x)
returninner
inner=outter(1)