Python函數的定義與調用方法實例
1.定義和調用函數
Python 中使用def
語句創(chuàng)建函數,其一般的格式如下所示:
def name(arg1, arg2, ...,argN): statements
下面這段代碼定義了一個簡單函數。
def repeator(s, n): result = s * n print(result)
這段代碼僅僅是對函數的定義,并沒有調用執(zhí)行。這條定義語句運行后會新建一個名為repeator
的變量名,其類型為function
,即函數。
def repeator(s, n): result = s * n print(result) print(type(repeator)) # <class 'function'>
與內置函數一樣,定義完函數后,可以通過函數名調用執(zhí)行。
def repeator(s, n): result = s * n print(result) repeator('嗷', 3) # 嗷嗷嗷
在很多情況下,函數需要將計算的結果返回到調用處。在這類函數的函數體中,通常包含一條return
語句:
def name(arg1, arg2, ...,argN): statements return value
在創(chuàng)建函數時, 沒有在函數體中添加return
語句,Python 也會默默地在函數體最后添加一條return None
。
def repeator(s, n): result = s * n print(result) value = repeator('嗷', 3) # 嗷嗷嗷 print(value) # None
函數如果以返回值來輸出:
def repeator(s, n): result = s * n return result print(repeator('嗷', 3)) # 嗷嗷嗷
在 Python 中, 還允許在函數中返回多個值。 只需將返回值以逗號隔開, 放在return
關鍵字后面即可。
def calculator(m, n): return m+n, m-n, m*n, m/n i, j = 2, 4 r1, r2, r3, r4 = calculator(i, j) print(f'{i} 和 {j} 的加減乘除運算結果是:{r1},{r2},{r3},{r4}') # 2 和 4 的加減乘除運算結果是:6,-2,8,0.5
在這里總結一下函數調用的四個步驟:
- 程序執(zhí)行到函數調用時,在調用處暫停,等待函數執(zhí)行完畢;
- 將實參賦值給函數的形參;
- 執(zhí)行函數體中的語句;
- 調用結束后,回到調用前暫停處繼續(xù)執(zhí)行,如果函數體中執(zhí)行了
return
語句,return
關鍵字后的值會返回到暫停處,供程序使用,否則函數返回None
值。
2.函數參數
2.1 參數傳遞
參數的傳遞過程,實際上是一個賦值的過程。在調用函數時,調用者的實際參數自動賦值給函數的形式參數變量。
def avg(m, n): return (m + n) /2 print(avg(5, 2)) # 3.5
2.2 不可變和可變類型參數
目前我們所學習的不可變類型包括:整型、浮點型、字符串和元組,可變類型有:列表、字典和集合等。這些都可以作為參數的類型。但參數在函數中使用時,這兩種類型的表現有所不同。
下面的代碼調用時,傳遞的是不可變類型的參數:
def priceChanger(p): p = p + 10 print('改變后的價格:{:.2f}'.format(p)) price = 10.8 priceChanger(price) # 改變后的價格:20.80 print(price) # 10.8
在使用可變參數時,函數體中可以改變參數的元素:
def contentChanger(name_list): name_list[0], name_list[1] = name_list[1], name_list[0] print('函數中的 name_list:', name_list) language_name = ['C', 'Python'] contentChanger(language_name) # 函數中的 name_list: ['Python', 'C'] print('調用函數后的 language_name:', language_name) # 調用函數后的 language_name: ['Python', 'C']
因此,在使用可變類型參數時需要特別注意,如果在函數中修改了參數的元素,這種修改會影響調用者的變量。 如果想消除這種影響,可以使用列表copy
方法或者使用分片操作創(chuàng)建新列表。
2.3 位置參數
位置參數是調用函數為形參賦值的一種默認方式。實參與形參按照從左到右的位置順序依次賦值。
def myMinus(num1, num2): return num1 - num2 print(myMinus(5, 2)) # 3
賦值順序改變將得到不同的結果。
def myMinus(num1, num2): return num1 - num2 print(myMinus(2, 5)) # -3
2.4 關鍵字參數
為了避免位置參數賦值帶來的混亂,Python 允許調用函數時通過關鍵字參數的形式指定形參與實參的對應關系。 調用者使用name=value
的形式來指定函數中的哪個形參接受某個值:
def myMinus(num1, num2): return num1 - num2 print(myMinus(num1=5, num2=2)) # 3 print(myMinus(num2=2, num1=5)) # 3
2.5 指定默認參數值
在函數定義時,可以為參數指定值。這樣當函數調用者沒有提供對應參數值時,就可以使用指定的默認值。 指定默認參數值在 Python 的函數中廣泛存在。例如,打印函數print
,在查看其幫助時,其函數的部分描述如下:
print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments: file: a file-like object (stream); defaults to the current sys.stdout. sep: string inserted between values, default a space. end: string appended after the last value, default a newline. flush: whether to forcibly flush the stream.
可以看到,print
函數的sep
、end
、file
和flush
參數都指定了默認值。
print('C', 'C++', 'Java', 'Python') # C C++ Java Python
如果調用時指定了sep
參數的值,則會使用該值來連接每個打印的值。
print('C', 'C++', 'Java', 'Python', sep='_') # C_C++_Java_Python
在定義函數時, 為形參指定默認值, 就可以讓該形參在調用時變?yōu)榭蛇x:
def myMod(x, y=2): return x % y print(myMod(13,4)) # 1 print(myMod(13)) # 1
2.6 任意數量參數
Python 允許在定義函數時使用單星號*
來收集位置參數,雙星號**
收集關鍵字參數。
2.6.1 單星號*收集位置參數
單個星號將一組可變數量的位置參數組合成參數值的元組。在函數內部可以通過訪問元組中的每個元素來使用參數。
def m_value(*values): max_value = max(values) min_value = min(values) print(f'最大值: {max_value}, 最小值: {min_value}') m_value(8, 6, 7, 4, 3, 9) # 最大值: 9, 最小值: 3
2.6.2 雙星號**收集關鍵字參數
針對形參的關鍵字參數賦值形式, 利用 Python 定義函數時, 在形參前面加上雙星號**
來定義收集關鍵字參數的形參。此時形參是字典類型。
def f(**info): if 'name' not in info.keys(): print('必須擁有名稱信息。') else: print(info['name'] + '的誕生年份:' + info.get('time', '不詳')) f(name = 'C', time = '1972') # C的誕生年份:1972 f(name = 'Python') # Python的誕生年份:不詳
2.7 解包參數
在調用函數時,實參也可以使用*
和**
語法。此時不是收集參數,正好相反, 實參前加上*
或**
執(zhí)行的是參數解包。 通常來說, 在列表、元組等類型的實參值前加上*
, 將這些類型的元素解包成位置參數的形式;在字典類型的實參值前加上**
,將字典的元組解包成關鍵字參數的形式。
當調用者的數據存儲在列表中時, 可以通過在列表前加上*
對列表解包來實現位置參數形式的調用。
當調用者的數據存儲在字典中時, 可以通過在字典前加上**
對字典解包來實現關鍵字參數形式的調用。
def f(name, time='不詳'): if name and len(name) > 0: print(name + '的誕生年份:' + str(time)) else: print('必須擁有名稱信息。') info1 = ['C', '1972'] f(*info1) # C的誕生年份:1972 info2 = {'name': 'Python', 'time': '1989'} f(**info2) # Python的誕生年份:1989
總結
到此這篇關于Python函數的定義與調用方法的文章就介紹到這了,更多相關Python函數定義與調用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python生成可執(zhí)行文件.exe操作完整流程記錄
.exe是文件擴展名,帶有.exe擴展名的文件名按下Enter鍵就可運行,這篇文章主要給大家介紹了關于Python生成可執(zhí)行文件.exe操作完整流程的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-05-05PyCharm進行Django項目開發(fā)環(huán)境搭建
本文主要介紹了PyCharm進行Django項目開發(fā)環(huán)境搭建,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-02-02Pandas.DataFrame刪除指定行和列(drop)的實現
本文主要介紹了Pandas.DataFrame刪除指定行和列(drop)的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-02-02django model 條件過濾 queryset.filter(**condtions)用法詳解
這篇文章主要介紹了django model 條件過濾 queryset.filter(**condtions)用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05詳解Python的Django框架中manage命令的使用與擴展
這篇文章主要介紹了Python的Django框架中manage命令的使用與擴展,manage.py使得用戶借助manage命令在命令行中能實現諸多簡便的操作,需要的朋友可以參考下2016-04-04Python中JSON常見用法(json.load()、json.loads()、json.dump()、json.du
本文主要介紹了Python中JSON常見用法(json.load()、json.loads()、json.dump()、json.dumps()),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06