函式(function)作為程式語言中不可或缺的一部分。
在 python 中萬物皆為物件,函式也不例外,函式作為物件可以賦值給乙個變數、可以作為元素新增到集合物件中、可作為引數值傳遞給其它函式,還可以當做函式的返回值,這些特性就是第一類物件所特有的。
def pr_hi():
print('hello world!')
print(id(foo)) # 21301264
print(type(foo)) # print(foo) #
def pr_hi():
print('hello world!')
pr_hi2 = pr_hi #引用,賦值
print(pr_hi2) # print(pr_hi) #pr_hi2() # hello world!
容器物件(list、dict、set等)中可以存放任何物件,函式也可以作存放到容器物件中
def pr_hi():
print('from pr_hi')
dic=
pr_hi() # from pr_hi
print(dic['func']) # dic['func']() # from pr_hi
def pr_hi():
print('from pr_hi') # from pr_hi
def bar(func): ##執行函式
print(func) # func() ##呼叫上面位址的函式
bar(pr_hi) ##第一步,先呼叫bar()函式
def pr_hi():
print('from pr_hi')
def bar(func):
return func
f=bar(pr_hi)
print(f) # f() # from pr_hi
def f1():
def f2():
print('from f2')
return f2
abc = f1() # f1()拿到函式的返回值,函式的返回值是f2, abc就相當於f2
abc() # from f2
python 使用 lambda 來建立匿名函式。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義乙個函式。
語法lambda [arg1 [,arg2,.....argn]]:expression
例如
sum = lambda arg1, arg2: arg1 + arg2
# 呼叫sum函式
print ("相加後的值為 : ", sum( 10, 20 )) # 30
print ("相加後的值為 : ", sum( 20, 20 )) # 40
## 這樣就是乙個邏輯簡單的匿名函式了,不過匿名函式一般不這麼使用
匿名函式一般和內建函式一起使用,例如:sort,sorted一起使用
lt = [('a', 3000), ('i', 2600), ('o', 15000), ('d', 6500), ('p', 3000)]
lt.sort()
print(lt) # [('a', 3000), ('d', 6500), ('i', 2600), ('o', 15000), ('p', 3000)]
##這樣只能讓列表裡面的元祖以元祖的第乙個元素進行排序
##所以我們需要自己定義乙個規則來進行排序
def abc(i): ##你們千萬不要學我,我實在想不出來用什麼好,就隨便使用了
return i[1]
lt = [('a', 3000), ('i', 2600), ('o', 15000), ('d', 6500), ('p', 3000)]
lt.sort(key=abc) ## 可以通過他的key來改變它排序的規則
print(lt) # [('i', 2600), ('a', 3000), ('p', 3000), ('d', 6500), ('o', 15000)]
## 發現使用函式想不出函式名這個比較尷尬,還是使用匿名函式好些
lt = [('a', 3000), ('i', 2600), ('o', 15000), ('d', 6500), ('p', 3000)]
lt.sort(key=abc) ## 可以通過他的key來改變它排序的規則,這樣就可以不用考慮函式名
print(lt) # [('i', 2600), ('a', 3000), ('p', 3000), ('d', 6500), ('o', 15000)]
一扯到函式的巢狀就不由自主的要開始扯函式空間與作用域了。
函式空間:存放名字的地方,準確的說命名空間是存放名字與變數值繫結關係的地方
命名空間的順序
作用域: 產生作用的範圍
x = 1
def f2():
x = 2 # x=2只能在f2中使用
print(x)
print(x) # 1
f2() # 2
如果實在要改變全域性的變數或者是區域性的變數
改全域性名稱
x = 1
def f1():
global x
x = 2
f1()
print(x) # 2
改區域性名稱x = 0
def f1():
x = 1
def f2():
x = 2
def f3():
nonlocal x #改的是函式正上方的值
x = 3
print('f3',x) # f3 3
f3()
print('f2',x) # f2 3
f2()
print('f1',x) # f1 1
print(x) # 0
f1()
推薦使用引用型別lt = [1,2,3] # 作用域關係僅適用不可變資料型別,不適用於可變資料型別
def f1():
print(lt) # [1, 2, 3]
f1()
print(lt) # [1, 2, 3, 4]
函式物件,巢狀,命名空間與作用域
1 函式名可以被傳遞 2 函式名可以被當做引數傳遞給其餘函式 3 函式名可以當做函式的返回值 4 函式名可以當做容器型別的引數 例如 函式名可以被傳遞給變數 deffunc print test f func 變數名f指向函式的記憶體位址 通過該記憶體位址該變數可以找到函式對應的 塊 f 變數名f呼...
函式物件 命名空間 作用域
定義函式的三種方式 1.空函式 可以快速構建專案框架,使專案架構清晰明了 def func pass 2.無參函式 def func print from func 3.有參函式 def func x,y,args,kwargs pass 命名關鍵字引數 在函式定義階段 寫在 與 可變長引數之間的形...
函式物件,命名空間和作用域
目錄函式的巢狀 命名空間和作用域 作用域global關鍵字 nonlocal關鍵字 注意點python中一切皆物件 def f1 print from f1 func f1 print f1 f1 print func func 列印結果 f1 funcdef f1 print from f1 de...