Python編程入門(mén)指南之函數(shù)
Python編程:函數(shù)
函數(shù)是帶名字的代碼塊,用于完成具體的工作。要執(zhí)行函數(shù)定義的特定任務(wù),可調(diào)用該函數(shù)。需要在程序中多次執(zhí)行同一項(xiàng)任務(wù)時(shí),你無(wú)需反復(fù)編寫(xiě)完成該任務(wù)的代碼,而只需調(diào)用執(zhí)行該任務(wù)的函數(shù),讓 Python 運(yùn)行其中的代碼。函數(shù)可以極大地簡(jiǎn)化代碼編寫(xiě)與讓代碼結(jié)構(gòu)清晰化。
定義和調(diào)用函數(shù)
>>>def greeting():
>>> """簡(jiǎn)單問(wèn)候"""
>>> print("Hello!")
關(guān)鍵字 def 來(lái)告訴 Python 你要定義一個(gè)函數(shù),后面緊跟函數(shù)名。在括號(hào)內(nèi)指出函數(shù)為完成其任務(wù)需要什么樣的信息。緊跟在 def greet_user(): 后面的所有縮進(jìn)行構(gòu)成了函數(shù)體。三引號(hào)(""" “”")內(nèi)的文本是被稱(chēng)為**文檔字符串( docstring )**的注釋?zhuān)枋隽撕瘮?shù)是做什么的,Python 使用它們來(lái)生成有關(guān)程序中函數(shù)的文檔。
>>>greeting() Hello!
要調(diào)用函數(shù),可依次指定函數(shù)名以及用括號(hào)括起的必要信息。
向函數(shù)傳遞信息
如果我們?cè)诖蛘泻魰r(shí),需要用戶的名字用作抬頭。為此,可在函數(shù)定義 def greet_user() 的括號(hào)內(nèi)添加 username。
>>>def greeting(username):
>>> """簡(jiǎn)單問(wèn)候用戶"""
>>> print("Hello,"+username.title()+"!")
greeting("jessi")
Hello,Jessi!
在函數(shù)greet_user() 的定義中,變量 username 是一個(gè) 形參 —— 函數(shù)完成其工作所需的一項(xiàng)信息。在代碼 greet_user(‘jesse’) 中,值 ‘jesse’ 是一個(gè) 實(shí)參——調(diào)用函數(shù)時(shí)傳遞給函數(shù)的信息。將實(shí)參傳遞給函數(shù)并存儲(chǔ)在形參中。
傳遞實(shí)參:位置實(shí)參
你調(diào)用函數(shù)時(shí), Python 必須將函數(shù)調(diào)用中的每個(gè)實(shí)參都關(guān)聯(lián)到函數(shù)定義中的一個(gè)形參。
最簡(jiǎn)單的關(guān)聯(lián)方式是基于實(shí)參的順序,這種關(guān)聯(lián)方式被稱(chēng)為位置實(shí)參。此時(shí)調(diào)用函數(shù)時(shí)實(shí)參的位置十分重要,需要與形參對(duì)應(yīng),不然會(huì)引發(fā)邏輯錯(cuò)誤。
>>>def describe_pet(animal_type, pet_name):
>>>""" 顯示寵物的信息 """
>>>print("My " + animal_type + "'s name is " + pet_name.title() + ".")
>>>describe_pet('hamster', 'harry')
My hamster's name is Harry.
傳遞實(shí)參:關(guān)鍵字實(shí)參
關(guān)鍵字實(shí)參是傳遞給函數(shù)值時(shí),直接在實(shí)參中將名稱(chēng)和值關(guān)聯(lián)起來(lái)。此時(shí)實(shí)參的位置不再重要,形參所對(duì)應(yīng)的值已經(jīng)明示了。
describe_pet(animal_type='hamster', pet_name='harry')
傳遞實(shí)參:默認(rèn)值
編寫(xiě)函數(shù)時(shí),可給每個(gè)形參指定 默認(rèn)值 。在調(diào)用函數(shù)中給形參提供了實(shí)參時(shí), Python 將使用指定的實(shí)參值,否則,將使用形參的默認(rèn)值。默認(rèn)值必須放在形參最后。
>>>def describe_pet(pet_name, animal_type='dog'): -snip- >>>describe_pet(pet_name='willie')
你提供的實(shí)參多于或少于函數(shù)完成其工作所需的信息時(shí),將出現(xiàn)實(shí)參不匹配錯(cuò)誤。
傳遞列表
將列表傳遞給函數(shù)可以提升列表處理的效率。比如將用戶姓名列表 username 傳遞給 greeting() 函數(shù)可以生成批量打招呼的輸出。
def greeting(usernames):
"""給用戶打招呼"""
for name in usernames:
print("Hello, " + name.title() + "!")
禁止函數(shù)修改列表
有了傳遞列表的功能我們就可以批量修改列表中的數(shù)據(jù)。有時(shí)候,我們需要獲取列表中的數(shù)據(jù)而保持原始列表不變,此時(shí)就要使用切片表示法禁止修改列表。此時(shí)函數(shù)處理的是列表的副本,而原始列表不變。
function_name(list_name[:])
傳遞任意數(shù)量實(shí)參
當(dāng)顧客要點(diǎn)一個(gè)pizza,我們不知道ta要點(diǎn)多少種配料,就可以寫(xiě)成如下形式:
>>>def make_pizza(*toppings): >>> -snip-
形參名 *toppings 中的星號(hào)讓 Python 創(chuàng)建一個(gè)名為 toppings 的空元組,并將收到的所有值都封裝到這個(gè)元組中。
結(jié)合使用位置實(shí)參和任意數(shù)量實(shí)參
如果顧客要點(diǎn)一個(gè)pizza并且告知它的尺寸和配料:
>>>def make_pizza(size, *toppings): >>> -snip
使用任意數(shù)量的關(guān)鍵字實(shí)參
有時(shí)候,需要接受任意數(shù)量的實(shí)參,但預(yù)先不知道傳遞給函數(shù)的會(huì)是什么樣的信息。在這種情況下,可使用字典接收輸入的實(shí)參。
>>>def build_profile(**user_info):
"""創(chuàng)建字典存儲(chǔ)用戶信息"""
profile{}
for key,value in user_info.items():
profile[key]=value
return profile
>>>user_profile=build_profile(local='London',field='physics')
>>>print(user_profile)
{'local':'London','field':'physics'}
形參 **user_info 中的兩個(gè)星號(hào)讓 Python 創(chuàng)建一個(gè)名為 user_info 的空字典,并將收到的所有鍵值對(duì)都封裝到這個(gè)字典中。
返回值
函數(shù)并非總是直接顯示輸出,相反,它可以處理一些數(shù)據(jù),并返回一個(gè)或一組值。函數(shù)返回的值被稱(chēng)為返回值 。
可使用return返回調(diào)用函數(shù)的代碼行。返回值讓你能夠?qū)⒊绦虻拇蟛糠址敝毓ぷ饕频胶瘮?shù)中去完成,從而簡(jiǎn)化主程序。
返回簡(jiǎn)單值
可將輸出完整姓名提出來(lái)作為一個(gè)函數(shù)模塊,此時(shí)主程序只有兩行:
>>>def get_formatted_name(first_name, middle_name, last_name):
>>>""" 返回整潔的姓名 """
>>> full_name = first_name + ' ' + middle_name + ' ' + last_name
>>> return full_name.title()
>>>musician = get_formatted_name('john', 'lee', 'hooker')
>>>print(musician)
John Lee Hooker
讓實(shí)參可選
有時(shí)候,需要讓實(shí)參變成可選的,這樣使用函數(shù)的人就只需在必要時(shí)才提供額外的信息。
例如,有些人的名字有中間名,有些人沒(méi)有,我們就可以給實(shí)參 middle_name 指定一個(gè)默認(rèn)值 —— 空字符串,
并將其移到形參列表的末尾:
>>>def get_formatted_name(first_name, last_name, middle_name=''):
"""返回整潔姓名"""
>>> if middle_name:
>>> full_name = first_name + ' ' + middle_name + ' ' + last_name
>>> else:
>>> full_name = first_name + ' ' + last_name
>>> return full_name
返回字典
函數(shù)可返回任何類(lèi)型的值,包括列表和字典等較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
>>>def build_person(first_name,last_name):
"""返回包含人物信息的字典"""
>>> person={'first':first_name,'last':last_name}
>>> return person
將函數(shù)存儲(chǔ)在模塊中
函數(shù)的優(yōu)點(diǎn)之一是,使用它們可將代碼塊與主程序分離。我們可以更進(jìn)一步將函數(shù)存儲(chǔ)在模塊中,在主程序中導(dǎo)入模塊。
導(dǎo)入整個(gè)模塊
模塊是擴(kuò)展名為 .py 的文件,包含要導(dǎo)入到程序中的代碼。
import pizza
代碼行 import pizza 讓 Python 打開(kāi)文件 pizza.py ,并將其中的所有函數(shù)都復(fù)制到這個(gè)程序中。調(diào)用模塊中的函數(shù)用句點(diǎn)法:
module_name.function_name()
導(dǎo)入特定函數(shù)
如果你不需要模塊中的所有函數(shù),只需要其中某個(gè)特定函數(shù):
from module_name import function_name from module_name import function_name #導(dǎo)入模塊中某幾個(gè)函數(shù)
使用as給函數(shù)指定別名
如果要導(dǎo)入的函數(shù)的名稱(chēng)可能與程序中現(xiàn)有的名稱(chēng)沖突,或者函數(shù)的名稱(chēng)太長(zhǎng),可指定簡(jiǎn)短而獨(dú)一無(wú)二的 別名 —— 函數(shù)的另一個(gè)名稱(chēng),類(lèi)似于外號(hào)。
from pizza import make_pizza as mp #將函數(shù)make_pizza()重新命名為mp()
使用as給模塊指定別名
你還可以給模塊指定別名。這樣不僅能使代碼更簡(jiǎn)潔,還可以讓你不再關(guān)注模塊名,而專(zhuān)注于描述性的函數(shù)名。這些函數(shù)名明確地指出了函數(shù)的功能,對(duì)理解代碼而言,它們比模塊名更重要。
import module_name as mn
導(dǎo)入模塊中的所有函數(shù)
from module_name import *
import 語(yǔ)句中的 * 讓 Python 將模塊 pizza 中的每個(gè)函數(shù)都復(fù)制到這個(gè)程序文件中。由于導(dǎo)入了每個(gè)函數(shù),可通過(guò)名稱(chēng)來(lái)調(diào)用每個(gè)函數(shù),而無(wú)需使用句點(diǎn)表示法。
然而,最好不要采用這種導(dǎo)入方法:如果模塊中有函數(shù)的名稱(chēng)與你的項(xiàng)目中使用的名稱(chēng)相同,可能導(dǎo)致意想不到的結(jié)果: Python 可能遇到多個(gè)名稱(chēng)相同的函數(shù)或變量,進(jìn)而覆蓋函數(shù),而不是分別導(dǎo)入所有的函數(shù)。
函數(shù)編寫(xiě)指南
1.應(yīng)給函數(shù)指定描述性名稱(chēng),且只在其中使用小寫(xiě)字母和下劃線
2.每個(gè)函數(shù)都應(yīng)包含簡(jiǎn)要地闡述其功能的注釋?zhuān)撟⑨寫(xiě)?yīng)緊跟在函數(shù)定義后面,并采用文檔字符串格式
3.給形參指定默認(rèn)值時(shí)與使用關(guān)鍵字實(shí)參時(shí),等號(hào)兩邊不要有空格
4.如果程序或模塊包含多個(gè)函數(shù),可使用兩個(gè)空行將相鄰的函數(shù)分開(kāi)
5.所有的 import 語(yǔ)句都應(yīng)放在文件開(kāi)頭,唯一例外的情形是,在文件開(kāi)頭使用了注釋來(lái)描述整個(gè)程序
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python3視頻轉(zhuǎn)字符動(dòng)畫(huà)的實(shí)例代碼
這篇文章主要介紹了Python3視頻轉(zhuǎn)字符動(dòng)畫(huà)的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
Python Word文件自動(dòng)化實(shí)戰(zhàn)之簡(jiǎn)歷篩選
本文將利用Python自動(dòng)化做一個(gè)具有實(shí)操性的小練習(xí),即通過(guò)讀取簡(jiǎn)歷來(lái)篩選出符合招聘條件的簡(jiǎn)歷。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-05-05
使用python進(jìn)行nc轉(zhuǎn)tif的3種情況解決
在進(jìn)行氣候分析時(shí),很多人都會(huì)用到ERA5數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于如何使用python進(jìn)行nc轉(zhuǎn)tif的3種情況的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Python使用Socket(Https)Post登錄百度的實(shí)現(xiàn)代碼
以前都是用一些高級(jí)模塊,封裝的比較好,今天嘗試使用socket模塊登錄百度,弄了半天才弄好,主要由于百度在登陸頁(yè)使用了https,我們需要對(duì)socket進(jìn)行一定處理2012-05-05
Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù)
這篇文章主要介紹了Python練習(xí)之操作SQLite數(shù)據(jù)庫(kù),主要通過(guò)三個(gè)問(wèn)題如何創(chuàng)建SQLite數(shù)據(jù)庫(kù)?如何向SQLite表中插入數(shù)據(jù)?如何查詢(xún)SQLite表中的數(shù)據(jù)?展開(kāi)文章主題詳情,需要的朋友可以參考一下2022-06-06

