python函數參數,python——自定義函數

 2023-11-30 阅读 33 评论 0

摘要:一、概述 在編寫腳本的過程中,對于要重復完成的工作,我們可以提取出來,將其編寫為函數,在腳本中使用時,調用即可,在python中,函數必須先聲明,然后才能在腳本中使用。使用函數時,只要按照函數定義形式向函數傳

一、概述

在編寫腳本的過程中,對于要重復完成的工作,我們可以提取出來,將其編寫為函數,在腳本中使用時,調用即可,在python中,函數必須先聲明,然后才能在腳本中使用。使用函數時,只要按照函數定義形式向函數傳遞必須的參數,就可以調用函數完成所需的功能。

二、自定義函數

2.1 函數聲明、調用

在python中使用def可以聲明一個函數。完整的函數是由函數名、參數以及函數實現語句組成的,在函數中也用縮進來表示語句屬于函數體。
如果函數有返回值,那么需要在函數中使用return語句返回計算結果,聲明函數形式一般如下:

de f<函數名>  (參數列表):<函數語句>return <返回值>
# 其中參數和返回值不是必須的

簡單示例

代碼:
def hi ():    #定義一個hi()函數,這里沒有參數,但是需要寫一對圓括號。print('hello,word !')hi()   #調用函數
print(hi)  # 返回函數在內存中的地址
執行結果:
hello,word !
<function hi at 0x0390F7C8>

以下是一個完整的函數,實現了求一個列表所有整數之和的功能,其中L為所要求和的列表,result是列表中所有整數的和,最后使用return將result的值返回。

代碼:
def ListSum(L):result = 0for i in L:result = result + ireturn resultList = [ 1, 2, 3,4 ]
Sum = ListSum( List )
print( Sum )執行結果:
10

Python的函數比較靈活。與C語言中函數的聲明相比,在Python中聲明一個函數時,不需要聲明函數類型,也不需要聲明參數的類型。Python 在實際調用函數的過程中也非常靈活,不需要為不同類型的參數聲明多個函數,或在處理不同類型數據的時候調用相應的函數。大部分情況下都可以用同一個函數調用不同的數據類型。

python函數參數,如下所示的函數,其功能是打印參數對象中的所有成員:

代碼:
def PrintAll(x):for i in x:print(i)l = [1, 2, 3, 4]   # 列表
PrintAll(l)
t = ('a', 'b', 'c')   # 元組
PrintAll(t)
d = {'tom': 1, 'anni': 2, 'susi': 3 }   # 字典
PrintAll(d)
執行結果:
1
2
3
4
a
b
c
tom
anni
susi

2.2 參數讓函數更有價值

2.2.1 有默認值的參數

在python中,可以在聲明函數的時候,預先為參數設置一個默認值。當調用函數時,如果某個參數具有默認值,則可以不向這個函數傳遞參數,這時,函數將使用事先聲明默認的參數值。

def <函數名> (參數 = 默認值):<語句>

以下代碼聲明了一個函數,用來計算參數的立方值,默認參數為5

代碼:
def Cube ( x = 5 ):return x ** 3
print(Cube())    # 為傳遞參數
print(Cube(2))  # 參數為2執行結果:
125
8

如果一個函數有多個參數,均聲明的默認值,在傳遞參數時僅想向最后一個傳遞。

代碼:
def Cube ( x = 1, y = 2, c = 3 ):return x * y +c
print(Cube())         # 結果為5
print(Cube(2))        # 結果為7,傳遞的是第一個參數
print(Cube(2,3))	  #結果為9傳遞的第一二個參數
print(Cube( , , 5))   #這樣執行結果是錯的

這里我們要換一種函數定義的方式

代碼:
def Cube ( x , y , c  ):if x == None:x = 1if y == None:y = 2if c == None:c = 3return x * y + cprint(Cube(None,None ,4))   # 加入判斷執行結果:
6
2.2.2 參數傳遞方式

? ? 在Python中,參數值的傳遞不只是按照聲明函數時參數的順序進行傳遞的,實際上,Python還提供了另外一種傳遞參數的方法一按照參 數名傳遞值。以參數名傳遞參數時類似于設置參數的默認值。
? ? 使用按參數名傳遞參數的方式調用函數時,要在調用函數名后的圓括號里為函數的所有參數賦值,賦值的順序不必按照函數聲明時的參數順序,

代碼:
def Cube ( x , y , c  ):if x == None:x = 1if y == None:y = 2if c == None:c = 3return x * y + cprint(Cube(y=3,c=3,x=3))   #賦值實現
執行結果:
12

python定義函數后調用???在python中也可以同時使用按參數順序傳遞與按參數名傳遞兩種方式,但是需要注意的是,按順序傳遞參數,要位于按參數名傳遞參數之前,而且不能有重復的情況,否則發生錯誤。

在有默認參數值的情況下,使用按參數名傳遞參數十分方便,上面的例子,我們就可以直接用參數名傳遞。

代碼:
def Cube ( x = 1, y = 2, c = 3 ):return x * y + c
print (Cube(c=5) )   # 這里x與y使用默認值,c重新被傳值
執行結果:
7
2.2.3 傳遞任意數量的值

在Python中,函數可以具有任意個參數,而不必在聲明函數時對所有參數進行定義。使用可變長參數的函數時,其所有參數都保存在一個元組里, 在函數中可以使用for循環來處理。聲明函數時,如果在參數名前加上一個星號“*",則表示該參數是一個可變長參數

代碼:
def mylistappend(*list):l = []for i in list:l.extend(i)return la = [ 1, 2, 3]
b = [ 4, 5, 6]
c = [ 7, 8, 9]
x = mylistappend(a)
y = mylistappend(a,b)
z = mylistappend(a,b,c)
print(x)
print(y)
print(z)
執行結果:
[1, 2, 3]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
2.2.4 用參數返回計算結果

在C語言中,可以通過在參數中使用指針來達到改變參數值的作用,從而/達到從函數中返回結果的目的。其實,在Python中,還有更簡單的實現方法,即在參數中使用可變對象(如列表等),使函數中的結果返回到參數中,從而達到從函數中返回計算結果的目的```

代碼:
def ChangeValue1(x):x = x + 1
def ChangeValue2(x):x[0] = x[0] + 2
a = 1
b = [2]
c = ChangeValue1(a)    
d = ChangeValue2(b)
for i in (a,b,c,d):print(i)
執行結果:
1           # a的值為改變,因為a為不可變對象
[4]         # b的值被改變           
None        # 函數未設返回值,所以為空。
None

三、變量的作用域

?? 在python中,不同的函數可以具有相同的參數名,在函數中已經聲明過的函數名,在函數之外也可以使用,而在腳本運行過程中其值并不影響。

代碼:
def fun1(x):a = [1]    # 在函數內定義一個名為a的列表a.append(x)print(a)a = [1,2,3,4]   # 在函數外定義一個名為a的列表
fun1(2)
print(a)
執行結果:
[1, 2]
[1, 2, 3, 4]
  • 上述代碼中,兩個同名的列表之所以值不同,是因為它們處于不同的作用域里。在Python中,作用域可以分為內置作用域、全局作用域和局部作用域。內置作用域是Python預先定義的,全局作用域是所編寫的整個腳本,局部作用域是某個函數內部范圍。
  • ??上述代碼中,函數中的列表a處于局部作用域中。而函數外的列表a處于全局作用域內。局部作用域內變量的改變并不影響全局作用域內的變量,除非通過引用的形式傳遞參數。

如果要在函數中使用函數外的變量,則可以在變量名前使用global關鍵字。

代碼:
def fun (x):global areturn a + x
a = 5    # a為全局變量,在fun函數中聲明的
print( fun(3) )
a = 2
print( fun(3) )
執行結果:
8           # 5+3
5           # 2+3

四、用lambda聲明函數

python eval函數、用lambda表達式來聲明函數,是Python中一類比較特殊的聲明函數的方式,lambda來源于LISP語言。使用lambda可以聲明一個匿名函數。所謂匿名函數是指所聲明的函數沒有函數名,lambda表達式就是一個簡單的函數。使用lambda聲明的函數可以返回一個值,在調用函數時,直接使用lambda表達式的返回值。使用lambda聲明函數的一般形式如下。
lambda 參數列表:表達式

以下函數定義了一個lambda函數,并調用了這個函數.

代碼:
fun = lambda x: x * x - x      # 使用lambda定義一個函數,并返回函數地址
print( fun(3) )    # 返回函數值
print(fun)      # 返回函數地址,fun實際指向了lambda定義的函數地址
執行結果:
6
<function <lambda> at 0x0067F7C8>

lambda適合定義小型函數,與def函數定義不同,使用lambda聲明的函數,在函數中僅能包含單一的函數參數表達式,而不能包含其他語句,在lambda中也可以調用其他的函數。

代碼:
def show():        # 使用def定義函數print('hello world')   
f = lambda:show()   # 在lamdba中調用
f()def show1(n):print('hello'*n)
fn = lambda x : show1(x)    # 在lambda函數中向show傳值
fn(2)                   # 調用lambda函數
def userreturn(x):return(x*2)
fun = lambda x:userreturn(x)*x   # 在 lambda函數中使用userreturn函數的返回值
print(fun(3))    # 3*2*3

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/188639.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息