python學習 函式返回值和作用域

2021-09-18 03:46:31 字數 2652 閱讀 1155

函式返回值:

作用域乙個識別符號的可見範圍, 這就是識別符號的作用域; 一般常說的變數的作用域

上例中的x不可以訪問到, 會丟擲異常(nameerror:name 『x』 is not defined), 原因在於函式是乙個封裝, 它會開闢乙個作用域, x變數被限制在這個作用域中, 所以在函式外部x變數不可見

注意:每乙個函式的都會開闢乙個作用域

作用域分類

1.全域性作用域

2.區域性作用域

函式巢狀

函式巢狀:在乙個函式中定義了另外乙個函式

內部函式不能在外部直接使用, 會丟擲nameerror異常, 因為它在函式外部不可見

內部函式不過就是乙個識別符號, 就是乙個函式內部定義的變數而已

巢狀結構的作用域:

從執行的結果來看:

global語句

錯誤原因分析:

這個問題就可以用global語句解決:

global語句:

注意,下面試驗如果在ipython、jupyter中做,上下文執行環境中有可能有x的定義,稍微不注意,就測試不出效果

def foo():

global x

x += 1

print(x)

foo()

使用global關鍵字定義的變數,雖然在foo函式中宣告,但是這將告訴當前foo函式作用域,這個x變數將使用外部全域性作用域中的x。

def foo():

global x

x = 10

x += 1

print(x)

foo()

print(x)

即使是在foo中又寫了x=10,也不會在foo這個區域性作用域中定義區域性變數x了。

使用了global,foo中的x不再是區域性變數了,它是全域性變數總結global使用原則閉包自由變數:未在本地作用域中定義的變數。例如定義在內層函式外的外層函式的作用域中的變數

閉包:就是乙個概念,出現在巢狀函式中,指的是內層函式引用到了外層函式的自由變數,就形成了閉包

**分析

這是python2中實現閉包的方式,python3還可以使用nonlocal關鍵字

nonlocal語句

nonlocal:將變數標記為不在本地作用域定義,而是在上級的某一級區域性作用域中定義,但不能是全域性作用域中定義

內部函式使用nonlocal關鍵字宣告count變數在上級作用域而非本地作用域中定義。

**中內層函式引用外部區域性作用域中的自由變數,形成閉包。

預設值的作用域

因為xyz有預設值, 所以兩次呼叫xyz的值都是1

為什麼第二次呼叫foo函式列印的是[1,1]?

函式位址並沒有變,就是說foo這個函式物件的沒有變過,呼叫它,它的屬性__defaults__中使用元組儲存預設值

xyz預設值是引用型別,引用型別的元素變動,並不是元組的變化

屬性__defaults__中使用元組儲存所有位置引數預設值,它不會因為在函式體內改變了區域性變數(形參)的值而發生改變

屬性__defaults__中使用元組儲存所有位置引數預設值

屬性__kwdefaults__中使用字典儲存所有keyword-only引數的預設值

再看乙個例子:

只有一句不同,卻輸出結果不同?

這就要說到列表的+和+=的區別:

所以乙個名詞的查詢順序就是legb

python 函式返回值

帶有返回值的函式 def add2num a,b c a b return c或者 def add2num a,b return a b在本小節剛開始的時候,說過的 買菸 的例子中,最後兒子給你菸時,你一定是從兒子手中接過來 對麼,程式也是如此,如果乙個函式返回了乙個資料,那麼想要用這個資料,那麼就...

python 函式返回值

python 函式返回值有兩種形式 1 返回乙個值。2 返回多個值。現看看返回乙個值的吧。deffirstvalue a b c a b return cprint firstvalue 1 2 結果 3 再看看返回多個值的 那怎麼可以返回多個值呢,其他的語言一般呼叫函式的話,只能返回乙個值,可能我...

python 函式返回值

函式返回值 return 1 返回乙個值 return result 2 返回多個值 如果返回多個資料,資料之間使用逗號進行分割,那麼返回的是元組型別 return first num,second num,result 3 注意 函式中有return,函式執行到return,函式一定會中斷 如果沒...