日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

十二、Python第十二课——函数

發(fā)布時(shí)間:2025/3/8 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十二、Python第十二课——函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(請(qǐng)先看置頂博文)https://blog.csdn.net/GenuineMonster/article/details/104495419

目錄

(請(qǐng)先看置頂博文)https://blog.csdn.net/GenuineMonster/article/details/104495419

?

目錄

目錄

(請(qǐng)先看置頂博文)https://blog.csdn.net/GenuineMonster/article/details/104495419

一、定義函數(shù)

二、傳遞實(shí)參

1、位置實(shí)參

2、關(guān)鍵字實(shí)參

3、默認(rèn)值

4、避免實(shí)參錯(cuò)誤

三、函數(shù)的返回值

1、返回簡(jiǎn)單值

2、返回字典

四、傳遞列表

1、在函數(shù)中對(duì)列表進(jìn)行修改

2、禁止函數(shù)修改列表

五、傳遞任意數(shù)量的實(shí)參

1、結(jié)合位置實(shí)參,使用任意數(shù)量實(shí)參。(位置實(shí)參和任意數(shù)量實(shí)參共用)

2、結(jié)合關(guān)鍵之字實(shí)參,使用任意數(shù)量實(shí)參。(關(guān)鍵字實(shí)參和任意數(shù)量實(shí)參共用)

六、函數(shù)與模塊的關(guān)系

1、導(dǎo)入模塊中的特定函數(shù)

2、使用as為函數(shù)、模塊重命名

3、使用*號(hào)導(dǎo)入模塊中的所有函數(shù)

4、函數(shù)編寫指南


?

?

?

?

?

函數(shù)的特點(diǎn):

1、函數(shù)可將程序分成多個(gè)部分,每部分都負(fù)責(zé)完成一項(xiàng)具體的任務(wù),也可存放到單獨(dú)的文件中。

2、代碼分塊化、函數(shù)化后,更加易于維護(hù)、調(diào)用、重用和排除故障。

所以在這一節(jié)里我們將學(xué)習(xí)函數(shù)的定義、參數(shù)類型、如何傳參等內(nèi)容,上一節(jié)課也說了,這部分內(nèi)容相比之前的難度增大了許多,所以要反復(fù)理解、及時(shí)復(fù)習(xí)。

一、定義函數(shù)

定義函數(shù)的關(guān)鍵字是def,在def后要寫這個(gè)函數(shù)的名字,最好起一個(gè)和這個(gè)函數(shù)實(shí)現(xiàn)功能相關(guān)的函數(shù)名,方便閱讀。最后增加圓括號(hào)(有的函數(shù)需要參數(shù),下面會(huì)講)和冒號(hào),函數(shù)聲明的第一步就完成了。下面給出一個(gè)簡(jiǎn)單函數(shù)的例子,包含對(duì)函數(shù)代碼的備注:

# 定義一個(gè)具有問候功能的函數(shù) # 使用關(guān)鍵字def告訴編譯器接下來(lái)的代碼塊是一個(gè)函數(shù) """顯示簡(jiǎn)單的問候語(yǔ)""" def greet_user():print("Hello!") #打印hellogreet_user() # 調(diào)用greet_user函數(shù)

冒號(hào)后面縮進(jìn)的程序構(gòu)成了函數(shù)體,實(shí)現(xiàn)函數(shù)的主要功能,此處只有一句打印問候語(yǔ)。調(diào)用函數(shù)也十分簡(jiǎn)單,只需要在合適的位置依次指定函數(shù)名以及括號(hào)括起的必要信息(就是參數(shù))。定義函數(shù)語(yǔ)句的上一行有被三個(gè)雙引號(hào)括住的漢字,這個(gè)被稱為“文檔字符串的注釋”(在我看來(lái)就是段備注),Python編譯器會(huì)使用三引號(hào)括起的文檔字符串生成有關(guān)程序中函數(shù)的文檔。上面這個(gè)函數(shù)是最簡(jiǎn)單的函數(shù)結(jié)構(gòu),接下來(lái)的函數(shù)都是以這個(gè)結(jié)構(gòu)為原型進(jìn)行拓展的。

我們現(xiàn)在做一些改動(dòng),將這段程序的函數(shù)變得復(fù)雜一丟丟。在函數(shù)定義def greet_user()的括號(hào)內(nèi)增加username(這就是所謂的函數(shù)參數(shù)),這樣我們就可以將代碼改為:

# 定義一個(gè)具有問候功能的函數(shù) # 使用關(guān)鍵字def告訴編譯器接下來(lái)的代碼塊是一個(gè)函數(shù) """顯示簡(jiǎn)單的問候語(yǔ)""" def greet_user(username):print("Hello! " + username.title() + ". ") #打印hello+用戶姓名greet_user('jesse') # 調(diào)用greet_user函數(shù)

因?yàn)槎x函數(shù)時(shí)我們加入了參數(shù),所以我們?cè)谡{(diào)用時(shí)也得增加內(nèi)容,函數(shù)將會(huì)把我們?cè)谡{(diào)用時(shí)增加的內(nèi)容傳遞給參數(shù)“username”,然后使用新的print()語(yǔ)句打印出對(duì)某個(gè)人的問候語(yǔ)。說到這,就要說一下參數(shù)的類型:形參和實(shí)參。形參就是我們?cè)诼暶骱瘮?shù)時(shí)在括號(hào)內(nèi)寫的的“username”,可以將其理解為形式上的參數(shù);而實(shí)參就是我們上一段代碼中調(diào)用函數(shù)時(shí)在括號(hào)中輸入的“jesse”。(形參:函數(shù)完成其工作所需的一項(xiàng)信息;實(shí)參:實(shí)參是調(diào)用函數(shù)時(shí)傳遞給函數(shù)的信息)(還有:這個(gè)實(shí)參形參只是一個(gè)稱謂,如果有人混淆了,也不要大驚小怪,我們理解那個(gè)意思就好!)

二、傳遞實(shí)參

鑒于函數(shù)定義中可能包含多個(gè)形參,所以在函數(shù)調(diào)用時(shí),也必須包含多個(gè)實(shí)參。(或者說:調(diào)用函數(shù)時(shí),Python編譯器必須將函數(shù)調(diào)用中的每個(gè)實(shí)參都關(guān)聯(lián)到函數(shù)定義中的一個(gè)形參)傳遞實(shí)參的方式很多,可使用位置實(shí)參(要求實(shí)參的順序與形參的順序相同)。也可以使用關(guān)鍵字實(shí)參,其中每個(gè)實(shí)參都由變量名和值組成。還可以用列表和字典。

1、位置實(shí)參

位置實(shí)參是最簡(jiǎn)單的關(guān)聯(lián)(傳參)方式,為明白其中的原理,我們用一個(gè)示例代碼來(lái)解釋一下。下面的代碼是一個(gè)顯示寵物信息的函數(shù)。這個(gè)函數(shù)指明寵物的種類和名稱:

def describe_pet(animal_type, pet_name):"""顯示寵物信息"""print("\nI have a " + animal_type + ". ")print("My " + animal_type + "'s name is " + pet_name.title() + ". ") describe_pet('hasmster','harry')

上面這段代碼定義的函數(shù)包含兩個(gè)形參,分別是動(dòng)物類型和寵物名稱。那么,我們?cè)谡{(diào)用這個(gè)函數(shù)時(shí),使用位置實(shí)參的方法,按照形參的順序,依次輸入“hasmster”和“harry”,就可以將這兩個(gè)實(shí)參分別與形參一一對(duì)應(yīng)起來(lái),最后成功打印出來(lái)“我有什么(動(dòng)物類型)以及我的(寵物類型)的(寵物名稱)是什么”。(特別提示:位置實(shí)參的順序很重要)同樣,我們可以更換“hasmster”和“harry”對(duì)應(yīng)的內(nèi)容,重新調(diào)用已定義的函數(shù)。由此,定義函數(shù)的意義也就出來(lái)了:高效,只需要寫一次代碼,改變實(shí)參的內(nèi)容,就可以在接下來(lái)的代碼中多次使用。

2、關(guān)鍵字實(shí)參

關(guān)鍵字實(shí)參是傳遞給函數(shù)的名稱—值對(duì)。直接在實(shí)參中將名稱和值關(guān)聯(lián)起來(lái),因此向函數(shù)傳遞實(shí)參時(shí)不會(huì)混淆。關(guān)鍵字實(shí)參的優(yōu)點(diǎn)是:無(wú)需考慮函數(shù)調(diào)用中的實(shí)參順序,并且能清楚地指出函數(shù)調(diào)用中各個(gè)值的用途。那么,接下來(lái)的代碼,我將會(huì)使用關(guān)鍵字實(shí)參演示:

我們觀察可以看到,describe_pet()函數(shù)的定義部分沒有變,變得只是調(diào)用函數(shù)時(shí)的傳參方式(關(guān)鍵字實(shí)參)。一旦使用關(guān)鍵字的實(shí)參,那么實(shí)參的順序就無(wú)關(guān)緊要了,因?yàn)榈忍?hào)已經(jīng)指定了實(shí)參與形參的對(duì)應(yīng)關(guān)系。所以以下兩種調(diào)用函數(shù)代碼的輸出結(jié)果是一致的。

describe_pet(animal_type = 'hasmster',pet_name = 'harry') describe_pet(pet_name = 'harry',animal_type = 'hasmster')

3、默認(rèn)值

我們?cè)诙x函數(shù)時(shí),可以給每個(gè)形參指定默認(rèn)值。在調(diào)用函數(shù)中給形參提供實(shí)參時(shí),Python將使用指定的實(shí)參值;否則,將使用形參的默認(rèn)值。因此,給形參指定默認(rèn)值后,可在函數(shù)調(diào)用中省略相應(yīng)的參數(shù)。使用默認(rèn)值的優(yōu)點(diǎn)是:可簡(jiǎn)化函數(shù)調(diào)用,還可清楚的指出函數(shù)的典型用法。例如,發(fā)現(xiàn)調(diào)用函數(shù)describe_pet()時(shí),描述的大都是小狗,就可將形參animal_type的默認(rèn)值設(shè)為‘dog’,如此一來(lái),再調(diào)用函數(shù)描述小狗時(shí),就可以不用提供這種信息了。例如:

def describe_pet(pet_name,animal_type='dog'):"""顯示寵物信息"""print("I have a " + animal_type + ". ")print("My " + animal_type + "'s name is " + pet_name.title() + ". ") print("位置實(shí)參:") describe_pet('harry') print("關(guān)鍵字實(shí)參:") describe_pet(pet_name = 'harry') print("默認(rèn)值是否可修改驗(yàn)證:") describe_pet(pet_name = 'harry',animal_type = 'cat')

上面這段代碼為寵物類型指定了形參的默認(rèn)值,那么我們只需要對(duì)寵物名稱進(jìn)行傳參即可。我分別使用了兩種傳參方式,并且驗(yàn)證了一下“寵物類型雖然指定默認(rèn)值,但仍舊可以傳參的事實(shí)”。細(xì)心的同學(xué)觀察到:上述代碼在定義函數(shù)時(shí),修改了形參的排列順序(與之前的代碼相比較)。假設(shè),我們沒有對(duì)形參的順序進(jìn)行修改,并且使用的是“位置實(shí)參”。如果此時(shí)調(diào)用函數(shù),僅僅指定動(dòng)物名稱,那么就會(huì)出現(xiàn)下面的錯(cuò)誤:

這是因?yàn)閷櫸镱愋鸵呀?jīng)被指定,我們?cè)谡{(diào)用函數(shù)時(shí),Python編譯器將會(huì)把第一個(gè)實(shí)參與第一個(gè)形參關(guān)聯(lián)起來(lái)。所以,定義函數(shù)和調(diào)用函數(shù)要一致。另外,在使用默認(rèn)值時(shí),在形參列表中必須先列出沒有默認(rèn)值的形參,再列出有默認(rèn)值的形參。如此一來(lái),Python編譯器能夠正確解讀位置實(shí)參。那么按照紅字原則定義出來(lái)的函數(shù)將會(huì)有多種調(diào)用函數(shù)的方法,無(wú)論哪種方法,只要函數(shù)調(diào)用能生成期待的輸出就行。

4、避免實(shí)參錯(cuò)誤

開始使用函數(shù)之后,我們可以犯的錯(cuò)誤又多了很多種。其中一種是實(shí)參錯(cuò)誤:我們?cè)谡{(diào)用函數(shù)時(shí)所提供的實(shí)參多于或少于函數(shù)完成其工作所需的信息時(shí),將出現(xiàn)實(shí)參不匹配的錯(cuò)誤。我們舉個(gè)例子,解釋一下,并且詳細(xì)講解一下traceback的報(bào)錯(cuò)信息。

def desribe_pet(animal_type,pet_name):"""顯示寵物的信息"""print("\nI have a " + animal_type + ". ")print("My " + animal_type + "'s name is " + pet_name.tiltle() + ". ") describe_pet()

?在1處:traceback指出了問題出現(xiàn)在什么地方;在2處,指出了導(dǎo)致問題的函數(shù)調(diào)用;在3處,traceback指出該函數(shù)調(diào)用少了兩個(gè)參數(shù),并指出了相應(yīng)形參的名稱。如果提供的實(shí)參多了,traceback也會(huì)出現(xiàn)類似的錯(cuò)誤提示。

三、函數(shù)的返回值

1、返回簡(jiǎn)單值

?完成上面的函數(shù)定義、函數(shù)傳參之后,我們進(jìn)行函數(shù)的返回。通過上面的例代碼,我們發(fā)現(xiàn)確實(shí)定義了函數(shù)、確實(shí)調(diào)用函數(shù)(傳遞參數(shù))、也確實(shí)見到了對(duì)應(yīng)結(jié)果的輸出,但是怎么沒看見返回值?這是因?yàn)槲覀兩厦娴暮瘮?shù)例子都是無(wú)返回值的函數(shù)。函數(shù)收到實(shí)參后進(jìn)行的處理工作并非都是直接輸出,它可能也要處理一些數(shù)據(jù)什么的,然后返回一個(gè)或一組值,所以函數(shù)返回的值就被稱為返回值。編程語(yǔ)言中(Python、C、C++)用return語(yǔ)句將值返回到調(diào)用函數(shù)的代碼行。下面通過一個(gè)例子進(jìn)行詳細(xì)的說明:

def get_formatted_name(first_name,last_name):"""返回整潔的姓名"""full_name = first_name + ' ' + last_namereturn full_name.title() musician = get_formatted_name('jimi','hendrix') print(musician)

解釋:函數(shù)名為get_formatted_name,在定義時(shí)有兩個(gè)形參分別是first_name,last_name。當(dāng)函數(shù)被調(diào)用且受到兩個(gè)實(shí)參時(shí),代碼將會(huì)讓“名字”和“姓氏”重新組合為一個(gè)完整的姓名,然后將其存儲(chǔ)在full_name中,使用return語(yǔ)句返回完整姓名(開頭大寫)。這個(gè)full_name的值會(huì)返回到調(diào)用函數(shù)get_formatted()的那一行代碼里,并將返回值賦給musician,最后使用print語(yǔ)句將完整的名字輸出。值得注意的是在調(diào)用有返回值的函數(shù)時(shí),需要為其提供一個(gè)變量,存儲(chǔ)返回值。可能有同學(xué)就會(huì)詢問了,我們明明能很簡(jiǎn)單的將這個(gè)名字完整的輸出,為什么要寫一個(gè)如此繁瑣的程序?別急,往下看(手動(dòng)滑稽)

2、返回字典

函數(shù)可返回任何類型的值,包括列表和字典等較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。如下例代碼所示:

def build_person(first_name,last_name):# 返回一個(gè)字典,其中包含有關(guān)一個(gè)人的信息person = {'first':first_name,'last':last_name}return person musician = build_person('jimi','hendrix') print(musician)

函數(shù)build_person()接受名和姓,并將這些值封裝到字典里。我們還可以擴(kuò)展這個(gè)函數(shù),增加其可接受的值,如下例代碼所示:(在函數(shù)定義時(shí),我們新增了一個(gè)可選形參age,空字符串,將其作為備選項(xiàng))

def build_person(first_name,last_name,age=''):# 返回一個(gè)字典,其中包含有關(guān)一個(gè)人的信息person = {'first':first_name,'last':last_name}if age: #如果調(diào)用函數(shù)時(shí)由年齡,那么就把年齡存儲(chǔ)起來(lái),一起輸出;若沒有,直接輸出person['age'] = agereturn person musician = build_person('jimi','hendrix',age = 27) print(musician)

下面是沒有年齡時(shí)的輸出:

在本小節(jié)的最后,我們將函數(shù)與while循環(huán)結(jié)合起來(lái),寫一個(gè)問候用戶的程序,從而更正規(guī)的問候用戶。

def get_formatted_name(first_name,last_name):# 返回整潔的姓名full_name = first_name + ' '+last_namereturn full_name.title()# 接下來(lái)是一個(gè)無(wú)限不循環(huán)代碼片段 while True: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 + "!")

四、傳遞列表

向函數(shù)傳遞列表很有用,列表包含的可能是名字、數(shù)字或更復(fù)雜的對(duì)象(如字典)。將列表傳遞給函數(shù)后,函數(shù)就能直接訪問了。下面給出一個(gè)例子:將名字列表傳遞給一個(gè)名為greet_users()的函數(shù),這個(gè)函數(shù)問候列表中的每一個(gè)人。

?

def greet_users(names): # 這里的names是形參"""向列表中的每位用戶都發(fā)出簡(jiǎn)單的問候"""for name in names: # 函數(shù)處理時(shí)按列表處理即可(直接傳參數(shù)就行)msg = "Hello, " + name.title() + "!"print(msg)usernames = ['hannah','try','margot'] # 名字列表 greet_users(usernames) # 這里的usernames是實(shí)參

1、在函數(shù)中對(duì)列表進(jìn)行修改

將列表傳遞給函數(shù)后,函數(shù)就可對(duì)其進(jìn)行修改。在函數(shù)中對(duì)這個(gè)列表所做的任何修改都是永久的,如此一來(lái)就能夠高效的處理大量的數(shù)據(jù)了。有如下例代碼,初級(jí)版本是這樣的:

# 需要打印的列表 unprinted_designs = ['iphone case','robot pendant','dodecahedron'] # 打印完的列表 completed_models = []# 模擬打印每個(gè)設(shè)計(jì),直到?jīng)]有未打印的設(shè)計(jì)為止 # 打印每個(gè)設(shè)計(jì)后,都將其移到列表compled_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)

但是上述代碼,在處理大量數(shù)據(jù)時(shí),效率不怎么高。所以,我們將在接下來(lái)對(duì)其進(jìn)行改進(jìn),使其效率更高。我們?cè)O(shè)計(jì)兩個(gè)函數(shù),讓其分別進(jìn)行一項(xiàng)具體的工作。第一個(gè)函數(shù)負(fù)責(zé)打印設(shè)計(jì)的工作,第二個(gè)函數(shù)將概述打印了哪些設(shè)計(jì)。

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) 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)

這兩段代碼的輸出結(jié)果一樣,但是后者組織的更有序,大部分工作的代碼轉(zhuǎn)移到了這兩個(gè)函數(shù)中,讓主程序更加簡(jiǎn)約、容易理解。除此以外,這段代碼更容易被維護(hù)和擴(kuò)展。通過上述代碼,可以學(xué)習(xí)一種編碼原則:每個(gè)函數(shù)都應(yīng)負(fù)責(zé)一項(xiàng)具體的工作。除此之外,一個(gè)函數(shù)還可以調(diào)用另一個(gè)函數(shù)。

2、禁止函數(shù)修改列表

? ? ? ?

? ? ? ?函數(shù)能修改列表,這已經(jīng)是事實(shí)了。有些時(shí)候,我們得禁止函數(shù)修改列表。還是打印的例子,比如我們?cè)诖蛴⊥瓿珊?#xff0c;依然需要保留原來(lái)的打印列表。此時(shí),我們可以這樣解決:可向函數(shù)傳遞列表的副本而不是原件,這樣函數(shù)所做的任何修改都只會(huì)影響副本而不影響原件。

? ? ? ?調(diào)用函數(shù)使用副本的代碼如下所示:

print_models(unprinted_designs[:],completed_models)

不知道你們還是否知道上述代碼中“[ :]”這個(gè)代表什么,這個(gè)是之前學(xué)習(xí)的切片,這里表示創(chuàng)建原列表的副本。雖然可以向函數(shù)傳遞列表的副本可保留原始列表的內(nèi)容,但除非是有充分的理由需要傳遞副本,否則還是應(yīng)該將原始列表傳遞給函數(shù)。(因?yàn)樽尯瘮?shù)使用現(xiàn)成的列表可避免花時(shí)間和內(nèi)存創(chuàng)建副本,從而提高代碼效率。即時(shí)間復(fù)雜度和空間復(fù)雜度)

五、傳遞任意數(shù)量的實(shí)參

有時(shí)候在寫函數(shù)時(shí),不知道將會(huì)有多少個(gè)實(shí)參傳遞進(jìn)來(lái),此時(shí)也不用去構(gòu)思。因?yàn)镻ython允許函數(shù)從調(diào)用語(yǔ)句中收集任意數(shù)量的實(shí)參。如下例代碼:

def make_pizza(*toppings): # 帶*號(hào)的意思是創(chuàng)建一個(gè)名為toppings的空元組,將收到的所有值都封裝到這個(gè)元組內(nèi)"""打印顧客點(diǎn)的所有配料"""print(toppings)make_pizza('pepperoni') make_pizza('mushrooms','green peppers','extra cheese')

在成功嘗試傳遞任意數(shù)量的實(shí)參之后,接下來(lái)可以把函數(shù)中的print重新改寫,要對(duì)配料進(jìn)行遍歷,并一一輸出。

def make_pizza(*toppings): # 帶*號(hào)的意思是創(chuàng)建一個(gè)名為toppings的空元組,將收到的所有值都封裝到這個(gè)元組內(nèi)"""打印顧客點(diǎn)的所有配料"""print("\nMaking a pizza with the following toppings:")for topping in toppings:print("- " + topping)make_pizza('pepperoni') make_pizza('mushrooms','green peppers','extra cheese')

由上述實(shí)驗(yàn)可以看出,無(wú)論函數(shù)收到的實(shí)參個(gè)數(shù)有多少個(gè),這種語(yǔ)法都管用。

1、結(jié)合位置實(shí)參,使用任意數(shù)量實(shí)參。(位置實(shí)參和任意數(shù)量實(shí)參共用)

如果要讓函數(shù)接受不同類型的實(shí)參,必須在函數(shù)定義中將接納任意數(shù)量實(shí)參的形參放在最后。Python先匹配位置實(shí)參和關(guān)鍵字實(shí)參,再將余下的實(shí)參都收集到最后一個(gè)形參中。舉例:

def make_pizza(size,*toppings): # 帶*號(hào)的意思是創(chuàng)建一個(gè)名為toppings的空元組,將收到的所有值都封裝到這個(gè)元組內(nèi)"""說明要制作的披薩"""print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")for topping in toppings:print("- " + topping)make_pizza(16,'pepperoni') make_pizza(12,'mushrooms','green peppers','extra cheese')

2、結(jié)合關(guān)鍵之字實(shí)參,使用任意數(shù)量實(shí)參。(關(guān)鍵字實(shí)參和任意數(shù)量實(shí)參共用)

這種方法適合于需要接受任意數(shù)量的實(shí)參、未知類型的實(shí)參。此時(shí),可以將函數(shù)編寫成能夠接受任意數(shù)量的鍵—值對(duì)(調(diào)用語(yǔ)句提供多少就接受多少)

def build_profile(first,last,**user_info): # "**"代表字典,“*”代表列表# 函數(shù)build_profile()的定義要求提供姓和名,同時(shí)允許用戶根據(jù)需要提供任意數(shù)量的“名稱-值”對(duì)。# “**user_info”代表創(chuàng)建一個(gè)名為user_info的空字典,并將所有收到的“名稱—值”對(duì),存入這個(gè)字典"""創(chuàng)建一個(gè)字典,其中包含我們知道的有關(guān)用戶的一切"""profile = {}profile['first_name'] = firstprofile['last_name'] = lastfor key, value in user_info.items():profile[key] = valuereturn profile user_profile = build_profile('albert','einstein',location='princeton',field='physics')print(user_profile)

綜上,通過上述實(shí)驗(yàn),我們知道:在編寫函數(shù)時(shí),可以以各種方式混合使用位置實(shí)參、關(guān)鍵字實(shí)參和任意數(shù)量的實(shí)參。

六、函數(shù)與模塊的關(guān)系

大家都知道“調(diào)包俠”的梗,其中的包就是我們接下來(lái)要說的模塊。而函數(shù)的優(yōu)點(diǎn)之一時(shí)可以讓他們的代碼塊與主程序分離。因此,我們可以把函數(shù)存儲(chǔ)在被稱為“模塊”的獨(dú)立文件中,再將模塊使用“import”導(dǎo)入到主程序中。如此一來(lái),不僅可以隱藏程序代碼的細(xì)節(jié),而且還可以將重點(diǎn)放在程序的高層邏輯上,最后還可以提高程序的重用性。下面將會(huì)給出例代碼。

第一個(gè)文件是模塊文件,名為code,我自己起的。

def make_pizza(size,*toppings):"""概述要制作的披薩"""print("\nMaking a " + str(size) + "-inch pizza with the following toppings:")for topping in toppings:print("- " + topping)

第二個(gè)文件是主程序文件,名為making_pizzas,書上起的。

import code # 要想使用被調(diào)入模塊的函數(shù),得寫明是哪個(gè)模塊的哪個(gè)函數(shù) # 可簡(jiǎn)單的理解為“模塊名+‘.’+函數(shù)名”。 code.make_pizza(16,'pepperoni') code.make_pizza(12,'mushrooms','green peppers','extra cheese')

運(yùn)行時(shí)需注意,要運(yùn)行第二個(gè)文件,不能直接點(diǎn)擊“run”,要在第二個(gè)文件代碼間,點(diǎn)擊右鍵,運(yùn)行代碼。(Pycharm)整個(gè)程序運(yùn)行的機(jī)理是:Python編譯器讀取到這個(gè)文件時(shí),代碼運(yùn)行import code,讓Python編譯器打開文件code.py,并將其中的所有函數(shù)都復(fù)制到這個(gè)程序中。你看不到這個(gè)復(fù)制過程,因?yàn)樗谀缓筮M(jìn)行。上述過程完成之后,code.py中的所有函數(shù)都能在making_pizza.py中使用。(調(diào)用模塊的程序和未調(diào)用模塊的原始程序的輸出結(jié)果是完全相同的)

1、導(dǎo)入模塊中的特定函數(shù)

如果模塊過大,而我們只需要導(dǎo)入其中的部分函數(shù)即可:“from? 模塊名 import 函數(shù)名”,如果還以做披薩的代碼為例,那么如下:

from code import make_pizzamake_pizza(16,'pepperoni') make_pizza(12,'mushrooms','green peppers','extra cheese')

若使用這樣直接導(dǎo)入模塊函數(shù)的方法,在使用方法時(shí),就無(wú)需指明是哪個(gè)模塊了,直接用就OK了。

2、使用as為函數(shù)、模塊重命名

使用模塊多了之后,模塊名或者函數(shù)名容易沖突(最好在命名時(shí)要遵守一定的規(guī)則,我們?cè)诘?部分介紹),有的函數(shù)名過長(zhǎng),在使用時(shí)不太方便,所以需要為這些“特殊情況”指定新的、簡(jiǎn)短的、獨(dú)一無(wú)二的名字(nickname)。還以做披薩為例:

from code import make_pizza as mp # 使用as,將起的nickname加在后面mp(16,'pepperoni') mp(12,'mushrooms','green peppers','extra cheese')

第一句代碼執(zhí)行之后,make_pizza()重命名為mp(),在以后需要使用make_pizza()函數(shù)時(shí),都可簡(jiǎn)寫程mp()。以上是函數(shù)的重命名,接下來(lái)是模塊的重命名,仍然以做披薩為例:

import code as p # 用as將模塊名“code”改為“p” # 下面調(diào)用make_pizza()的函數(shù)調(diào)用方法對(duì)應(yīng)改變,如下所示!!!p.make_pizza(16,'pepperoni') p.make_pizza(12,'mushrooms','green peppers','extra cheese')

這樣做的好處是:不僅能使代碼簡(jiǎn)化,而且可以讓我們更專注于描述函數(shù)性的函數(shù)名,這些函數(shù)名指出了函數(shù)的功能。

3、使用*號(hào)導(dǎo)入模塊中的所有函數(shù)

from code import * # 用as將模塊名“code”改為“p” # 下面調(diào)用make_pizza()的函數(shù)調(diào)用方法對(duì)應(yīng)改變make_pizza(16,'pepperoni') make_pizza(12,'mushrooms','green peppers','extra cheese')

這個(gè)和直接導(dǎo)入整個(gè)模塊有區(qū)別嗎?import語(yǔ)句中的*號(hào)讓模塊中的全部函數(shù)都復(fù)制到了主程序文件中,因此可以直接使用函數(shù)名稱來(lái)調(diào)用每個(gè)函數(shù),無(wú)需再用“.”。但是,在使用并非自己寫的大型模塊時(shí),最好不要采用這種導(dǎo)入方法:如果模塊中有函數(shù)的名稱與自己的項(xiàng)目中使用的名稱相同,可能會(huì)導(dǎo)致想不到的結(jié)構(gòu)。最佳的做法是:要么導(dǎo)入你需要使用的函數(shù),要么導(dǎo)入整個(gè)模塊并使用句點(diǎn)表示法。這樣做能讓代碼更清晰,容易閱讀、理解。

4、函數(shù)編寫指南

A、應(yīng)該給函數(shù)指定描述性名稱,且只在其中使用小寫字母和下劃線。這樣看到函數(shù)名稱就知道這個(gè)函數(shù)的功能。模塊命名時(shí),也是同樣的道理。

B、每個(gè)函數(shù)都應(yīng)包含簡(jiǎn)要的闡述其功能的注釋,該注釋應(yīng)緊跟在函數(shù)定義后面,并采用文檔字符串格式。只要知道函數(shù)的名稱、需要的實(shí)參以及返回值類型,就能在自己的程序中使用它。

C、給實(shí)參指定默認(rèn)值時(shí),等號(hào)兩邊不要有空格。同樣,對(duì)于函數(shù)調(diào)用中的關(guān)鍵字實(shí)參,也是同樣的道理。

D、建議代碼行的長(zhǎng)度不要超過79字符,這樣只要編輯其窗口適中,就能看到整行代碼。如果形參很多,導(dǎo)致函數(shù)定義的長(zhǎng)度超過了79字符,可在函數(shù)定義中輸入左括號(hào)后按回車,并在下一行按2次Tab鍵,從而將形參列表和只縮進(jìn)一層的函數(shù)本體區(qū)分開來(lái)。

E、如果程序或模塊包含多個(gè)函數(shù),可使用兩個(gè)空行將相鄰的函數(shù)分開,這樣將更容易知道前一個(gè)函數(shù)在什么地方結(jié)束,下一個(gè)函數(shù)從什么地方開始。

F、所有的import語(yǔ)句都應(yīng)該放在文件開頭,除了在文件開頭有注釋。

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的十二、Python第十二课——函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。