一堪侯、內(nèi)容總覽
- 1.1埃碱、函數(shù)參數(shù)和函數(shù)返回值的作用
- 1.2猖辫、函數(shù)的返回值進(jìn)階
- 1.3酥泞、函數(shù)的參數(shù)進(jìn)階
- 1.4砚殿、遞歸函數(shù)
二、函數(shù)參數(shù)和函數(shù)返回值的作用
-
2.1芝囤、函數(shù)根據(jù)有沒(méi)有參數(shù)以及有沒(méi)有返回值似炎,相互組合之后有以下四種情況
無(wú)參數(shù) 無(wú)返回值 無(wú)參數(shù) 有返回值 有參數(shù) 無(wú)返回值 有參數(shù) 有返回值
定義一個(gè)函數(shù)是否要返回值,以及是否要傳參數(shù)悯姊,要根據(jù)自己的需求而定
-
2.2羡藐、函數(shù)的返回值進(jìn)階~利用元組返回多個(gè)值
我們?cè)陂_(kāi)發(fā)的過(guò)后中,在調(diào)用一個(gè)函數(shù)后悯许,我們希望函數(shù)返回多個(gè)值仆嗦,這時(shí)候我們就可以利用元祖了,元組可以包含多個(gè)不同類型的值先壕,如下瘩扼,查詢一個(gè)人的信息,返回他的身高和年齡(提示:你可以利用字典包含多個(gè)值返回)
def people_info(): name = "小王" age = 26 # 如果函數(shù)返回的類型是元組垃僚,小括號(hào)可以省略 return name,age 或者 return (name,age) result = people_info() print("名字=%s 年齡=%d" % (result[0],result[1]))
返回元組取值的優(yōu)化:用多個(gè)變量去接受返回元組的值集绰,要求:變量的個(gè)數(shù)要與函數(shù)返回元組的個(gè)數(shù)一致,優(yōu)點(diǎn)是:不用在使用索引取值
def people_info(): name = "小王" age = 26 # 如果函數(shù)返回的類型是元組谆棺,小括號(hào)可以省略 return name,age 或者 return (name,age) name,age = people_info() print("名字=%s 年齡=%d" % (name, age))
延伸:交換兩個(gè)變量的值栽燕,如:a = 2 b = 3 ,交換其值
解法1:使用中間變量 c = a a = b b = c 解法二:不使用中間變量 a = a + b b = a - b a = a - b 解法三:python專有,利用元祖賦值交換 a,b = (b,a)
三、函數(shù)的參數(shù)-進(jìn)階(不可變和可變的參數(shù)):函數(shù)內(nèi)部賦值不會(huì)影響到外部的實(shí)參碍岔,通過(guò)方法修改其值會(huì)改變外部實(shí)參
-
3.1浴讯、針對(duì)函數(shù)內(nèi)部的參數(shù)進(jìn)行賦值,是不會(huì)影響到函數(shù)調(diào)用時(shí)傳遞的實(shí)參變量蔼啦,如下
def test(num): # num 在這里相當(dāng)于一個(gè)局部變量兰珍,剛開(kāi)始與外面的gl_num指向的是同一個(gè) 數(shù)據(jù)內(nèi)存地址, # 在函數(shù)內(nèi)被重新賦值為 20询吴,又指向了數(shù)據(jù) 20 的內(nèi)存地址掠河, # 而原來(lái)的 gl_num 還是指向 10的內(nèi)存地址 num = 20 print(num) gl_num = 10 test(gl_num) print(gl_num)
-
3.2、在函數(shù)內(nèi)部使用方法修改可變參數(shù)會(huì)影響外部實(shí)參猛计,如下
def test(num_list): num_list.append(5) print(num_list) gl_num_list = [1,2,3,4] test(gl_num_list) print(gl_num_list) 打印結(jié)果是: [1,2,3,4,5] [1,2,3,4,5]
拓展: 可變類型的
+=
,num_list += num_list
本質(zhì)上是調(diào)用列表的:num_list.extend(num_list)
唠摹,如下面的列表def test(num_list): num_list += num_list print(num_list) gl_num_list = [1,2,3] test(gl_num_list) print(gl_num_list) 打印結(jié)果是: [1,2,3,1,2,3] [1,2,3,1,2,3]
-
3.3、列表的排序方法明確缺省參數(shù)的概念及作用( 提示:
缺省參數(shù)也就是形參默認(rèn)有值的
)- 定義函數(shù)時(shí)奉瘤,可以給 某個(gè)參數(shù) 指定一個(gè) 默認(rèn)值勾拉,具有默認(rèn)值的參數(shù)就叫做 缺省參數(shù)
- 調(diào)用函數(shù)時(shí),如果沒(méi)有傳入 缺省參數(shù) 的值盗温,則在函數(shù)內(nèi)部使用定義函數(shù)時(shí)指定的參數(shù)默認(rèn)值
- 函數(shù)的缺省參數(shù)藕赞,將常見(jiàn)的值設(shè)置為參數(shù)的缺省值,從而 簡(jiǎn)化函數(shù)的調(diào)用
如下:列表的升序與降序 ~ 傳參
gl_number_list = [3,1,5] # 默認(rèn)就是升序排序卖局,因?yàn)檫@種應(yīng)用需求更多 gl_number_list.sort() print(gl_number_list) # 只有當(dāng)需要排序的時(shí)候斧蜕,才需要傳遞 reverse 參數(shù) gl_number_list.sort(reverse=True) print(gl_number_list)
-
指定參數(shù)為缺省參數(shù),直接在參數(shù)名后面加上
= 值
就好了砚偶,如下def test(name,gender=True): gender_test = "男" if not gender: gender_test = "女" print("%s 是 %s"% (name, gender_test)) test("李四",True) 打印結(jié)果: 李四 是 男
缺省參數(shù)批销,需要使用 最常見(jiàn)的值 作為默認(rèn)值!如果一個(gè)參數(shù)的值不能確定染坯,則不應(yīng)該設(shè)置默認(rèn)值均芽,具體的數(shù)值在調(diào)用函數(shù)時(shí),由外界傳遞单鹿!
-
缺省參數(shù) 注意事項(xiàng)
-
(1)掀宋、缺省參數(shù)的定義位置:必須保證 帶有默認(rèn)值的缺省參數(shù) 在參數(shù)列表的末尾,下面的例子
# 錯(cuò)誤的 def test(name,age="18",height): # 正確的 def test(name,height,age="18"):
-
(2)仲锄、調(diào)用帶有多個(gè)缺省參數(shù)的函數(shù)
在 調(diào)用函數(shù)的時(shí)候劲妙,如果有 多個(gè)缺省參數(shù),需要指定參數(shù)名昼窗,這樣解釋器才能夠知道參數(shù)的對(duì)應(yīng)關(guān)系是趴!,如下:只給height賦值def test(name,age="1",height=""): print("名字=%s 年齡=%s 身高=%s"%(name, age, height)) test("老王",height="178"):
-
-
-
3.4、多值參數(shù)
有時(shí)候可能需要 一個(gè)函數(shù) 能夠處理的參數(shù) 個(gè)數(shù) 是不確定的澄惊,這個(gè)時(shí)候唆途,就可以使用 多值參數(shù)
-
python 中有 兩種 多值參數(shù):
參數(shù)名前增加一個(gè) * 可以接收 元組 參數(shù)名前增加兩個(gè) * 可以接收 字典
-
一般在給多值參數(shù)命名時(shí)富雅,習(xí)慣使用下面的兩個(gè)名字
*args
(arguments的縮寫(xiě),有變量的含義) 肛搬,存放元組没佑,參數(shù)前有一個(gè)*
**kwargs(kw是單詞keywords的縮寫(xiě))
,存放 字典 參數(shù)温赔,前面有兩個(gè)*
-
看下面的例子:
def test(name,*args,**kwargs): print(name) print(args) print(kwargs) test3("小李",1, 2,3,A="1",B="2")
-
3.5蛤奢、元組 和 字典 的拆包(拆包語(yǔ)法:簡(jiǎn)化了元組變量和字典變量的傳遞)
-
在調(diào)用帶有多值參數(shù)的函數(shù)時(shí),如果希望:
- 將一個(gè)元組變量陶贼,直接傳遞給
args
,在傳值的實(shí)參前面加上 一個(gè)*
- 將一個(gè)字典變量啤贩,直接傳遞給
kwargs
,在傳值的實(shí)參前面加上 兩個(gè)*
- 將一個(gè)元組變量陶贼,直接傳遞給
-
如下
def test(*args,**kwargs): print(args) print(kwargs) tuple1 = (1,2,3) dict1 = {"name":"小王","age":18} test(*tuple1,** dict1) 打印結(jié)果是: (1, 2, 3) {'name': '小王', 'age': 18}
-
四、函數(shù)的遞歸(函數(shù)調(diào)用自身的編程技巧就叫做 遞歸)拜秧,在處理不確定的循環(huán)條件時(shí)痹屹,比較有用,例如:遍歷整個(gè)文件的目錄
-
4.1枉氮、遞歸函數(shù)的特點(diǎn)
一個(gè)函數(shù)內(nèi)部調(diào)用自己:函數(shù)內(nèi)部既可以其他函數(shù)志衍,也可以調(diào)用自己
-
代碼特點(diǎn):(1)、函數(shù)內(nèi)部的代碼是相同的聊替,只是針對(duì)參數(shù)不同楼肪,處理的結(jié)果不同,(2)、當(dāng)參數(shù)滿足一個(gè)條件時(shí)惹悄,函數(shù)不再執(zhí)行(這個(gè)通常被稱為遞歸的出口春叫,很重要,如果沒(méi)有會(huì)出現(xiàn) 死循環(huán))
def test(num): if num == 1: return test(num-1) print(num) test(5) 打印結(jié)果是: 4 3 2 1 5
從上面的打印結(jié)果我們可以看出俘侠,當(dāng)外面的
test(5)
調(diào)用的時(shí)候象缀,print(num) 函數(shù)是不會(huì)執(zhí)行的,等其他調(diào)用都結(jié)束了才會(huì)執(zhí)行
4.2爷速、遞歸函數(shù)的例子:累加求和求 1到100的和,用遞歸如下
def sum_number(num):
# 1霞怀、出口
if num == 1:
return 1
# 2惫东、數(shù)字累加 num + (1+2+...num-1)
temp = sum_number(num-1)
# 3、兩個(gè)數(shù)字相加的和
return num + temp
result = sum_number(100)
print(result)
-
4.3毙石、下面是一個(gè)計(jì)算遞歸求和的圖示
計(jì)算遞歸求和的圖示