導航:首頁 > 編程語言 > python函數與函數定義與調用順序

python函數與函數定義與調用順序

發布時間:2023-07-17 11:38:44

python其實很簡單 第十二章 函數與變數的作用域

在前面已經多次提到函數這個概念,之所以沒有解釋什麼是函數,是因為程序中的函數和數學中的函數差不多,如input()、range()等都是函數,這些都是Python的標准函數,直接使用就可以了。根據需要,用戶也可以自定義函數。

12.1 函數

函數的結構:

def 函數名(參數):

函數體

return 返回值

例如:數學中的函數f(x)=2x+5在Python中可以定義如下:

def f(x):

y=2*x+5

return(y)

如果x取值為3,可以使用如下語句調用函數:

f(3)

下面給出完整的程序代碼:

def f(x):

y=2*x+5

return(y)

res=f(3)

print(res)

運行結果:11

如上例中的x是函數f(x)的參數,有時也被稱為形式參數(簡稱形參),在函數被調用時,x被具體的值3替換y就是函數的返回值,這個值3也被稱為實際參數(簡稱實參)。

上例中的y是函數f(x)的返回值。並不是所有的函數都有參數和返回值。如下面的函數:

def func():

print('此為無參數傳遞、無返回值的函數')

func()

輸出結果:此為無參數傳遞、無返回值的函數

可以看出,該函數func()無參數,故調用時不用賦給參數值。

函數也可以有多個參數,如f(x,y)=x²+y²,可用Python語言定義如下:

def f(x,y):

z=x**2+y**2

return z

print(f(2,3)) #調用函數f(x,y)

輸出結果:13

也可以通過直接給參數列表中的參數賦值的方法,為參數添加默認值,如果用戶賦予參數值,則按照用戶賦值執行,否則使用默認值。例如:

def f(x,y=3):

z=x**2+y**2

return z

若調用時參數列表為(2,1),即x賦值為2,y賦值為1:

print(f(2,1))

輸出結果為:5

若調用時參數列表為(2),即x賦值為2,y賦值省缺,則y使用默認值:

print(f(2))

輸出結果為:13

回調函數,又稱函數回調,是將函數作為另一函數的參數。

例如:

def func(fun,m,n):

fun(m,n)

def f_add(m,n):

print('m+n=',m+n)

def f_mult(m,n):

print('m*n=',m*n)

func(f_add,2,3)

func(f_mult,2,3)

輸出結果:

m+n= 5

m*n= 6

在f_add(m,n)和f_mult(m,n)被定義前,func(fun,m,n)中的fun(m,n)就已經調用了這兩個函數,即「先調用後定義」,這也是回調函數的特點。

如果無法預知參數的個數,可以在參數前面加上*號,這種參數實際上對應元組類型。譬如,參會的人數事先不能確定,只能根據與會人員名單輸入:

def func(*names):

print('今天與會人員有:')

for name in names:

print(name)

func('張小兵','陳曉梅','李大海','王長江')

運行後,輸出結果為:

今天與會人員有:

張小兵

陳曉梅

李大海

王長江

參數為字典類型,需要在參數前面加上**號。

def func(**kwargs):

for i in kwargs:

print(i,kwargs[i])

func(a='a1',b='b1',c='c1')

輸出結果為:

a a1

b b1

c c1

一個有趣的實例:

def func(x,y,z,*args,**kwargs):

print(x,y,z)

print(args)

print(kwargs)


func('a','b','c','Python','is easy',py='python',j='java',ph='php')

輸出結果:

a b c # 前三個實參賦給前三個形參

('Python', 'is easy') # *args接收元組數據

{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典數據

12.2 變數的作用域

變數的作用域即變數的有效范圍,可分為全局變數和局部變數。

局部變數

在函數中定義的變數就是局部變數,局部變數的作用域僅限於函數內部使用。

全局變數

在主程序中定義的變數就是全局變數,但在函數中用關鍵字global修飾的變數也可以當做全局變數來使用。

全局變數的作用域是整個程序,也就是說,全局變數可以在整個程序中可以訪問。

下面通過實例去討論:

程序1:

a=1 # a為全局變數

def a_add():

print('a的初值:',a) # 在函數中讀取a的值


a_add() # 調用函數a_add()

a+=1 # 主程序語句,a增加1

print('a現在的值是:',a) # 主程序語句,讀取a的值

運行結果:

a的初值: 1

a現在的值是: 2

這個結果和我們想像的一樣,全局變數a既可以在主程序中讀取,也可以在子程序(函數)中讀取。

程序2:

a=1

def a_add():

a+=1


print('a的初值:',a)

a_add()

print('a現在的值是:',a)

運行程序1時出現如下錯誤提示:

UnboundLocalError: local variable 'a' referenced before assignment

意思是:局部變數'a'在賦值之前被引用。

從語法上來講,該程序沒有錯誤。首先定義了一個全局變數a並賦值為1,又定義了一個函數a_add(),函數內的語句a+=1就是出錯的根源,雖然我們的初衷是想讓全局變數a的值增加1,但從錯誤提示看,這個語句中的a並不是全局變數,而是局部變數。看來,在函數中讀取全局變數的值是沒有問題的(在程序1中已經得到了驗證),但要在函數中改變全局變數的值是不行的(在程序2的錯誤提示a+=1中的a 是局部變數,而非全局變數)。

怎樣解決這個問題?

程序3:

a=1

def a_add(x):

x+=1

return x

print('a的初值:',a)

a=a_add(a)

print('a現在的值是:',a)

運行結果:

a的初值: 1

a現在的值是: 2

結果的確是正確的,但在函數a_add(x)中沒有調用變數a(沒有出現變數a)。

程序4:

a=1

def a_add(a):

a+=1

return a

print('a的初值:',a)

a=a_add(a)

print('a現在的值是:',a)

運行結果:

a的初值: 1

a現在的值是: 2

對比程序4和程序3不難發現,其實程序4隻是簡單的把函數的參數x變成了a,這個a的實質和程序3中的x還是一樣的。這進一步證實,函數中的a是局部變數,與主程序的全局變數a有著本質的區別。

程序5:

a=1

def a_add():

global a

a+=1


print('a的初值:',a)

a_add()

print('a現在的值是:',a)

運行結果:

a的初值: 1

a現在的值是: 2

程序5和程序2相比較,僅僅是在函數中添加了一個定義「global a」,此時的局部變數a就可以當做全局變數使用,由於它和全局變數a同名,自然也就不用區分a究竟是全局變數還是局部變數了,在主程序和該函數內都可以訪問、修改變數a的值了。

雖然使用global可使變數使用起來非常方便,但也容易引起混淆,故在使用過程中還是謹慎為好。

12.3 函數的遞歸與嵌套

遞歸,就是函數調用它自身。遞歸必須設置停止條件,否則函數將無法終止,形成死循環。

以計算階乘為例:

def func(n):

if n==1:

return 1

else:

return n*func(n-1) #func( )調用func( )

print(func(5))

運行結果為:120

嵌套,指在函數中調用另外的函數。這是程序中常見的一種結構,在此不再贅述。

匿名函數

Python中可以在參數前加上關鍵字lambda定義一個匿名函數,這樣的函數一般都屬於「一次性」的。

例如:

程序1:這是一個常規的函數定義和調用。

def f_add(x,y):

return x+y

print(f_add(2,3))

輸出結果:5

程序2:使用lambda定義匿名函數。

f_add=lambda x,y:x+y

print(f_add(2,3))

輸出結果:5

從上面的代碼可以看出,使用lambda僅僅減少了一行代碼。f_add=lambda x,y:x+y中的f_add不是變數名,而是函數名。程序1和程序2的print( )語句中的參數都是一樣的——調用函數f_add( )。所以,匿名函數並沒有太多的優點。

❷ 如何用python實現函數

分兩步:定義函數和調用函數。
1.定義函數用猛埋肢搭def關鍵字,然後定義函數名和入參,以及函數執行語句。
2.通過函數名調用函數即可,需要傳入參數的話需要枝飢螞加上參數值

❸ Python函數和模塊的定義與使用,包括變數的類型及匿名函數用法

函數是組織好,可重復使用的,用來實現相關功能的代碼段

函數提高了代碼的重復利用率和應用的模塊性。

除Python自帶的函數之外,也可以自己創建函數,叫做自定義函數

語法:

函數代碼塊以 def 開頭

參數為 輸入值 ,放於函數名後口號裡面,

函數內容以冒號:開始,函數體縮進, return 返回 輸出值

函數調用使用關鍵字參數來確定傳入的參數值,此時,如果多個函數則不需要按照指定順序。

在定義函數時,指定參數默認值。調用時如果不傳入參數,則使用默認值

不定長部分如果沒有指定參數,傳入是一個空元組

加了 兩個星號 ** 的參數會以字典的形式導入

/ 用來指明函數形參必須使用指定位置參數,不能使用關鍵字參數的形式。

3.8版本之後的才能使用

不使用 def 定義函數,沒有函數名

lamdba主體時一個表達式,而不是代碼塊,函數體比def簡單很多

定義在函數內部的為局部變數,僅能在函數內部使用

定義在函數外部的為全局變數,可在全局使用

模塊是將包含所有定義的函數和變數的文件,一般將同類功能的函數組和在一起稱為模塊。

模塊需要導入後,在調用相應函數進行使用

模塊導入的方法:

從模塊中導入一個指定的部分

把一個模塊的所有內容全都導入

❹ Python函數的定義(構造)和調用

這里來給大家演示一下,函數的定義或構造,並調用函數來實現封裝後的效果。

首先我們來看看想實現下面的這個效果,如果不使用函數應該怎麼實現。

以上兩種返回結果都是1-9這幾個數字。

以上兩種方法,第一種代碼重復率太高,代碼美觀效果太差,雖然能實現效果,但是因為數量比較少,還能手工打出來這幾行代碼,如果是列印1-100000就很難實現了。這時候for循環還是可以實現的,但是for循環只能實現類似的數字和變數循環,無法進行復雜的功能開發。鑒於此,函數這個概念就被python引入了,下面先來看看函數是怎麼實現上面的效果的,還是兩種方法。

這時候如果想實現上面的列印結果就直接使用函數名+小括弧調用函數就可以了,這種類型的語法,不僅可以反復使用,而且封裝後的代碼更美觀。

❺ python定義一個函數

def fn(*avg):
_ = avg[1]
_in = lambda x:x in _
for e in avg[1:]:
_ = list(filter(_in, e))
return _

print(fn((1,2,3),(1,2,5),(1,4,9,2)))

❻ Python函數的調用順序

定義的順序是 i,year,month 這就是形參的順序調用的時候 給實參 也必須是這個順序

閱讀全文

與python函數與函數定義與調用順序相關的資料

熱點內容
對弈下象棋的app哪裡好 瀏覽:705
有什麼食譜app推薦 瀏覽:469
python實現動態口令 瀏覽:823
我的世界電腦伺服器地址怎麼添加 瀏覽:850
傳奇地圖怎麼加密到pak 瀏覽:977
linux刪除mysql用戶 瀏覽:755
圖案設計pdf 瀏覽:584
pdf編輯器在線 瀏覽:471
華為雲雲耀伺服器如何關機 瀏覽:994
數字加密的歷史 瀏覽:613
宏傑文件夾打不開 瀏覽:819
施工日記app哪個好 瀏覽:566
什麼是壓縮機的排氣量 瀏覽:538
在哪個app可以預約一科考試 瀏覽:634
易語言vmp加殼源碼 瀏覽:513
閱讀前端框架源碼 瀏覽:14
我的世界命令方塊傳送指令 瀏覽:545
不能用start命令打開xp 瀏覽:925
text命令 瀏覽:30
為什麼appstore經常下架游戲 瀏覽:91