4.函數(shù)

函數(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]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杜顺,一起剝皮案震驚了整個(gè)濱河市财搁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躬络,老刑警劉巖尖奔,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異穷当,居然都是意外死亡提茁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)馁菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茴扁,“玉大人,你說(shuō)我怎么就攤上這事火邓〉と酰” “怎么了德撬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)躲胳。 經(jīng)常有香客問(wèn)我蜓洪,道長(zhǎng),這世上最難降的妖魔是什么坯苹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任隆檀,我火速辦了婚禮,結(jié)果婚禮上粹湃,老公的妹妹穿的比我還像新娘恐仑。我一直安慰自己,他們只是感情好为鳄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布裳仆。 她就那樣靜靜地躺著,像睡著了一般孤钦。 火紅的嫁衣襯著肌膚如雪歧斟。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天偏形,我揣著相機(jī)與錄音静袖,去河邊找鬼。 笑死俊扭,一個(gè)胖子當(dāng)著我的面吹牛队橙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萨惑,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼捐康,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咒钟?” 一聲冷哼從身側(cè)響起吹由,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朱嘴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粗合,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萍嬉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隙疚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壤追。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖供屉,靈堂內(nèi)的尸體忽然破棺而出行冰,到底是詐尸還是另有隱情溺蕉,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布悼做,位于F島的核電站疯特,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏肛走。R本人自食惡果不足惜漓雅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朽色。 院中可真熱鬧邻吞,春花似錦、人聲如沸葫男。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梢褐。三九已至旺遮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間利职,已是汗流浹背趣效。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猪贪,地道東北人跷敬。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像热押,于是被迫代替她去往敵國(guó)和親西傀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容