您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“怎么創(chuàng)建和調(diào)用Python中的函數(shù)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“怎么創(chuàng)建和調(diào)用Python中的函數(shù)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
函數(shù)用 def
語(yǔ)句創(chuàng)建,語(yǔ)法如下:
def 函數(shù)名(參數(shù)列表): # 具體情況具體對(duì)待,參數(shù)可有可無(wú) """函數(shù)說(shuō)明文檔字符串""" 函數(shù)封裝的代碼 ……
標(biāo)題行由 def
關(guān)鍵字,函數(shù)的名字,以及參數(shù)的集合(如果有的話(huà))組成
def
子句的剩余部分包括了一個(gè)雖然可選但是強(qiáng)烈推薦的文檔字串,和必需的函數(shù)體
函數(shù)名稱(chēng) 的命名應(yīng)該 符合 標(biāo)識(shí)符的命名規(guī)則
可以由 字母、下劃線(xiàn) 和 數(shù)字 組成
不能以數(shù)字開(kāi)頭
不能與關(guān)鍵字重名
def washing_machine(): # 洗衣機(jī)可以幫我們完成 print("打水") print("洗衣服") print("甩干")
使用一對(duì)圓括號(hào) () 調(diào)用函數(shù),如果沒(méi)有圓括號(hào),只是對(duì)函數(shù)的引用
任何輸入的參數(shù)都必須放置在括號(hào)中
圖例:
案例:加洗衣粉
def washing_machine(): # 洗衣機(jī)可以幫我們完成 print("打水") print("加洗衣粉?。?!") print("洗衣服") print("甩干") # 早上洗衣服 washing_machine() # 中午洗衣服 washing_machine() # 晚上洗衣服 washing_machine()
總結(jié)
定義好函數(shù)之后,只表示這個(gè)函數(shù)封裝了一段代碼而已
如果不主動(dòng)調(diào)用函數(shù),函數(shù)是不會(huì)主動(dòng)執(zhí)行的
思考
能否將 函數(shù)調(diào)用 放在 函數(shù)定義 的上方?
不能!
因?yàn)樵?使用函數(shù)名 調(diào)用函數(shù)之前,必須要保證 Python
已經(jīng)知道函數(shù)的存在
否則控制臺(tái)會(huì)提示 NameError: name 'menu' is not defined
(名稱(chēng)錯(cuò)誤:menu 這個(gè)名字沒(méi)有被定義)
形參:定義 函數(shù)時(shí),小括號(hào)中的參數(shù),是用來(lái)接收參數(shù)用的,在函數(shù)內(nèi)部 作為變量使用
實(shí)參:調(diào)用 函數(shù)時(shí),小括號(hào)中的參數(shù),是用來(lái)把數(shù)據(jù)傳遞到 函數(shù)內(nèi)部 用的
問(wèn)題
當(dāng)我們想洗其他的東西,要手動(dòng)改方法內(nèi)部的代碼:
def washing_machine(): # 洗衣機(jī)可以幫我們完成 print("打水") print("加洗衣粉?。?!") print("洗床單") # 洗被套 print("甩干")
在函數(shù)內(nèi)部有一定的變化的值:
def washing_machine(): # 洗衣機(jī)可以幫我們完成 print("打水") print("加洗衣粉!??!") print("洗衣服") print("甩干") washing_machine() def washing_machine(): # 洗衣機(jī)可以幫我們完成 print("打水") print("加洗衣粉?。?!") print("洗床單") print("甩干") washing_machine() ......
思考一下存在什么問(wèn)題
函數(shù)只能處理固定的數(shù)據(jù)
如何解決?
如果能夠把需要處理的數(shù)據(jù),在調(diào)用函數(shù)時(shí),傳遞到函數(shù)內(nèi)部就好了!
在函數(shù)名的后面的小括號(hào)內(nèi)部填寫(xiě) 參數(shù)
多個(gè)參數(shù)之間使用 ,
分隔
調(diào)用函數(shù)時(shí),實(shí)參的個(gè)數(shù)需要與形參個(gè)數(shù)一致,實(shí)參將依次傳遞給形參
def washing_machine(something): # 洗衣機(jī)可以幫我們完成 print("打水") print("加洗衣粉?。?!") print("洗" + something) print("甩干") # 洗衣服 washing_machine("衣服") # 洗床單 washing_machine("床單")
圖例
def washing_machine(xidiji,something): # 洗衣機(jī)可以幫我們完成 print("打水") print("加" + xidiji) print("洗衣服" + something) print("甩干") #早上洗衣服 #按照參數(shù)位置順序傳遞參數(shù)的方式叫做位置傳參 #使用洗衣機(jī),執(zhí)行洗衣機(jī)內(nèi)部的邏輯 washing_machine("洗衣液","衣服")#something = 衣服 #中午洗被罩 washing_machine("洗衣粉","被罩")# something = 被罩 #晚上洗床單 washing_machine("五糧液","床單")# something = 床單
作用
函數(shù),把 具有獨(dú)立功能的代碼塊 組織為一個(gè)小模塊,在需要的時(shí)候 調(diào)用
函數(shù)的參數(shù),增加函數(shù)的 通用性,針對(duì) 相同的數(shù)據(jù)處理邏輯,能夠 適應(yīng)更多的數(shù)據(jù)
1.在函數(shù) 內(nèi)部,把參數(shù)當(dāng)做 變量 使用,進(jìn)行需要的數(shù)據(jù)處理
2.函數(shù)調(diào)用時(shí),按照函數(shù)定義的參數(shù)順序,把 希望在函數(shù)內(nèi)部處理的數(shù)據(jù),通過(guò)參數(shù) 傳遞
與 shell
腳本類(lèi)似,程序名以及參數(shù)都以位置參數(shù)的方式傳遞給 python 程序,使用 sys
模塊的 argv
列表接收
圖例
默認(rèn)參數(shù)就是聲明了 默認(rèn)值 的參數(shù),因?yàn)榻o參數(shù)賦予了默認(rèn)值,所以在函數(shù)調(diào)用時(shí),不向該參數(shù)傳入值也是允許的
在程序開(kāi)發(fā)中,有時(shí)候,會(huì)希望 一個(gè)函數(shù)執(zhí)行結(jié)束后,告訴調(diào)用者一個(gè)結(jié)果,以便調(diào)用者針對(duì)具體的結(jié)果做后續(xù)的處理
返回值 是函數(shù) 完成工作后,最后 給調(diào)用者的 一個(gè)結(jié)果
在函數(shù)中使用 return
關(guān)鍵字可以返回結(jié)果
調(diào)用函數(shù)一方,可以 使用變量 來(lái) 接收 函數(shù)的返回結(jié)果
# 函數(shù)的返回值: return, 用于對(duì)后續(xù)邏輯的處理 # 理解: 把結(jié)果揣兜里,后續(xù)想干啥干啥,想打印打印,想求和就求和 # 注意: # a. 函數(shù)中如果沒(méi)有return,那么解釋器會(huì)自動(dòng)加一個(gè)return None # b. return表示函數(shù)的終止,return后的代碼都不會(huì)執(zhí)行 # 1 定義一個(gè)函數(shù),計(jì)算兩個(gè)數(shù)的和 # 2 計(jì)算這兩個(gè)數(shù)的和是不是偶數(shù) def get_sum(x, y=100): # 默認(rèn)參數(shù) he = x + y # sum = 10 + 20 return he # return 30 print("return表示函數(shù)的終止,return后的代碼都不會(huì)執(zhí)行") # 將函數(shù)return后的結(jié)果賦值給變量dc: dc = sum -> dc = 30 dc = get_sum(10, 20) # x = 10, y = 20 print("dc:", dc) # 30 dc1 = get_sum(10) # x = 10, y = 100 print("dc1:", dc1) # 110 # if dc % 2 == 0: # print("偶數(shù)") # else: # print("奇數(shù)")
#默認(rèn)參數(shù) #注意:具有默認(rèn)值的參數(shù)后面不能跟沒(méi)有默認(rèn)值的參數(shù) def get_sum(a=20,b=5,c=10): he = a + b+ c return he dc = get_sum(1,2,3) #a=1 b=2 c=3 print("dc:",dc) # 6 dc1 = get_sum(1,2) # a=1 b=2 c=10 print("dc1:",dc1) # 13 dc2 = get_sum(1) # a=1 b=5 c=10 print("dc2:",dc2) # 16 dc3 = get_sum() print("dc3:",dc3) # 35
修改菲波那切數(shù)列
def new_fib(n=8): list01 = [0,1] #定義列表,指定初始值 for dc in range(n-2): list01.append(list01[-1]+list01[-2]) return list01 dc = new_fib() #不加參數(shù)默認(rèn)是8 dc1 = new_fib(10) print("dc:",dc) print("dc1:",dc1)
生成隨機(jī)密碼:
#練習(xí):生成隨機(jī)密碼 #創(chuàng)建 randpass.py 腳本,要求如下: #編寫(xiě)一個(gè)能生成8位隨機(jī)密碼的程序 #使用 random 的 choice 函數(shù)隨機(jī)取出字符 #由用戶(hù)決定密碼長(zhǎng)度 import random def new_password(): n = int(input("密碼長(zhǎng)度:")) password = "" all = "0123456789zxcvbnmlkjhgfdsaqwertyuiopPOIUYTREWQASDFGHJKLMNBVCXZ" # 0-9 a-z A-Z random.choice(all) for i in range(n): dc = random.choice(all) password += dc # print("passwd:",password) return password # 調(diào)用函數(shù),才能執(zhí)行函數(shù)內(nèi)部邏輯 dc = new_password() print("dc:",dc)
#練習(xí):生成隨機(jī)密碼 #創(chuàng)建 randpass.py 腳本,要求如下: #編寫(xiě)一個(gè)能生成8位隨機(jī)密碼的程序 #使用 random 的 choice 函數(shù)隨機(jī)取出字符 #由用戶(hù)決定密碼長(zhǎng)度 import random,string def new_password(): n = int(input("密碼長(zhǎng)度:")) password = "" all = string.ascii_letters + string.digits random.choice(all) for i in range(n): dc = random.choice(all) password += dc # print("passwd:",password) return password # 調(diào)用函數(shù),才能執(zhí)行函數(shù)內(nèi)部邏輯 dc = new_password() print("dc:",dc)
模塊是從邏輯上組織python代碼的形式
當(dāng)代碼量變得相當(dāng)大的時(shí)候,最好把代碼分成一些有組織的代碼段,前提是保證它們的 彼此交互
這些代碼片段相互間有一定的聯(lián)系,可能是一個(gè)包含數(shù)據(jù)成員和方法的類(lèi),也可能是一組相關(guān)但彼此獨(dú)立的操作函數(shù)
使用 import 導(dǎo)入模塊
模塊屬性通過(guò) “模塊名.屬性” 的方法調(diào)用
如果僅需要模塊中的某些屬性,也可以單獨(dú)導(dǎo)入
為什么需要導(dǎo)入模塊?
可以提升開(kāi)發(fā)效率,簡(jiǎn)化代碼
正確使用
# test.py,將 file_copy.py 放在同級(jí)目錄下 # 需求:要將/etc/passwd復(fù)制到/tmp/passwd src_path = "/etc/passwd" dst_path = "/tmp/passwd" # 如何復(fù)制? # 調(diào)用已有模塊中的方法 # - 很推薦,簡(jiǎn)單粗暴不動(dòng)腦 # - 直接使用 file_copy.py的方法即可 # 導(dǎo)入方法一:直接導(dǎo)入模塊 import file_copy # 要注意路徑問(wèn)題 file_copy.copy(src_path, dst_path) # 導(dǎo)入方法二:只導(dǎo)入 file_copy 模塊的 copy 方法 from file_copy import copy # 如果相同時(shí)導(dǎo)入多個(gè)模塊 from file_copy import * copy(src_path, dst_path) # 導(dǎo)入方法四:導(dǎo)入模塊起別名 as import file_copy as fc fc.copy(src_path, dst_path)
常用的導(dǎo)入模塊的方法
一行指導(dǎo)入一個(gè)模塊,可以導(dǎo)入多行, 例如:import random
只導(dǎo)入模塊中的某些方法,例如:from random import choice
, randint
一個(gè)模塊只被 加載一次,無(wú)論它被導(dǎo)入多少次
只加載一次可以 阻止多重導(dǎo)入時(shí),代碼被多次執(zhí)行
如果兩個(gè)文件相互導(dǎo)入,防止了無(wú)限的相互加載
模塊加載時(shí),頂層代碼會(huì)自動(dòng)執(zhí)行,所以只將函數(shù)放入模塊的頂層是最好的編程習(xí)慣
模塊在被導(dǎo)入時(shí),會(huì)先完整的執(zhí)行一次模塊中的 所有程序
案例
# foo.py print(__name__) # bar.py import foo # 導(dǎo)入foo.py,會(huì)將 foo.py 中的代碼完成的執(zhí)行一次,所以會(huì)執(zhí)行 foo 中的 print(__name__)
結(jié)果:
# foo.py -> __main__ 當(dāng)模塊文件直接執(zhí)行時(shí),__name__的值為‘__main__’
# bar.py -> foo 當(dāng)模塊被另一個(gè)文件導(dǎo)入時(shí),__name__的值就是該模塊的名字
所以我們以后在 Python 模塊中執(zhí)行代碼的標(biāo)準(zhǔn)格式:
def test(): ...... if __name__ == "__main__": test()
讀到這里,這篇“怎么創(chuàng)建和調(diào)用Python中的函數(shù)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。