1.5.2 Python函式巢狀及作用域

花姐毛毛腿發表於2019-01-19

1.三元運算

if條件成立的結果 if 條件 else 條件不成立的結果 例如:

a=20
b=10
c=a if a>b else b
print(c)
複製程式碼

2.名稱空間

**全域性名稱空間:**建立的儲存“變數名與值的關係”的空間叫做全域性名稱空間 **區域性名稱空間:**在函式的執行中開闢的臨時的空間叫做區域性名稱空間 **內建名稱空間:**內建名稱空間中存放了python直譯器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法。 三種名稱空間之間的載入順序和取值順序: **載入順序:**內建(程式執行前載入)-->全域性(從上到下順序載入進來的)-->區域性(呼叫的時候載入)--->內建 **取值:**在區域性呼叫:區域性名稱空間--->全域性名稱空間--->內建名稱空間 站在全域性範圍找:全域性----內建----區域性 使用: 全域性不能使用區域性的 區域性的可以使用全域性的

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

1.名稱空間和作用域是分不開的 2.作用域分為兩種: 全域性作用域: 全域性名稱空間與內建名稱空間的名字都屬於全域性範圍 在整個檔案的任意位置都能被引用,全域性有效 區域性作用域: 區域性名稱空間,只能在區域性範圍內生效    3.站在全域性看: 使用名字的時候:如果全域性有,用全域性的 如果全域性沒有,用內建的 4.為什麼要有作用域? 為了函式內的變數不會影響到全域性 5.globals方法: 檢視全域性作用域的名字【print(globals())】 locals方法:檢視區域性作用域的名字【print(locals())】

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

def func():
    a = 12
    b = 20
    print(locals())
    print(globals())

func()
複製程式碼

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

x=1
def foo():
     global  x  #強制轉換x為全域性變數
     x=10000000000
    print(x)
 foo()
print(x)
複製程式碼

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)
複製程式碼

4.函式的巢狀定義

def animal():
    def tiger():
        print('nark')
        print('eat')
    tiger()
animal()
複製程式碼

5.函式的作用域鏈

x=1
def heihei():
    x='h'
    def inner():
        x='il'
        def inner2():
            print(x)
        inner2()
    inner()
heihei()
複製程式碼

6.函式名的本質:就是函式的記憶體地址

def func():
    print('func')
print(func)#指向了函式的記憶體地址
複製程式碼

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

def func():
    print('func')

def func2(f):
    f()
    print('func2')
func2(func)
複製程式碼

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

def func():
    def func2():
        print('func2')
    return func2
f2=func()
f2()
複製程式碼
def f1(x):
    print(x)
    return '123'

def f2():
    ret = f1('s')  #f2呼叫f1函式
    print(ret)
f2()
複製程式碼
def func():
    def func2():
        return 'a'
    return func2   #函式名作為返回值

func2=func()
print(func2())
複製程式碼

9,閉包:

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

閉包的常用形式:

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='http://www.cnblogs.com/Eva-J/articles/7156261.html#_label1'
get = index(u)
print(get())
複製程式碼

9.總結

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

如果在小範圍內,如果要用一個變數,是當前這個小範圍有的,就用自己的 如果在小範圍內沒有,就用上一級的,上一級沒有的,就用上上級的,以此類推 如果都沒有,報錯

相關文章