從函式物件到命名空間與作用域

2022-08-23 00:39:10 字數 3248 閱讀 6643

函式(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...