代碼詳解Python的函數(shù)基礎(chǔ)(2)
1.函數(shù)參數(shù)
# 1.位置參數(shù):調(diào)用函數(shù)時(shí),傳入的值需要按照位置順序傳入
# 實(shí)例:求x的n次方
def xPowN(x,n): # 傳入的值按照x,n的位置順序傳入
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print("2的5次方的值為:",xPowN(2,5))
print("5的2次方的值為:",xPowN(5,2))
# 結(jié)果輸出:
# 2的5次方的值為: 32
# 5的2次方的值為: 25
# 2.默認(rèn)參數(shù)
# 實(shí)例:求x的n次方
def xPowN(x,n = 2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
print("2的5次方的值為:",xPowN(2,5)) # 當(dāng)n有新的值傳入,則使用新值計(jì)算,如果沒有,則默認(rèn)
print("5的2次方的值為:",xPowN(5)) # n的值默認(rèn)為2
print("---------------------------")
print("---------------------------")
# 設(shè)置默認(rèn)參數(shù)的注意事項(xiàng):
# 1.必選參數(shù)在前,默認(rèn)參數(shù)在后;
# 2.當(dāng)函數(shù)有多個(gè)參數(shù)時(shí),把變化大的參數(shù)放在前面,變化小的參數(shù)放在后面;
# 變化小的參數(shù)可以作為默認(rèn)參數(shù);
# 3.使用默認(rèn)參數(shù)可以降低調(diào)用函數(shù)的難度;
# 4.定義默認(rèn)參數(shù)時(shí),默認(rèn)參數(shù)必須指向不變對(duì)象,如果是可變對(duì)象,則出現(xiàn)問題,如:list
# 實(shí)例:學(xué)生信息登記
def studentInfo(name,gender,age,city = "Shenzhen"):
print("學(xué)生的名字為:",name)
print("學(xué)生的性別為:",gender)
print("學(xué)生的年齡為:",age)
print("學(xué)生來自的城市為:",city)
print("同學(xué)1的信息如下:")
print("-----------------------------")
studentInfo("Willard","男",18) # 使用默認(rèn)參數(shù)Shenzhen
print("*****************************")
print("同學(xué)2的信息如下:")
print("-----------------------------")
studentInfo("ChenJD","女",18,"Maoming") # 傳入新的參數(shù)Maoming替換Shenzhen
# 結(jié)果輸出:
2的5次方的值為: 32
5的2次方的值為: 25
---------------------------
---------------------------
同學(xué)1的信息如下:
-----------------------------
學(xué)生的名字為: Willard
學(xué)生的性別為: 男
學(xué)生的年齡為: 18
學(xué)生來自的城市為: Shenzhen
*****************************
同學(xué)2的信息如下:
-----------------------------
學(xué)生的名字為: ChenJD
學(xué)生的性別為: 女
學(xué)生的年齡為: 18
學(xué)生來自的城市為: Maoming
# 3.可變參數(shù):傳入的參數(shù)個(gè)數(shù)是可變的,可以是0、1、2到任意個(gè)
# 傳統(tǒng)方式傳入?yún)?shù)時(shí),可以以list或tuple傳入
# 實(shí)例(傳統(tǒng)方式):
def sumOfN(intNumbers):
sum = 0
for n in intNumbers:
sum = sum + n
return sum
print("前100項(xiàng)累加和為:",sumOfN(range(101)))
print("前50項(xiàng)累加和為:",sumOfN(range(51)))
print("任意項(xiàng)累加和為:",sumOfN([1,2,5,6,7,8,9,10]))
print("任意項(xiàng)累加和為:",sumOfN((1,2,3,4,5,7,8,9,12)))
print("---------------------------------------------------------")
# 可變參數(shù):在參數(shù)前添加*號(hào)
def sumOfN(*intNumbers):
sum = 0
for n in intNumbers:
sum = sum + n
return sum
print("任意項(xiàng)累加和為:",sumOfN(1,2,3,4,6,7,8,9))
print("任意項(xiàng)累加和為:",sumOfN(1,2,4))
print("任意項(xiàng)累加和為:",sumOfN(3,4,5,6,7))
print("---------------------------------------------------------")
# 把list或tuple作為可變參數(shù)傳入
def sumOfN(*intNumbers):
sum = 0
for n in intNumbers:
sum = sum + n
return sum
# 已經(jīng)有l(wèi)ist,*nums表示把nums的所有元素作為可變參數(shù)傳入
nums = [1,2,3,5]
print("傳入一個(gè)list:",sumOfN(*nums))
# 結(jié)果輸出:
前100項(xiàng)累加和為: 5050
前50項(xiàng)累加和為: 1275
任意項(xiàng)累加和為: 48
任意項(xiàng)累加和為: 51
---------------------------------------------------------
任意項(xiàng)累加和為: 40
任意項(xiàng)累加和為: 7
任意項(xiàng)累加和為: 25
---------------------------------------------------------
傳入一個(gè)list: 11
# 4.關(guān)鍵字參數(shù)
# 可變參數(shù)允許傳入任意個(gè)參數(shù),這些可變參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè)tuple;
# 關(guān)鍵字參數(shù)允許傳入任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict;
def personInfo(name,age,**kw):
print("name:",name,"age:",age,"other:",kw)
print("Willard個(gè)人信息:")
personInfo("Willard",18)
print("------------------------------------------------------------------")
print("Willard更詳細(xì)的個(gè)人信息:")
personInfo("Willard",18,gender = "男",job = "Enginner")
print("------------------------------------------------------------------")
print("ChenJD個(gè)人信息:")
personInfo("ChenJD",18,gender = "女")
print("------------------------------------------------------------------")
# 關(guān)鍵字參數(shù):可以擴(kuò)展函數(shù)的功能
# Eg:用戶注冊(cè)功能,用戶名和年齡是必填信息,其他信息均為可選
# 可以先組裝出dict,然后把dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳入
extraInfo = {"gender":"Man","city":"Shenzhen","job":"Engineer"}
print("hackerLuo個(gè)人信息如下:")
personInfo("hackerLuo",18,gender = extraInfo["gender"],job = extraInfo["job"])
print("------------------------------------------------------------------")
# 使用簡化寫法
print("簡化寫法傳入hackerLuo個(gè)人信息:")
personInfo("hackerLuo",18,**extraInfo)
# 結(jié)果輸出:
Willard個(gè)人信息:
name: Willard age: 18 other: {}
------------------------------------------------------------------
Willard更詳細(xì)的個(gè)人信息:
name: Willard age: 18 other: {'gender': '男', 'job': 'Enginner'}
------------------------------------------------------------------
ChenJD個(gè)人信息:
name: ChenJD age: 18 other: {'gender': '女'}
------------------------------------------------------------------
hackerLuo個(gè)人信息如下:
name: hackerLuo age: 18 other: {'gender': 'Man', 'job': 'Engineer'}
------------------------------------------------------------------
簡化寫法傳入hackerLuo個(gè)人信息:
name: hackerLuo age: 18 other: {'gender': 'Man', 'city': 'Shenzhen', 'job': 'Engineer'}
# 5.命名關(guān)鍵字參數(shù)
# 函數(shù)調(diào)用者可以傳入任意不受限制的關(guān)鍵字參數(shù);
# 傳入了哪些參數(shù),需要在函數(shù)內(nèi)通過kw檢查;
def personInfo(name,age,**kw):
if "city" in kw:
pass
if "job" in kw:
pass
print("name:",name,"age:",age,"other:",kw)
# 如果要限制關(guān)鍵字參數(shù)的名字,可以用命名關(guān)鍵字參數(shù)
# 只接收gender,job作為關(guān)鍵字參數(shù)
# 命名關(guān)鍵字參數(shù)需要*作為分隔符,*后面的參數(shù)視為命名關(guān)鍵字參數(shù)
# 命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名
def personInfo(name,age,*,gender,job):
print(name,age,gender,job)
# 調(diào)用方式:
print("命名關(guān)鍵字參數(shù)調(diào)用!")
personInfo("Willard",18,gender = "男",job = "Engineer")
print("------------------------------------------------------------------")
# 如果函數(shù)定義中已經(jīng)有一個(gè)可變參數(shù),則后面跟著命名關(guān)鍵字參數(shù)不需要*分隔符
def personInfo(name,age,*args,gender,job):
print(name,age,args,gender,job)
# 命名關(guān)鍵字參數(shù)的缺省值
def personInfo(name,age,*,gender,job = "Engineer"):
print(name,age,gender,job)
print("命名關(guān)鍵字參數(shù)有缺省值!")
personInfo("Willard",18,gender = "男")
# 結(jié)果輸出:
命名關(guān)鍵字參數(shù)調(diào)用!
Willard 18 男 Engineer
------------------------------------------------------------------
命名關(guān)鍵字參數(shù)有缺省值!
Willard 18 男 Engineer
# 6.參數(shù)組合
# 常用參數(shù):必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)、命名關(guān)鍵字參數(shù)
# 參數(shù)定義順序:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)、關(guān)鍵字參數(shù)
def egFunc1(name,age,gender = "男",*args,**kw):
print("name:",name,"age:",age,"gender:",gender,"args:",args,"kw:",kw)
def egFunc2(name,gender = "男",*,job,**kw):
print("name:",name,"gender:",gender,"job:",job,"kw:",kw)
# 調(diào)用
print("egFunc1傳入name和age參數(shù):")
egFunc1("Willard",18)
print("------------------------------------------------------------------")
print("egFunc1傳入name,age,gender參數(shù):")
egFunc1("ChenJD",18,"女")
print("------------------------------------------------------------------")
print("egFunc1傳入name,age,gender,args參數(shù):")
egFunc1("hackerLuo",18,"男",170,60)
print("------------------------------------------------------------------")
print("egFunc1傳入name,age,gender,args,kw參數(shù):")
egFunc1("Willard",18,"男",170,60,job = "Engineer")
print("------------------------------------------------------------------")
print("egFunc2傳入name,gender,job,kw參數(shù):")
egFunc2("Willard",job = "Engineer",ext = None)
print("------------------------------------------------------------------")
print("egFunc1通過tuple和dict傳入?yún)?shù):")
args = ("Willard",18,"男",170,60)
kw = {"job":"Engineer"}
egFunc1(*args,**kw)
# Tips:
# 1.默認(rèn)參數(shù)一定要用不可變對(duì)象,如果是可變對(duì)象,程序運(yùn)行時(shí)出現(xiàn)邏輯錯(cuò)誤;
# 2.*args是可變參數(shù),args接收的是一個(gè)tuple;
# 3.**kw是關(guān)鍵字參數(shù),kw接收的是一個(gè)dict;
# 4.可變參數(shù)可以直接傳入:func(1,2,3,4),也可以先組裝list或tuple,
# 通過*args傳入:func(*(1,2,3,4));
# 5.關(guān)鍵字參數(shù)可以直接傳入:func(a = 1,b = 2),也可以先組裝dict,
# 通過**kw傳入:func(**{"a":1,"b":2});
# 6.命名關(guān)鍵字參數(shù)在沒有可變參數(shù)的情況下需要寫分隔符*
# 結(jié)果輸出:
egFunc1傳入name和age參數(shù):
name: Willard age: 18 gender: 男 args: () kw: {}
------------------------------------------------------------------
egFunc1傳入name,age,gender參數(shù):
name: ChenJD age: 18 gender: 女 args: () kw: {}
------------------------------------------------------------------
egFunc1傳入name,age,gender,args參數(shù):
name: hackerLuo age: 18 gender: 男 args: (170, 60) kw: {}
------------------------------------------------------------------
egFunc1傳入name,age,gender,args,kw參數(shù):
name: Willard age: 18 gender: 男 args: (170, 60) kw: {'job': 'Engineer'}
------------------------------------------------------------------
egFunc2傳入name,gender,job,kw參數(shù):
name: Willard gender: 男 job: Engineer kw: {'ext': None}
------------------------------------------------------------------
egFunc1通過tuple和dict傳入?yún)?shù):
name: Willard age: 18 gender: 男 args: (170, 60) kw: {'job': 'Engineer'}
2.遞歸函數(shù)
# 在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù),亦可以調(diào)用函數(shù)本身,則為遞歸函數(shù)
# 計(jì)算階乘:n!=1×2×3...×n
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
print("5的階乘為:",fact(5))
print("100的階乘為:",fact(50))
# print("10000的階乘為:",fact(10000))
# print("10000的階乘為:",fact(10000)) # 棧溢出
# 在計(jì)算機(jī)中,函數(shù)調(diào)用是通過棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),每進(jìn)入一個(gè)函數(shù)調(diào)用,
# 棧會(huì)加一層棧幀,當(dāng)函數(shù)返回,棧減少一層棧幀,遞歸調(diào)用次數(shù)過多,會(huì)導(dǎo)致棧溢出;
# 讀者嘗試fact(1000),fact(10000),可能fact(1000)就已經(jīng)棧溢出,
# 筆者測試fact(1000)還是可以正常輸出的,fact(10000)棧溢出
# 結(jié)果輸出:
5的階乘為: 120
100的階乘為: 30414093201713378043612608166064768844377641568960512000000000000
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python SqlAlchemy動(dòng)態(tài)添加數(shù)據(jù)表字段實(shí)例解析
這篇文章主要介紹了Python SqlAlchemy動(dòng)態(tài)添加數(shù)據(jù)表字段實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Python實(shí)現(xiàn)FTP文件傳輸?shù)膶?shí)例
在本篇文章里小編給各位分享的是關(guān)于Python實(shí)現(xiàn)FTP文件傳輸?shù)膶?shí)例以及相關(guān)代碼,需要的朋友們學(xué)習(xí)下。2019-07-07
python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼及驗(yàn)證碼的動(dòng)態(tài)刷新實(shí)例
在本篇文章里小編給大家整理的是關(guān)于python web框架Flask實(shí)現(xiàn)圖形驗(yàn)證碼的相關(guān)知識(shí)點(diǎn),有需要的朋友們參考下。2019-10-10
Python學(xué)習(xí)筆記之列表和成員運(yùn)算符及列表相關(guān)方法詳解
這篇文章主要介紹了Python學(xué)習(xí)筆記之列表和成員運(yùn)算符及列表相關(guān)方法,結(jié)合實(shí)例形式詳細(xì)分析了Python列表相關(guān)的概念、原理、成員函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下2019-08-08
python爬取網(wǎng)站數(shù)據(jù)保存使用的方法
這篇文章主要介紹了使用Python從網(wǎng)上爬取特定屬性數(shù)據(jù)保存的方法,其中解決了編碼問題和如何使用正則匹配數(shù)據(jù)的方法,詳情看下文2013-11-11
PyTorch中的torch.cat函數(shù)基本用法詳解
在PyTorch中,torch.cat是一個(gè)非常實(shí)用的函數(shù),用于將多個(gè)張量(Tensor)沿指定維度連接起來,本文將詳細(xì)介紹torch.cat函數(shù)的用法,并通過一些示例來說明其應(yīng)用,感興趣的朋友跟隨小編一起看看吧2024-08-08

