函數(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]
