目錄
?編輯
8.3.4 結(jié)合使用函數(shù)和 while 循環(huán)
greeter.py
8.4 傳遞列表
greet_users.py
8.4.1 在函數(shù)中修改列表
printing_models.py
8.4.2 禁止函數(shù)修改列表
要將列表的副本傳遞給函數(shù),可以像下面這樣做:
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
8.3.4 結(jié)合使用函數(shù)和 while 循環(huán)
可將函數(shù)同本書前面介紹的任何Python結(jié)構(gòu)結(jié)合起來使用。例如,下面將結(jié)合使用函數(shù) get_formatted_name()和while循環(huán),以更正規(guī)的方式問候用戶。下面嘗試使用名和姓跟用戶打 招呼:
greeter.py
def get_formatted_name(first_name, last_name):
"""返回整潔的姓名"""
full_name = first_name + ' ' + last_name
return full_name.title()
# 這是一個(gè)無限循環(huán)!
while True:
1 print("\nPlease tell me your name:")
f_name = input("First name: ")
l_name = input("Last name: ")
formatted_name = get_formatted_name(f_name, l_name)
print("\nHello, " + formatted_name + "!")
在這個(gè)示例中,我們使用的是get_formatted_name()的簡單版本,不涉及中間名。其中的while 循環(huán)讓用戶輸入姓名:依次提示用戶輸入名和姓(見1)。 但這個(gè)while循環(huán)存在一個(gè)問題:沒有定義退出條件。請(qǐng)用戶提供一系列輸入時(shí),該在什么 地方提供退出條件呢?我們要讓用戶能夠盡可能容易地退出,因此每次提示用戶輸入時(shí),都應(yīng)提 供退出途徑。每次提示用戶輸入時(shí),都使用break語句提供了退出循環(huán)的簡單途徑:
def get_formatted_name(first_name, last_name):
"""返回整潔的姓名"""
full_name = first_name + ' ' + last_name
return full_name.title()
while True:
print("\nPlease tell me your name:")
print("(enter 'q' at any time to quit)")
f_name = input("First name: ")
if f_name == 'q':
break
l_name = input("Last name: ")
if l_name == 'q':
break
formatted_name = get_formatted_name(f_name, l_name)
print("\nHello, " + formatted_name + "!")
我們添加了一條消息來告訴用戶如何退出,然后在每次提示用戶輸入時(shí),都檢查他輸入的是 否是退出值,如果是,就退出循環(huán)?,F(xiàn)在,這個(gè)程序?qū)⒉粩嗟貑柡?,直到用戶輸入的姓或名?q' 為止:
Please tell me your name:
(enter 'q' at any time to quit)
First name: eric
Last name: matthes
Hello, Eric Matthes!
Please tell me your name:
(enter 'q' at any time to quit)
First name: q
8.4 傳遞列表
你經(jīng)常會(huì)發(fā)現(xiàn),向函數(shù)傳遞列表很有用,這種列表包含的可能是名字、數(shù)字或更復(fù)雜的對(duì) 象(如字典)。將列表傳遞給函數(shù)后,函數(shù)就能直接訪問其內(nèi)容。下面使用函數(shù)來提高處理列表 的效率。 假設(shè)有一個(gè)用戶列表,我們要問候其中的每位用戶。下面的示例將一個(gè)名字列表傳遞給一個(gè) 名為greet_users()的函數(shù),這個(gè)函數(shù)問候列表中的每個(gè)人:
greet_users.py
def greet_users(names):
"""向列表中的每位用戶都發(fā)出簡單的問候"""
for name in names:
msg = "Hello, " + name.title() + "!"
print(msg)
1 usernames = ['hannah', 'ty', 'margot']
greet_users(usernames)
我們將greet_users()定義成接受一個(gè)名字列表,并將其存儲(chǔ)在形參names中。這個(gè)函數(shù)遍歷收到 的列表,并對(duì)其中的每位用戶都打印一條問候語。在1處,我們定義了一個(gè)用戶列表——usernames, 然后調(diào)用greet_users(),并將這個(gè)列表傳遞給它:
Hello, Hannah!
Hello, Ty!
Hello, Margot!
輸出完全符合預(yù)期,每位用戶都看到了一條個(gè)性化的問候語。每當(dāng)你要問候一組用戶時(shí),都 可調(diào)用這個(gè)函數(shù)。
8.4.1 在函數(shù)中修改列表
將列表傳遞給函數(shù)后,函數(shù)就可對(duì)其進(jìn)行修改。在函數(shù)中對(duì)這個(gè)列表所做的任何修改都是永 久性的,這讓你能夠高效地處理大量的數(shù)據(jù)。
來看一家為用戶提交的設(shè)計(jì)制作3D打印模型的公司。需要打印的設(shè)計(jì)存儲(chǔ)在一個(gè)列表中, 打印后移到另一個(gè)列表中。下面是在不使用函數(shù)的情況下模擬這個(gè)過程的代碼:
printing_models.py
# 首先創(chuàng)建一個(gè)列表,其中包含一些要打印的設(shè)計(jì)
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
# 模擬打印每個(gè)設(shè)計(jì),直到?jīng)]有未打印的設(shè)計(jì)為止
# 打印每個(gè)設(shè)計(jì)后,都將其移到列表completed_models中
while unprinted_designs:
current_design = unprinted_designs.pop()
#模擬根據(jù)設(shè)計(jì)制作3D打印模型的過程
print("Printing model: " + current_design)
completed_models.append(current_design)
# 顯示打印好的所有模型
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
這個(gè)程序首先創(chuàng)建一個(gè)需要打印的設(shè)計(jì)列表,還創(chuàng)建一個(gè)名為completed_models的空列表, 每個(gè)設(shè)計(jì)打印都將移到這個(gè)列表中。只要列表unprinted_designs中還有設(shè)計(jì),while循環(huán)就模擬 打印設(shè)計(jì)的過程:從該列表末尾刪除一個(gè)設(shè)計(jì),將其存儲(chǔ)到變量current_design中,并顯示一條 消息,指出正在打印當(dāng)前的設(shè)計(jì),再將該設(shè)計(jì)加入到列表completed_models中。循環(huán)結(jié)束后,顯 示已打印的所有設(shè)計(jì):
Printing model: dodecahedron
Printing model: robot pendant
Printing model: iphone case
The following models have been printed:
dodecahedron
robot pendant
iphone case
為重新組織這些代碼,我們可編寫兩個(gè)函數(shù),每個(gè)都做一件具體的工作。大部分代碼都與 原來相同,只是效率更高。第一個(gè)函數(shù)將負(fù)責(zé)處理打印設(shè)計(jì)的工作,而第二個(gè)將概述打印了哪 些設(shè)計(jì):
1 def print_models(unprinted_designs, completed_models):
"""
模擬打印每個(gè)設(shè)計(jì),直到?jīng)]有未打印的設(shè)計(jì)為止
打印每個(gè)設(shè)計(jì)后,都將其移到列表completed_models中
"""
while unprinted_designs:
current_design = unprinted_designs.pop()
# 模擬根據(jù)設(shè)計(jì)制作3D打印模型的過程
print("Printing model: " + current_design)
completed_models.append(current_design)
2 def show_completed_models(completed_models):
"""顯示打印好的所有模型"""
print("\nThe following models have been printed:")
for completed_model in completed_models:
print(completed_model)
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
在1處,我們定義了函數(shù)print_models(),它包含兩個(gè)形參:一個(gè)需要打印的設(shè)計(jì)列表和一 個(gè)打印好的模型列表。給定這兩個(gè)列表,這個(gè)函數(shù)模擬打印每個(gè)設(shè)計(jì)的過程:將設(shè)計(jì)逐個(gè)地從未 打印的設(shè)計(jì)列表中取出,并加入到打印好的模型列表中。在2處,我們定義了函數(shù) show_completed_models(),它包含一個(gè)形參:打印好的模型列表。給定這個(gè)列表,函數(shù) show_completed_models()顯示打印出來的每個(gè)模型的名稱。 這個(gè)程序的輸出與未使用函數(shù)的版本相同,但組織更為有序。完成大部分工作的代碼都移到 了兩個(gè)函數(shù)中,讓主程序更容易理解。只要看看主程序,你就知道這個(gè)程序的功能容易看清得多:
unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']
completed_models = []
print_models(unprinted_designs, completed_models)
show_completed_models(completed_models)
我們創(chuàng)建了一個(gè)未打印的設(shè)計(jì)列表,還創(chuàng)建了一個(gè)空列表,用于存儲(chǔ)打印好的模型。接下來, 由于我們已經(jīng)定義了兩個(gè)函數(shù),因此只需調(diào)用它們并傳入正確的實(shí)參即可。我們調(diào)用 print_models()并向它傳遞兩個(gè)列表;像預(yù)期的一樣,print_models()模擬打印設(shè)計(jì)的過程。接 下來,我們調(diào)用show_completed_models(),并將打印好的模型列表傳遞給它,讓其能夠指出打印 了哪些模型。描述性的函數(shù)名讓別人閱讀這些代碼時(shí)也能明白,雖然其中沒有任何注釋。
相比于沒有使用函數(shù)的版本,這個(gè)程序更容易擴(kuò)展和維護(hù)。如果以后需要打印其他設(shè)計(jì), 只需再次調(diào)用print_models()即可。如果我們發(fā)現(xiàn)需要對(duì)打印代碼進(jìn)行修改,只需修改這些代碼 一次,就能影響所有調(diào)用該函數(shù)的地方;與必須分別修改程序的多個(gè)地方相比,這種修改的效 率更高。
這個(gè)程序還演示了這樣一種理念,即每個(gè)函數(shù)都應(yīng)只負(fù)責(zé)一項(xiàng)具體的工作。第一個(gè)函數(shù)打印 每個(gè)設(shè)計(jì),而第二個(gè)顯示打印好的模型;這優(yōu)于使用一個(gè)函數(shù)來完成兩項(xiàng)工作。編寫函數(shù)時(shí),如 果你發(fā)現(xiàn)它執(zhí)行的任務(wù)太多,請(qǐng)嘗試將這些代碼劃分到兩個(gè)函數(shù)中。別忘了,總是可以在一個(gè)函 數(shù)中調(diào)用另一個(gè)函數(shù),這有助于將復(fù)雜的任務(wù)劃分成一系列的步驟。
8.4.2 禁止函數(shù)修改列表
有時(shí)候,需要禁止函數(shù)修改列表。例如,假設(shè)像前一個(gè)示例那樣,你有一個(gè)未打印的設(shè)計(jì)列 表,并編寫了一個(gè)將這些設(shè)計(jì)移到打印好的模型列表中的函數(shù)。你可能會(huì)做出這樣的決定:即便 打印所有設(shè)計(jì)后,也要保留原來的未打印的設(shè)計(jì)列表,以供備案。但由于你將所有的設(shè)計(jì)都移出 了unprinted_designs,這個(gè)列表變成了空的,原來的列表沒有了。為解決這個(gè)問題,可向函數(shù)傳 遞列表的副本而不是原件;這樣函數(shù)所做的任何修改都只影響副本,而絲毫不影響原件。
要將列表的副本傳遞給函數(shù),可以像下面這樣做:
function_name(list_name[:])
切片表示法[:]創(chuàng)建列表的副本。在print_models.py中,如果不想清空未打印的設(shè)計(jì)列表,可像下面這樣調(diào)用print_models():
print_models(unprinted_designs[:], completed_models)
這樣函數(shù)print_models()依然能夠完成其工作,因?yàn)樗@得了所有未打印的設(shè)計(jì)的名稱,但 它使用的是列表unprinted_designs的副本,而不是列表unprinted_designs本身。像以前一樣,列 表completed_models也將包含打印好的模型的名稱,但函數(shù)所做的修改不會(huì)影響到列表 unprinted_designs。
雖然向函數(shù)傳遞列表的副本可保留原始列表的內(nèi)容,但除非有充分的理由需要傳遞副本,否 則還是應(yīng)該將原始列表傳遞給函數(shù),因?yàn)樽尯瘮?shù)使用現(xiàn)成列表可避免花時(shí)間和內(nèi)存創(chuàng)建副本,從 而提高效率,在處理大型列表時(shí)尤其如此。文章來源:http://www.zghlxwxcb.cn/news/detail-762245.html
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全12-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-762245.html
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
到了這里,關(guān)于關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全17的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!