3函數(shù)、局部變量、作用域、參數(shù)默認(rèn)值

函數(shù)

  • 函數(shù)的定義和調(diào)用

    • 函數(shù)的使用必須遵循先定義,后調(diào)用原則

    • 沒有事先定義函數(shù),而直接引用函數(shù)名,就相當(dāng)于在引用一個(gè)不存在的變量名

    • 函數(shù)定義階段:只檢測(cè)函數(shù)體的語法,不執(zhí)行函數(shù)體代碼

    • 函數(shù)調(diào)用階段執(zhí)行代碼

def sayHello():
    print('hello world')
sayHello()
-----------------------------------
hello world
  • 參數(shù)

定義函數(shù)時(shí)的參數(shù)就是函數(shù)體接收外部傳值的一種媒介,可以通過參數(shù)向函數(shù)傳遞數(shù)據(jù),其實(shí)就是一個(gè)變量名。

python 2和3 的區(qū)別不做詳述,2已經(jīng)停止維護(hù), 看3即可
Python3不允許跨類別比較 需傳參轉(zhuǎn)換

def parameterFree():    # 1.無參函數(shù)
    print('hello world')
parameterFree()  # 調(diào)用時(shí)也無需傳入?yún)?shù)
def hasParameters(a, b): # 2.有參
    x = 10
    y = 20
    sum = x + y
    print(sum)
hasParameters(1, 2) #調(diào)用時(shí)需要傳參

局部變量、全局變量

網(wǎng)站 pythontutor.com 使用

全局變量和局部變量的區(qū)別在于作用域

  • 局部變量: 在某個(gè)函數(shù)內(nèi)部聲明的,只能在函數(shù)內(nèi)部使用,當(dāng)函數(shù)運(yùn)行結(jié)束時(shí),局部變量就會(huì)被內(nèi)存釋放。如果超出使用范圍(函數(shù)外部),則會(huì)報(bào)錯(cuò)。【局部變量的生命周期】

    • 參數(shù)可以視為一種局部變量
    • 對(duì)局部變量的修改不影響全局變量
  • 全局變量: 在整個(gè)py文件中聲明,全局范圍內(nèi)可以使用。函數(shù)可以用global聲明某變量是全局的

A = 100 #全局變量一般用大寫字母表示
def parameterFree():
    a = 20
    print(A + a)
parameterFree()
print(A)
print(a) #會(huì)報(bào)錯(cuò)->報(bào)錯(cuò)信息NameError: name 'a' is not defined
-------------------------------------------------------------------------
120
100
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-44-b07bdae5e4a1> in <module>
      5 parameterFree()
      6 print(A)
----> 7 print(a)

NameError: name 'a' is not defined

Python的作用域規(guī)則

強(qiáng)烈反對(duì)把兩個(gè)變量用一個(gè)名字

變量可見的范圍叫做變量的作用域。局部變量的作用域在函數(shù)內(nèi),全局變量的作用域在模塊內(nèi)。作用域的基本原則是:內(nèi)層作用域可訪問外層作用域的變量,反之外層不可訪問內(nèi)層變量。如果兩個(gè)作用域內(nèi)有同一個(gè)名字, 那么內(nèi)層的起作用

  • 在函數(shù)內(nèi)部,如果局部變量與全局變量變量名一樣,則優(yōu)先調(diào)用局部變量。
A = 100
def func():
    A = 250
    print('函數(shù)里的A={0}'.format(A))
print('全局變量A={0}'.format(A)) #打印全局變量
func()
print('執(zhí)行調(diào)用函數(shù)后A={0}'.format(A)) #并沒有改變?nèi)肿兞?----------------------------------------------------------
全局變量A=100
函數(shù)里的A=250
執(zhí)行調(diào)用函數(shù)后A=100
  • 要想在函數(shù)內(nèi)部改變?nèi)肿兞?,需要在前面加上global關(guān)鍵字,在執(zhí)行函數(shù)之后,全局變量值也會(huì)改變
A = 100
def func():
    global  A 
    A = 250      #加上global關(guān)鍵字 執(zhí)行函數(shù)之后,全局變量值也會(huì)改變
    print('函數(shù)里的A={0}'.format(A))
print('全局變量A={0}'.format(A)) #打印全局變量
func()
print('執(zhí)行調(diào)用函數(shù)后A={0}'.format(A)) #全局變量發(fā)生改變
--------------------------------------------------------------
全局變量A=100
函數(shù)里的A=250
執(zhí)行調(diào)用函數(shù)后A=250
  • nonlocal
def mistake(): 
    a = 3
    def mistake2():#函數(shù)的嵌套,內(nèi)層函數(shù)想調(diào)用外層的變量是,是不能用global聲明的
        global a
        a*= 2
        print(a)
    return mistake2()
mistake()      #會(huì)報(bào)錯(cuò) 
------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-51-e1245b2dbb95> in <module>
      7         print(a)
      8     return mistake2()
----> 9 mistake()      #會(huì)報(bào)錯(cuò)

<ipython-input-51-e1245b2dbb95> in mistake()
      6         a*= 2
      7         print(a)
----> 8     return mistake2()
      9 mistake()      #會(huì)報(bào)錯(cuò)

<ipython-input-51-e1245b2dbb95> in mistake2()
      4     def mistake2():#函數(shù)的嵌套,內(nèi)層函數(shù)想調(diào)用外層的變量是,是不能用global聲明的
      5         global a
----> 6         a*= 2
      7         print(a)
      8     return mistake2()

NameError: name 'a' is not defined
def right(): 
    a = 3
    def right2(): 
        nonlocal a #使用關(guān)鍵字 nonlocal 解決問題
        a*= 2
        print(a)
    return right2()
right() 
-------------------------------------------------
6
  • 閉包

  • ??注意Unbound異常 UnboundLocalError

    Unbound異常.png

python的“l(fā)ocal中有變量定義”,是以local中存在對(duì)變量構(gòu)建的語法為標(biāo)準(zhǔn)的。

參數(shù)默認(rèn)值

  • 函數(shù)定義時(shí),可以給參數(shù)一個(gè)默認(rèn)值
  • 參數(shù)默認(rèn)值要位于函數(shù)右側(cè)
  • 不要用可變參數(shù)作為參數(shù)默認(rèn)值
def appendFunc(l = []):
    l.append(1)
    return l
print(appendFunc([]))
print(appendFunc([]))
print('---------------')
print(appendFunc())
print(appendFunc())
------------------------------------
[1]
[1]
---------------
[1]
[1, 1]

遇到希望使用可變對(duì)象作為參數(shù)默認(rèn)值的情況,需要使用None作為默認(rèn)值。在函數(shù)中判斷是否為None,是的話再對(duì)參數(shù)做默認(rèn)值賦值處理。


呦!寫bug呢!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容