函數(shù)
1 創(chuàng)建函數(shù)與調(diào)用
def py(): //創(chuàng)建函數(shù)
print("人生苦短屯援,我用python")
py() //調(diào)用函數(shù)
結(jié)果
人生苦短秕硝,我用python
1.1 lambda函數(shù)
python允許使用lambda關(guān)鍵字創(chuàng)建匿名函數(shù)柠偶。
lambda x,y : x * y
:左邊是函數(shù)的參數(shù)别伏,多個(gè)參數(shù)用逗號(hào)隔開(kāi)已慢。
:右邊是返回值座掘。
lambda語(yǔ)句會(huì)返回一個(gè)函數(shù)對(duì)象递惋,使用前,賦值即可溢陪。
a = lambda x,y : x * y
print(a(4,5))
結(jié)果
20
1.2 函數(shù)文檔
所謂函數(shù)文檔萍虽,其實(shí)就是給函數(shù)寫(xiě)注釋
def py():
"""
使用python // '''也可以
"""
print("人生苦短,我用python")
help(py)
結(jié)果
py()
使用python
2 函數(shù)參數(shù)
函數(shù)的括號(hào)內(nèi)就是函數(shù)參數(shù)形真,多個(gè)參數(shù)用逗號(hào)隔開(kāi)杉编。
2.1 形參和實(shí)參
- 形參(parameter):創(chuàng)建函數(shù)時(shí)小括號(hào)里的參數(shù)
- 實(shí)參(argument):函數(shù)被調(diào)用過(guò)程中傳遞進(jìn)來(lái)的參數(shù)
2.2 關(guān)鍵字參數(shù)
函數(shù)中有多個(gè)參數(shù)時(shí)超全,默認(rèn)為順序匹配,為防止搞亂參數(shù)位置邓馒,可以在函數(shù)調(diào)用的時(shí)候設(shè)置關(guān)鍵字參數(shù)嘶朱,以避免此種情況的發(fā)生。
關(guān)鍵字參數(shù)其實(shí)就是在傳入實(shí)參時(shí)指定形參的變量名
def test(name,thing):
print(name+'有'+thing)
test('無(wú)限手套','滅霸')
test(name='斯達(dá)克',thing='鋼鐵俠戰(zhàn)衣')//這里采用了關(guān)鍵字參數(shù)
結(jié)果:
無(wú)限手套有滅霸
斯達(dá)克有鋼鐵俠戰(zhàn)衣
2.3 默認(rèn)參數(shù)
默認(rèn)參數(shù)是在參數(shù)定義的過(guò)程中光酣,為形參賦初值疏遏。當(dāng)函數(shù)調(diào)用的時(shí)候,不傳遞實(shí)參救军,則默認(rèn)使用形參的初始值代替财异。
def test(name='斯達(dá)克',thing='鋼鐵俠戰(zhàn)衣'): //name和thing是默認(rèn)參數(shù)
print(name+'有'+thing)
test()
結(jié)果:
斯達(dá)克有鋼鐵俠戰(zhàn)衣
2.4 收集參數(shù)
收集參數(shù)也叫可變參數(shù)。當(dāng)不清楚函數(shù)有多少個(gè)參數(shù)時(shí)可以使用唱遭,在參數(shù)前加上*即可戳寸。
def test(*listx):
print(listx)
test(1,2,3,4,5,'avengers')
結(jié)果:
(1, 2, 3, 4, 5, 'avengers')
當(dāng)收集參數(shù)后,還有其它參數(shù)時(shí)拷泽,在調(diào)用函數(shù)時(shí)需用關(guān)鍵字參數(shù)來(lái)指定
def test(*hero,name):
print(*hero,'屬于',name)
test('蜘蛛俠','黑豹','毒液',name='avengers') //使用關(guān)鍵字參數(shù)指定了name
結(jié)果:
蜘蛛俠 黑豹 毒液 屬于 avengers
2.4.1 解包
要將元組或列表傳入收集參數(shù)疫鹊,調(diào)用函數(shù)時(shí),要在實(shí)參前加上*司致,表示實(shí)參需要解包后使用拆吆。
def test(*hero):
print(len(hero))
print(hero)
name =['蜘蛛俠','黑豹','毒液']
test(name)
test(*name)
結(jié)果:
1
(['蜘蛛俠', '黑豹', '毒液'],)
3
('蜘蛛俠', '黑豹', '毒液')
2.5 函數(shù)返回值
return關(guān)鍵字用于返回函數(shù)的值,print是打印值不是返回值蚌吸。不寫(xiě)renturn锈拨,python函數(shù)默認(rèn)返回None。pyhton函數(shù)都是有返回值的羹唠。
def test():
print('avengers')
print(test()) //print打印函數(shù)的返回值,此時(shí)返回值為None
結(jié)果:
avengers
None
2.6 變量作用域
局部變量(local variable)
全局變量(global variable)
def discounts(price,rate):
new_price = price * rate
print('打折后的價(jià)格為:',new_price)
old_price = float(input('請(qǐng)輸入原價(jià): '))
rate2 = float(input('請(qǐng)輸入折扣: '))
discounts(old_price,rate2)
結(jié)果:
請(qǐng)輸入原價(jià): 100
請(qǐng)輸入折扣: 0.5
打折后的價(jià)格為: 50.0
如上程序:
- 函數(shù)內(nèi)的參數(shù)price娄昆,rate和new_price屬于局部變量佩微。
- old_price、rate2屬于全局變量萌焰。
函數(shù)里定義的參數(shù)和變量都是局部變量哺眯,出了函數(shù)后這些變量都是無(wú)效的。
原理:python在運(yùn)行函數(shù)時(shí)扒俯,利用棧進(jìn)行存儲(chǔ)奶卓,函數(shù)執(zhí)行完畢,函數(shù)內(nèi)的數(shù)據(jù)都自動(dòng)被刪除撼玄。所以函數(shù)外無(wú)法訪問(wèn)函數(shù)內(nèi)的局部變量夺姑。
全局變量都是在函數(shù)外部定義的,全局變量擁有更大的作用域掌猛,函數(shù)內(nèi)也可以訪問(wèn)盏浙。
2.7 global關(guān)鍵字
# 嘗試在函數(shù)內(nèi)部修改全局變量的值
def test():
num = 10
print("修改變量后的值為:",num)
num = 100
test()
print("全局變量num的值為:",num)
結(jié)果:
修改變量后的值為: 10
全局變量num的值為: 100
在函數(shù)內(nèi)部修改全局變量的值,python會(huì)創(chuàng)建一個(gè)名字與全局變量相同的局部變量以代替,所以全局變量的值不會(huì)被改變废膘。
如果想要在函數(shù)內(nèi)部修改全局變量就要使用global關(guān)鍵字竹海。
def test():
global num //說(shuō)明num為全局變量
num = 10
print("修改變量后的值為:",num)
num = 100
print("函數(shù)調(diào)用前num的值為:",num)
test()
print("執(zhí)行函數(shù)后num的值為:",num)
結(jié)果:
函數(shù)調(diào)用前num的值為: 100
修改變量后的值為: 10
執(zhí)行函數(shù)后num的值為: 10
2.8 內(nèi)嵌函數(shù)
所謂內(nèi)嵌函數(shù)即函數(shù)內(nèi)部再定義函數(shù)
def fun1():
print("這是函數(shù)1")
def fun2():
print("這是函數(shù)2")
fun2()
fun1()
結(jié)果:
這是函數(shù)1
這是函數(shù)2
2.9 閉包
內(nèi)嵌函數(shù)引用了外部作用域的變量(非全局變量),該內(nèi)嵌函數(shù)則為閉包
def h1(x):
def h2(y):
return x * y
return h2
print(h1(2)(3)) //2賦值給了h1,3賦值給了h2
結(jié)果:
6
以下函數(shù)h2不是閉包丐黄,因?yàn)橐昧巳肿兞縩um
def h1(x):
def h2(y):
return x * y * num
return h2
num = 4
print(h1(2)(3))
結(jié)果:
24
閉包只能引用外部函數(shù)的變量斋配,如果修改就會(huì)報(bào)錯(cuò)。
def h1(x):
def h2():
x *= x
return x
return h2
print(h1(2)())
結(jié)果:
UnboundLocalError: local variable 'x' referenced before assignment
2.9.1 nonlocal關(guān)鍵字
閉包修改外部函數(shù)的變量灌闺,需要使用nonlocal關(guān)鍵字许起。就像global那樣。
def h1(x):
def h2():
nonlocal x
x *= x
return x
return h2
print(h1(2)())
結(jié)果:
4
2.10 兩個(gè)BIF filter( ) 和 map( )
2.10.1 filter( )
filter( ) 有兩個(gè)參數(shù)菩鲜。第一個(gè)參數(shù)可以是函數(shù)或None园细。如果是函數(shù),則將第二個(gè)可迭代數(shù)據(jù)里的每一個(gè)元素作為函數(shù)的參數(shù)進(jìn)行計(jì)算接校,把結(jié)果為T(mén)ure的返回值篩選出來(lái)猛频。如果是None,則將第二個(gè)參中為T(mén)ure的值篩選出來(lái)蛛勉。
listx = [1,2,3,0]
i = filter(None,listx)
print(list(i))
結(jié)果:
[1, 2, 3]
#要求輸出10以內(nèi)的奇數(shù)
print(list(filter(lambda x: x%2,range(10))))
結(jié)果:
[1, 3, 5, 7, 9]
2.10.2 map( )
map( )也有兩個(gè)參數(shù)鹿寻,一個(gè)函數(shù)和一個(gè)序列,將序列的每一個(gè)元素作為函數(shù)的參數(shù)進(jìn)行運(yùn)算诽凌,直到序列的每個(gè)元素都加工完畢毡熏,返回值為序列。
map(function, iterable, ...)
function -- 函數(shù)侣诵,有兩個(gè)參數(shù)
iterable -- 一個(gè)或多個(gè)序列
Python 2.x 返回列表痢法。
Python 3.x 返回迭代器。
#計(jì)算兩個(gè)列表想家
print(list(map(lambda x,y: x+y,[1,2,3],[1,2,3])))
結(jié)果:
[2, 4, 6]