python函式之高階 函式巢狀,命名空間,閉包

2022-09-16 16:18:19 字數 4156 閱讀 3101

目錄2:函式命名空間與查詢順序

二:命名空間名字的查詢順序

3:函式作用域

4:函式的引數傳遞都是值拷貝

5:閉包函式

一:什麼是函式巢狀

在乙個函式內又定義了另外乙個函式
二:函式定義
def foo():

def bar()

print('from bar')

bar()

foo()

# 這個是通過foo函式呼叫裡面的bar函式

def foo():

def f2():

print('from f2')

return f2

print(foo()) # 返回的是乙個f2函式記憶體位址

# //////////////////////

foo()()

res = foo()

res()

#這兩種都是呼叫f2函式

示例def circle(radius,mode):

import math

def perimiter(radius):

return 2 * math.pi * radius

def area(radius):

return math.pi * (radius ** 2)

if mode == 1:

return perimiter(radius)

elif mode == 2:

return area(radius)

print(circle(1,1))

print(circle(1,2))

三:巢狀函式呼叫
在呼叫乙個函式的過程中又呼叫了其他函式
def max2(x, y):

if x > y:

return x

else:

return y

def max3(x, y, z):

res = max2(x, y)

res1 = max2(res,z)

return res1

print(max3(1,4,19))

一:命名空間

一:內建命名空間

內建命名空間:存放的是python直譯器自帶的名字,如len,print,input....

生命週期:直譯器啟動則建立,直譯器關閉就銷毀

二:全域性命名空間
全域性命名空間:內建以及函式內的名字之外的名字都存放於全域性命名空間中

生命週期:執行頂級**/主流水線則建立,頂級**/主流水線結束則銷毀,

x = 10

y = 12

def bar():

z = 111

def f1():

print('from f1')

if true:

ccc = 33

x,y,bar ccc 都是全域性變數

三:區域性命名空間
區域性命名空間:函式內的名字

生命週期:函式呼叫時則建立,函式呼叫完畢則立即銷毀

def foo(x,y):

c = 3

def bar(x,y):

xx = 88

oo = 99

bar()

foo()

c,bar,xx,oo都是區域性變數

x = 111

def f3():

print(x)

# x = 333

x = 222

f3()

如果x = 333沒有注釋會報錯,當直譯器在執行**時,函式體**並不會執行,只會看這個函式定義是否正常,執行的時候就會解釋並執行**。內部想列印x,但是x是在print下方才被定義,還有乙個原因直譯器是由上到下解釋並執行**的。所以會報錯

注釋後:結果是222,原因是在直譯器解釋執行**的時候x=111,被建立了,f3只是檢查了定義是否正常,x=222覆蓋了x=111,所以呼叫f3的時候,函式會在內找變數,如果沒有在全域性找,找到了x=222

二:命名空間名字的查詢順序

一:全域性 查詢

name = 444

def f1():

name =4444

f1()

print(f1) # 444

def foo():

print(name)

name = 33333

foo() # 33333

二:區域性查詢
def bar()

name = 4444

print(name)

name = 44

bar() # 4444

def foo():

age = 18

print(age)

def bar():

age = 28

print(age)

age = 88

foo() # 18

bar() # 28

def foo():

name = 88

def inner():

name = 44

print(name)

inner()

foo() #如果inner內部的name注釋了結果就是88,沒有就是44

x = 8

def f1():

print(x)

def f2():

x=22

f1()

f2() # 結果是8

warning:命名空間的"巢狀關係"是函式定義階段、也就是檢測語法的時候就確定的,與呼叫為無關

一:全域性作用域
內建命名空間、全域性命名空間.全域性存活、全域性有效
二:區域性作用域
:區域性命名空間,臨時存活,區域性有效
一:對全域性定義的不可變型別,可以在函式內不直接修改
x = 10

def func(a):

a = 123

func(x)

二:對全域性定義的可變型別,可以在函式內直接修改
x = 

def func(a):

func(x)

三: 在函式內修改全域性的不可變型別
x = 10

l =

def func():

global x

x=6666

func()

print(x)

print(l)

四:nonlocal(了解)
x = 10

def foo():

x=11

def f2():

nonlocal x

x='老鐵66666666'

f2()

print('foo內的x---->',x)

foo()

print(x)

一:什麼是閉包函式?
閉包函式-->函式物件+函式巢狀定義+命名空間與作用域

閉包函式

閉:指的是定義函式內的函式

包:指的內函式引用了外函式的變數

x = 1111

def inner():

print(x)

return inner # 加括號返回的是inner函式的返回值,不加是函式的記憶體位址

print(f)

def f3():

x = 333333

f()f3()

二:為函式體**傳參的方式

一:直接通過引數的方式傳入

def func(x):

print(x)

func(1)

func(2)

func(3)

二:通過函式傳遞引數

# x = 3

def inner():

print(x)

return inner

f1()

f2()

f3()

f4()

Python之高階函式

一 什麼是高階函式 函式作為實參傳遞給函式的或者函式名為返回值的函式稱為高階函式。1 實參傳遞給函式 2 函式名為返回值 二 系統內建的高階函式 1 map函式 至少需要兩個引數,第乙個引數是函式名,第二個引數是序列 str,list,tuple map功能 把序列中的每乙個元素作為引數,傳給函式進...

Python之高階函式

做過swift開發的童鞋都知道,在swift中有許多的高階函式 map,filter,reduce,zip等 這些在開發中讓我們節省大量 python中同樣有許多的內建函式,但是這裡也只介紹幾個常用的高階函式 根據提供的函式對指定序列做對映,並返回對映後的序列 map function,iterab...

python之高階函式

函式程式設計及其優勢 無 不修改狀態,表示式形式,專注與計算,接近自然語言。便於 熱公升級,無狀態不用考慮併發過程中的資源搶占及鎖問題。函式也是物件,也可以賦值給變數,當然函式的引數也可以為另一函式。map 是 python 內建的高階函式,它接收乙個函式 f 和乙個 list,並通過把函式 f 依...