Python中的函數(shù)

Python中的函數(shù)

定義/調(diào)用

def sayHi():
    print('hello,function in Python')

sayHi()

注意Python中沒有JS一樣的聲明前置漆弄,所以定義必須要在調(diào)用之前

函數(shù)中的參數(shù)

def say(str):
    print(str)

say('hello, this is argument')

對(duì)于Python中的函數(shù)參數(shù)睦裳,定義幾個(gè)就傳幾個(gè)參,這個(gè)很好理解撼唾。但是也有一些高級(jí)的或者是簡(jiǎn)化的參數(shù)用法:

  • 默認(rèn)參數(shù):
def powerNum(num,pow=2):
    res = 1
    while pow>0:
        pow -= 1
        res = res * num
    return res

print( powerNum(5) ) # 25  不傳第二參數(shù)的話廉邑,默認(rèn)使用pow=2來進(jìn)行計(jì)算
# 等價(jià)于 print( powerNum(5,2) )

print( powerNum(2,3) ) # 8

默認(rèn)參數(shù)使用的時(shí)候,一般放在必選參數(shù)后面倒谷,如果有多個(gè)默認(rèn)參數(shù)蛛蒙,前面的想使用默認(rèn)值,后面的想自行賦值的話渤愁,可以這么寫:

def intro(name,age=18,word='hello,nice 2 meet u'):
    print('name:%s,age:%d,%s'%(name,age,word))

# 我們現(xiàn)在想使用默認(rèn)的age牵祟,但是想自行賦值word

intro('DeeJay',word='this is DeeJay') # name:DeeJay,age:18,this is DeeJay

#  這么一來就使用了默認(rèn)的age并且自定義了word

值得注意的是,默認(rèn)參數(shù)必須指向不變的對(duì)象,如果是個(gè)可變量的話抖格,每次調(diào)用课舍,默認(rèn)函數(shù)指向的那個(gè)變量的也會(huì)改變

def pushEndToList(li = []):
    li.append('END')
    print(li)

pushEndToList() # ['END']
pushEndToList() # ['END', 'END']
pushEndToList() # ['END', 'END', 'END']

# 可以看到 默認(rèn)參數(shù)li=[] 指向的不是一個(gè)不變的對(duì)象,
# 調(diào)用函數(shù)的時(shí)候他挎,li指向的對(duì)象的值變了筝尾,那么再次調(diào)用的時(shí)候li的值就已經(jīng)改變了
# 所以,默認(rèn)參數(shù)办桨, 必須要指向一個(gè)不變的對(duì)象(比如None)
  • 可變參數(shù)
    有時(shí)候我們定義函數(shù)的時(shí)候并不清楚到底需要多少個(gè)參數(shù)筹淫,就可以使用可變參數(shù),使參數(shù)的個(gè)數(shù)不固定
def sum(*num):
    print(num)
    print( type(num) ) # <class 'tuple'>
    res = 0
    for number in num:
        res += number
    return res

sum(1,2,3,4) # (1,2,3,4)

res = sum(1,2,3,4)
print(res) # 10

可變參數(shù)的用法已經(jīng)很清楚了呢撞,另外我們可以看到损姜,這個(gè)可變參數(shù)其實(shí)是一個(gè)tuple

  • 關(guān)鍵詞參數(shù)
def keywordFunction(name,age,**kw):
    print('%s,%s,%s'%(name,age,kw))


keywordFunction('DeeJay',22) # DeeJay,22,{} 可以不傳關(guān)鍵詞參數(shù)

keywordFunction('Yang',23,city='xian') # Yang,23,{'city': 'xian'}

keywordFunction('Wen',23,city='xian',job='frontEnd') # Wen,23,{'city': 'xian', 'job': 'frontEnd'}

關(guān)于函數(shù)的參數(shù)問題,我們來看一個(gè)綜合的例子:

def fn(a,b,c=100,*args,**kw):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kw)

fn(1,2,3,4,5) # 1 2 3 (4,5) {}
# 這個(gè)很好理解殊霞,因?yàn)闆]有傳入kw,默認(rèn)參數(shù)c被賦值了3摧阅,剩下的被當(dāng)成args構(gòu)造出一個(gè)元祖


fn(1,2,3,4,5,name='DeeJay',age=21) # 1 2 3 (4,5) {'name': 'DeeJay', 'age': 21}
# 這次傳入了kw


# 然后來看一個(gè)例子,
A = (4,5)
B = {'name': 'DeeJay', 'age': 21}

# 定義了A和B绷蹲,然后傳給fn()
fn(1,2,3,A,B) 
# 輸出結(jié)果為: 
# args == ((4, 5), {'name': 'DeeJay', 'age': 21})
# kw == {}

# 出現(xiàn)上述結(jié)果的原因是棒卷,沒有按照格式來進(jìn)行傳入kw,即按照key=value的形式傳入
# 所以A和B都被當(dāng)成了args,那么如果我們想讓A被當(dāng)成args顾孽,B作為kw,可以這樣寫:

fn(1,2,3,*A,**B) # 此時(shí)args == (4,5) kw == {'name': 'DeeJay', 'age': 21}
# 這種方法成為拆包 

注意最后的fn(1,2,3,*A,**B)的寫法比规,拆包的作用就是在傳參的時(shí)候若厚,將變量分解作為參數(shù)給函數(shù)。

函數(shù)的return值

在Python中蜒什,函數(shù)如果沒有顯示的寫明return值测秸,那么函數(shù)默認(rèn)return None

此外直接寫return也等價(jià)于return None

對(duì)于想返回多個(gè)值的函數(shù),可以將多個(gè)值組合為一個(gè)list或者tuple等返回灾常。

def fn():
    a = 10
    b = 20
    c = 30
    return a,b,c

res = fn()
print(res) # (10, 20, 30) 是一個(gè)tuple

局部變量和全局變量

Python中的函數(shù)中定義的變量為局部變量:

num = 99

def fn():
    num = 100

def printNum():
    print(num)

fn()
printNum() # 99

上述例子中霎冯,已經(jīng)在全局環(huán)境中定義了num,所以在fn()中是在拘捕作用域中定義了一個(gè)局部變量num,而不是修改全局中的num,二者僅僅是變量名相同。

如果想要在fn()中修改全局的num钞瀑,那么需要這么寫:

num = 99

def fn():
    global num # 表明在內(nèi)部作用域中沒有定義新的局部變量num,這邊的num就是全局變量
    num = 100

def printNum():
    print(num)

fn()
printNum() # 100 此時(shí)輸出的就是修改過后的全局變量num 為100

上述例子使用global來聲明是操作一個(gè)全局變量而不是需要重新定義一個(gè)局部變量

但是也有例外肃晚,對(duì)于dict和list,其實(shí)可以不寫global仔戈,程序仍然會(huì)去使用全局變量关串,而不是默認(rèn)先定義一個(gè)局部變量:

# 對(duì)于dict和list,如果是全局變量 其實(shí)可以不用寫global监徘,
# 也會(huì)默認(rèn)使用全局的晋修,而不是先定義一個(gè)

di = {'name':'DeeJay'}
li = [1,2,3]

def fn1():
    # 這邊沒有聲明global
    di['age'] = 21
    li.append(4)

def fn2():
    print(di)
    print(li)

fn1()
fn2() # {'name': 'DeeJay', 'age': 21} [1, 2, 3, 4]
# 直接改變了全局中的di和li

Python中的遞歸

Py中的遞歸沒什么特別的地方,寫個(gè)階乘函數(shù)了解一下:

def factorial(n):
    if(n == 1):
        return 1
    return n * factorial(n-1)

res = factorial(4)
print(res)

匿名函數(shù)lambda

  • 語(yǔ)法
    lambda args: expression
lambda x: x*x

上述例子凰盔, lambda x:x是參數(shù)墓卦,后面的x*x是作為函數(shù)return的值。

  • 用法

使用匿名函數(shù)來進(jìn)行list.sort()

list.sort()接受一個(gè)值為一個(gè)函數(shù)的key户敬,將這個(gè)函數(shù)的返回值作為排序的依據(jù)落剪,例子:

li = [1,-3,2]

li.sort(key=abs)

print(li) # [1, 2, -3]

# 將abs()的返回值作為排序依據(jù)

搭配匿名函數(shù)也可以進(jìn)行排序:

li = [
    {'name': 'xiaohong','age': 21},
    {'name': 'xiaohong','age': 30},
    {'name': 'xiaohong','age': 24},
    {'name': 'xiaohong','age': 23},
]

# 現(xiàn)有如上list,想根據(jù)其中每個(gè)元素的age屬性來進(jìn)行排序:

li.sort(key=lambda person: person['age'])

print(li) # 輸出:
# [{'name': 'xiaohong', 'age': 21}, 
# {'name': 'xiaohong', 'age': 23}, 
# {'name': 'xiaohong', 'age': 24}, 
# {'name': 'xiaohong', 'age': 30}]

匿名函數(shù)也可以作為參數(shù)傳入別的函數(shù)進(jìn)行調(diào)用:

def fn(a,b,fn):
    return fn(a,b)

res = fn(1,2,lambda num1,num2: num1 + num2)
print(res) # 3

以上就是匿名函數(shù)的基本用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尿庐,一起剝皮案震驚了整個(gè)濱河市忠怖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抄瑟,老刑警劉巖凡泣,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異皮假,居然都是意外死亡鞋拟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門惹资,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贺纲,“玉大人,你說我怎么就攤上這事褪测『锾埽” “怎么了潦刃?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)稠肘。 經(jīng)常有香客問我福铅,道長(zhǎng)萝毛,這世上最難降的妖魔是什么项阴? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮笆包,結(jié)果婚禮上环揽,老公的妹妹穿的比我還像新娘。我一直安慰自己庵佣,他們只是感情好歉胶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巴粪,像睡著了一般通今。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肛根,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天辫塌,我揣著相機(jī)與錄音,去河邊找鬼派哲。 笑死臼氨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芭届。 我是一名探鬼主播储矩,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼褂乍!你這毒婦竟也來了持隧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤逃片,失蹤者是張志新(化名)和其女友劉穎舆蝴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體题诵,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洁仗,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了性锭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赠潦。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖草冈,靈堂內(nèi)的尸體忽然破棺而出她奥,到底是詐尸還是另有隱情瓮增,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布哩俭,位于F島的核電站绷跑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凡资。R本人自食惡果不足惜砸捏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隙赁。 院中可真熱鬧垦藏,春花似錦、人聲如沸伞访。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厚掷。三九已至弟灼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冒黑,已是汗流浹背田绑。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留薛闪,地道東北人辛馆。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像豁延,于是被迫代替她去往敵國(guó)和親昙篙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

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

  • 〇诱咏、前言 本文共108張圖苔可,流量黨請(qǐng)慎重! 歷時(shí)1個(gè)半月袋狞,我把自己學(xué)習(xí)Python基礎(chǔ)知識(shí)的框架詳細(xì)梳理了一遍焚辅。 ...
    Raxxie閱讀 18,954評(píng)論 17 410
  • 1.函數(shù)的介紹 為什么要有函數(shù)?因?yàn)樵谄綍r(shí)寫代碼時(shí)苟鸯,如果沒有函數(shù)的話同蜻,那么將會(huì)出現(xiàn)很多重復(fù)的代碼,這樣代碼重用率就...
    機(jī)械師的呆子閱讀 691評(píng)論 0 0
  • 寫完前一篇文早处,看到了這一視頻(截圖)湾蔓,只能說:“冥冥之中……” 瞥見,于我一步之遙的貓砌梆,時(shí)而遙望遠(yuǎn)方默责,時(shí)而與我四目...
    年糕的日常閱讀 193評(píng)論 0 0
  • 若你是天贬循,我便是天上云, 默默相守桃序,不離不棄杖虾。 若你是地,我便是地上草媒熊, 徐徐遍布奇适,靜默相隨。 若你是山泛释,我便是山...
    婧笙瀟閱讀 229評(píng)論 0 0