Python編程入門指南之函數(shù)
Python編程:函數(shù)
函數(shù)是帶名字的代碼塊,用于完成具體的工作。要執(zhí)行函數(shù)定義的特定任務(wù),可調(diào)用該函數(shù)。需要在程序中多次執(zhí)行同一項任務(wù)時,你無需反復(fù)編寫完成該任務(wù)的代碼,而只需調(diào)用執(zhí)行該任務(wù)的函數(shù),讓 Python 運行其中的代碼。函數(shù)可以極大地簡化代碼編寫與讓代碼結(jié)構(gòu)清晰化。
定義和調(diào)用函數(shù)
>>>def greeting(): >>> """簡單問候""" >>> print("Hello!")
關(guān)鍵字 def 來告訴 Python 你要定義一個函數(shù),后面緊跟函數(shù)名。在括號內(nèi)指出函數(shù)為完成其任務(wù)需要什么樣的信息。緊跟在 def greet_user(): 后面的所有縮進行構(gòu)成了函數(shù)體。三引號(""" “”")內(nèi)的文本是被稱為**文檔字符串( docstring )**的注釋,描述了函數(shù)是做什么的,Python 使用它們來生成有關(guān)程序中函數(shù)的文檔。
>>>greeting() Hello!
要調(diào)用函數(shù),可依次指定函數(shù)名以及用括號括起的必要信息。
向函數(shù)傳遞信息
如果我們在打招呼時,需要用戶的名字用作抬頭。為此,可在函數(shù)定義 def greet_user() 的括號內(nèi)添加 username。
>>>def greeting(username): >>> """簡單問候用戶""" >>> print("Hello,"+username.title()+"!") greeting("jessi") Hello,Jessi!
在函數(shù)greet_user() 的定義中,變量 username 是一個 形參 —— 函數(shù)完成其工作所需的一項信息。在代碼 greet_user(‘jesse’) 中,值 ‘jesse’ 是一個 實參——調(diào)用函數(shù)時傳遞給函數(shù)的信息。將實參傳遞給函數(shù)并存儲在形參中。
傳遞實參:位置實參
你調(diào)用函數(shù)時, Python 必須將函數(shù)調(diào)用中的每個實參都關(guān)聯(lián)到函數(shù)定義中的一個形參。
最簡單的關(guān)聯(lián)方式是基于實參的順序,這種關(guān)聯(lián)方式被稱為位置實參。此時調(diào)用函數(shù)時實參的位置十分重要,需要與形參對應(yīng),不然會引發(fā)邏輯錯誤。
>>>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.
傳遞實參:關(guān)鍵字實參
關(guān)鍵字實參是傳遞給函數(shù)值時,直接在實參中將名稱和值關(guān)聯(lián)起來。此時實參的位置不再重要,形參所對應(yīng)的值已經(jīng)明示了。
describe_pet(animal_type='hamster', pet_name='harry')
傳遞實參:默認(rèn)值
編寫函數(shù)時,可給每個形參指定 默認(rèn)值 。在調(diào)用函數(shù)中給形參提供了實參時, Python 將使用指定的實參值,否則,將使用形參的默認(rèn)值。默認(rèn)值必須放在形參最后。
>>>def describe_pet(pet_name, animal_type='dog'): -snip- >>>describe_pet(pet_name='willie')
你提供的實參多于或少于函數(shù)完成其工作所需的信息時,將出現(xiàn)實參不匹配錯誤。
傳遞列表
將列表傳遞給函數(shù)可以提升列表處理的效率。比如將用戶姓名列表 username 傳遞給 greeting() 函數(shù)可以生成批量打招呼的輸出。
def greeting(usernames): """給用戶打招呼""" for name in usernames: print("Hello, " + name.title() + "!")
禁止函數(shù)修改列表
有了傳遞列表的功能我們就可以批量修改列表中的數(shù)據(jù)。有時候,我們需要獲取列表中的數(shù)據(jù)而保持原始列表不變,此時就要使用切片表示法禁止修改列表。此時函數(shù)處理的是列表的副本,而原始列表不變。
function_name(list_name[:])
傳遞任意數(shù)量實參
當(dāng)顧客要點一個pizza,我們不知道ta要點多少種配料,就可以寫成如下形式:
>>>def make_pizza(*toppings): >>> -snip-
形參名 *toppings 中的星號讓 Python 創(chuàng)建一個名為 toppings 的空元組,并將收到的所有值都封裝到這個元組中。
結(jié)合使用位置實參和任意數(shù)量實參
如果顧客要點一個pizza并且告知它的尺寸和配料:
>>>def make_pizza(size, *toppings): >>> -snip
使用任意數(shù)量的關(guān)鍵字實參
有時候,需要接受任意數(shù)量的實參,但預(yù)先不知道傳遞給函數(shù)的會是什么樣的信息。在這種情況下,可使用字典接收輸入的實參。
>>>def build_profile(**user_info): """創(chuàng)建字典存儲用戶信息""" 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 中的兩個星號讓 Python 創(chuàng)建一個名為 user_info 的空字典,并將收到的所有鍵值對都封裝到這個字典中。
返回值
函數(shù)并非總是直接顯示輸出,相反,它可以處理一些數(shù)據(jù),并返回一個或一組值。函數(shù)返回的值被稱為返回值 。
可使用return返回調(diào)用函數(shù)的代碼行。返回值讓你能夠?qū)⒊绦虻拇蟛糠址敝毓ぷ饕频胶瘮?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ù)的人就只需在必要時才提供額外的信息。
例如,有些人的名字有中間名,有些人沒有,我們就可以給實參 middle_name 指定一個默認(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ù)可返回任何類型的值,包括列表和字典等較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
>>>def build_person(first_name,last_name): """返回包含人物信息的字典""" >>> person={'first':first_name,'last':last_name} >>> return person
將函數(shù)存儲在模塊中
函數(shù)的優(yōu)點之一是,使用它們可將代碼塊與主程序分離。我們可以更進一步將函數(shù)存儲在模塊中,在主程序中導(dǎo)入模塊。
導(dǎo)入整個模塊
模塊是擴展名為 .py 的文件,包含要導(dǎo)入到程序中的代碼。
import pizza
代碼行 import pizza 讓 Python 打開文件 pizza.py ,并將其中的所有函數(shù)都復(fù)制到這個程序中。調(diào)用模塊中的函數(shù)用句點法:
module_name.function_name()
導(dǎo)入特定函數(shù)
如果你不需要模塊中的所有函數(shù),只需要其中某個特定函數(shù):
from module_name import function_name from module_name import function_name #導(dǎo)入模塊中某幾個函數(shù)
使用as給函數(shù)指定別名
如果要導(dǎo)入的函數(shù)的名稱可能與程序中現(xiàn)有的名稱沖突,或者函數(shù)的名稱太長,可指定簡短而獨一無二的 別名 —— 函數(shù)的另一個名稱,類似于外號。
from pizza import make_pizza as mp #將函數(shù)make_pizza()重新命名為mp()
使用as給模塊指定別名
你還可以給模塊指定別名。這樣不僅能使代碼更簡潔,還可以讓你不再關(guān)注模塊名,而專注于描述性的函數(shù)名。這些函數(shù)名明確地指出了函數(shù)的功能,對理解代碼而言,它們比模塊名更重要。
import module_name as mn
導(dǎo)入模塊中的所有函數(shù)
from module_name import *
import 語句中的 * 讓 Python 將模塊 pizza 中的每個函數(shù)都復(fù)制到這個程序文件中。由于導(dǎo)入了每個函數(shù),可通過名稱來調(diào)用每個函數(shù),而無需使用句點表示法。
然而,最好不要采用這種導(dǎo)入方法:如果模塊中有函數(shù)的名稱與你的項目中使用的名稱相同,可能導(dǎo)致意想不到的結(jié)果: Python 可能遇到多個名稱相同的函數(shù)或變量,進而覆蓋函數(shù),而不是分別導(dǎo)入所有的函數(shù)。
函數(shù)編寫指南
1.應(yīng)給函數(shù)指定描述性名稱,且只在其中使用小寫字母和下劃線
2.每個函數(shù)都應(yīng)包含簡要地闡述其功能的注釋,該注釋應(yīng)緊跟在函數(shù)定義后面,并采用文檔字符串格式
3.給形參指定默認(rèn)值時與使用關(guān)鍵字實參時,等號兩邊不要有空格
4.如果程序或模塊包含多個函數(shù),可使用兩個空行將相鄰的函數(shù)分開
5.所有的 import 語句都應(yīng)放在文件開頭,唯一例外的情形是,在文件開頭使用了注釋來描述整個程序
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
python實現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能
這篇文章主要介紹了python實現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02Django crontab定時任務(wù)模塊操作方法解析
這篇文章主要介紹了Django crontab定時任務(wù)模塊操作方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09pyspark.sql.DataFrame與pandas.DataFrame之間的相互轉(zhuǎn)換實例
今天小編就為大家分享一篇pyspark.sql.DataFrame與pandas.DataFrame之間的相互轉(zhuǎn)換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08python Dijkstra算法實現(xiàn)最短路徑問題的方法
這篇文章主要介紹了python Dijkstra算法實現(xiàn)最短路徑問題的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09python 字典 setdefault()和get()方法比較詳解
這篇文章主要介紹了python 字典 setdefault()和get()方法比較詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08