python中函式的巢狀和作用域鏈

2021-10-02 06:59:30 字數 4313 閱讀 6019

1.三元運算

if條件成立的結果 if 條件 else 條件不成立的結果

例如:a=20

b=10

c=a if a>b else b

print(c)

2.命名空間

三種命名空間之間的載入順序和取值順序:

載入順序:內建(程式執行前載入)-->全域性(從上到下順序載入進來的)-->區域性(呼叫的時候載入)--->內建

取值:在區域性呼叫:區域性命名空間--->全域性命名空間--->內建命名空間

站在全域性範圍找:全域性----內建----區域性

使用:全域性不能使用區域性的

區域性的可以使用全域性的

3.作用域:就是作用範圍

1.命名空間和作用域是分不開的

2.作用域分為兩種:

全域性作用域:全域性命名空間與內建命名空間的名字都屬於全域性範圍

在整個檔案的任意位置都能被引用,全域性有效

區域性作用域:區域性命名空間,只能在區域性範圍內生效   

3.站在全域性看:

使用名字的時候:如果全域性有,用全域性的

如果全域性沒有,用內建的

4.為什麼要有作用域?

為了函式內的變數不會影響到全域性

5.globals方法:檢視全域性作用域的名字【print(globals())】

locals方法:檢視區域性作用域的名字【print(locals())】

def func():

a = 12

b = 20

print(locals())

print(globals())

func()

在區域性呼叫locals()和globals()

站在全域性看,globals is locals

global關鍵字:強制轉換為全域性變數

# x=1

# def foo():

# global x #強制轉換x為全域性變數

# x=10000000000

# print(x)

# foo()

# print(x)

# 這個方法盡量能少用就少用

global

nonlocal讓內部函式中的變數在上一層函式中生效,外部必須有

# x=1

# def f1():

# x=2

# def f2():

# # x=3

# def f3():

# # global x#修改全域性的

# nonlocal x#修改區域性的(當用nonlocal時,修改x=3為x=100000000,當x=3不存在時,修改x=2為100000000 )

# # 必須在函式內部

# x=10000000000

# f3()

# print('f2內的列印',x)

# f2()

# print('f1內的列印', x)

# f1()

# # print(x)

nonlocalv

4.函式的巢狀定義

def animal():

2     def tiger():

3 print('nark')

4 print('eat')

5 tiger()

6 animal()

5.作用域鏈

x=1

def heihei():

x='h'

def inner():

x='il'

def inner2():

print(x)

inner2()

inner()

heihei()

函式的作用域鏈

def func():

2   print('func')

3 print(func)#指向了函式的記憶體位址

7.函式名可以用做函式的引數

def func():

print('func')

def func2(f):

f()print('func2')

func2(func)

函式名可以用作引數

函式名可以作為函式的返回值

return說明1

def func():

def func2():

print('func2')

return func2

f2=func()

f2()

#func2=func()

#func2()

2.

def f1(x):

print(x)

return '123'

def f2():

ret = f1('s') #f2呼叫f1函式

print(ret)

f2()

3.

def func():

def func2():

return 'a'

return func2 #函式名作為返回值

func2=func()

print(func2())

8.閉包:閉包:1.閉 :內部的函式 

2.包 :包含了對外部函式作用域中變數的引用 

def hei(): 

x=20 

def inner(): 

x=10 #如果x定義了,他就用自己的了,就實現不了閉包 

print(x)

# 閉包的常用形式:

def hei():

x=20

def inner():

'''閉包函式'''

print(x)

return inner()

閉包函式的常見形式

判斷閉包函式的方法:__closure__

#輸出的__closure__有cell元素 :是閉包函式

def func():

name = 'eva'

def inner():

print(name)

print(inner.__closure__)

return inner

f = func()

f()#輸出的__closure__為none :不是閉包函式

name = 'egon'

def func2():

def inner():

print(name)

print(inner.__closure__)

return inner

f2 = func2()

f2()

閉包獲取網路應用

# from urllib.request import urlopen

# def index(url):

# def inner():

# return urlopen(url).read()

# return inner

# u=''

# get = index(u)

# print(get())

9.總結

作用域:小範圍的可以用大範圍的,但是大範圍的不能用小範圍的

範圍從大到小(圖)

如果在小範圍內,如果要用乙個變數,是當前這個小範圍有的,就用自己的

如果在小範圍內沒有,就用上一級的,上一級沒有的,就用上上級的,以此類推

如果都沒有,報錯

10.思維導圖

python中函式的巢狀和作用域鏈

1.三元運算 if條件成立的結果 if 條件 else 條件不成立的結果 例如 a 20 b 10 c a if a b else b print c 2.命名空間 三種命名空間之間的載入順序和取值順序 載入順序 內建 程式執行前載入 全域性 從上到下順序載入進來的 區域性 呼叫的時候載入 內建 取...

函式的巢狀和作用域

函式的巢狀定義 內部函式可以使用外部函式的變數 作用域鏈 在內部函式使用變數時,是從小區域性到大區域性到全域性到內建名字的過程中一級一級網上找,找到最近的乙個就使用 nonlocal a 宣告乙個上層區域性變數,往上走一級離得最近並且有a 1 對全域性無效 2 對區域性的最近的一層產生影響 閉包巢狀...

巢狀函式和作用域

看上面的標題的意思是,函式還能套函式?name alex def change name name alex2 def change name2 name alex3 print 第3層列印 name change name2 呼叫內層函式 print 第2層列印 name change name ...