一、函式物件
函式是第一類物件:值的記憶體位址可以像變數一樣去使用
def foo():#foo=函式的記憶體位址,可以當做一種變數值去使用
1、函式可以被引用
def foo():
print('hello')
f=foo
print(f)
f()2、可以當作引數傳遞
def foo():
print('hello')
def bar(x):
print(x)
x()bar(foo)
3.可以當做函式的返回值
def foo():
print('hello')
def func(x):
return(x)
f=func(foo)
print(f)
4.可以當做容器類的元素
def foo():
print('hello')
dic=
print(dic)
dic['1']()
def register():
print('註冊')
def login():
print('登入')
def pay():
print('支付')
def transfer():
print('轉賬')
dic_choice=
while true:
print('''
0 退出
1 註冊
2 登入
3 支付
4 轉賬
''')
choice=input('請輸入你的操作:').strip()
if choice == '0':break
if choice not in dic_choice:
print('輸入有誤,請重新輸入')
continue
dic_choice[choice]()
二.函式巢狀
#函式的巢狀呼叫:在乙個函式內部呼叫其他函式
def max2(x,y):
if x > y:
return x
else:
return y
def max4(a,b,c,d):
res1=max2(a,b)
res2=max2(res1,c)
res3=max2(res2,d)
return res3
#函式的巢狀定義:在函式內又定義了其他函式
from math import pi
def circle(radius,mode=0):
def perimiter(radius):
return 2 * pi * radius
def area(radius):
return pi * (radius ** 2)
if mode == 0:
return perimiter(radius)
elif mode == 1:
return area(radius)
circle(10,0)
三.命名空間
存放名字與值記憶體位址繫結關係的空間
命名空間的分類
內建命名空間 儲存直譯器自帶的一些名稱與值的對應關係
(python直譯器啟動時建立 所有**全部執行完畢 關閉直譯器時 銷毀)
print len max min
全域性命名空間
只要你的名字的定義是頂著最左邊寫的就在全域性空間
除了內建的函式內的 都在全域性中
(執行py檔案建立全域性命名空間 檔案執行結束 銷毀)
區域性命名空間 只要是函式內的名稱就是區域性的
(呼叫函式時建立 函式執行完畢就銷毀)
命名空間的載入順序
內建的 -> 全域性的 ->區域性的
名稱的查詢順序
區域性 -> 全域性的 -> 內建的
結論:1.查詢名字的位置是從當前位置往外查詢
2.命名空間的巢狀關係是在函式定義階段就固定死了,與呼叫位置無關
def outter():
x=1111
def inner():
print(x)
return inner
f=outter()
def foo():
x=2222
f()foo()
輸出的是1111
四.作用域(作用範圍)
域 指的是區域 範圍的的意思
全域性的命名空間和內建的命名空間 在使用上沒什麼區別
區域性的 和 全域性的內建的 就有區別了 區域性定義的只能在區域性使用
給三個空間劃分範圍:
全域性的和內建可以劃分為同乙個範圍
global 全域性作用域
區域性的單獨劃分為乙個範圍
local 區域性作用域
globals()
locals()
檢視全域性作用域中的內容
# print(dir(globals()['__builtins__']))
檢視區域性作用域中的內容 注意:在全域性中使用locals 看到的就是全域性的內容與globals沒有區別
print(globals())
print(locals())
age=18
def func():
age=19
print(age) #19
func()
print(age) #18
age=18
def func():
global age #明確宣告要使用全域性中的age
age=19
print(age) #19
func()
print(age) #19
a=1def func():
a=10
def inner():
a=100
print(a) #100
inner()
print('這是func中a',a) #這是func中a 10
func()
print(a) #1
a=1def func():
a=10
def inner():
nonlocal a #明確宣告要使用上一層中的a,如果上一層沒有則找上上層,但是注意不能找到全域性中
a=100
print(a) #100
inner()
print('這是func中的a',a) #這是func中的a 100
func()
print(a) #1
五.閉包函式
閉包函式 也是乙個函式
閉函式:該函式一定是定義在函式內的函式
包函式: 該內部函式包含對外層函式作用域名字的引用
為函式體傳值的解決方案:
①為函式體傳值的方案一:直接以引數的形式傳入
def f(x):
print(x)
f(10)
f(11)
②為函式體傳值的方案二:用閉包函式傳值
def outter(x):
def f():
print(x)
return f
fff=outter(10)
fff()
函式物件 命名空間 作用域
定義函式的三種方式 1.空函式 可以快速構建專案框架,使專案架構清晰明了 def func pass 2.無參函式 def func print from func 3.有參函式 def func x,y,args,kwargs pass 命名關鍵字引數 在函式定義階段 寫在 與 可變長引數之間的形...
函式的巢狀及命名空間 作用域
六.函式的巢狀 1.在函式內又呼叫了其他函式 def max2 x,y 兩個值比較 if x y return x else return yres max2 1,3 print res def max3 x,y,z 三個值比較 res1 max2 x,y res2 max2 res1,z retu...
函式物件,巢狀,命名空間與作用域
1 函式名可以被傳遞 2 函式名可以被當做引數傳遞給其餘函式 3 函式名可以當做函式的返回值 4 函式名可以當做容器型別的引數 例如 函式名可以被傳遞給變數 deffunc print test f func 變數名f指向函式的記憶體位址 通過該記憶體位址該變數可以找到函式對應的 塊 f 變數名f呼...