>def語句 在Python中創(chuàng)建一個(gè)函數(shù)是通過def關(guān)鍵字進(jìn)行的,def語句將創(chuàng)建一個(gè)函數(shù)對(duì)象并將其賦值給一個(gè)變量名。def語句一般的格式如下所示: def (arg1,arg2... ar" />

国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

總結(jié)Python編程中函數(shù)的使用要點(diǎn)

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:35:39
文檔

總結(jié)Python編程中函數(shù)的使用要點(diǎn)

總結(jié)Python編程中函數(shù)的使用要點(diǎn):為何使用函數(shù) 最大化代碼的重用和最小化代碼冗余 流程的分解 編寫函數(shù) >>def語句 在Python中創(chuàng)建一個(gè)函數(shù)是通過def關(guān)鍵字進(jìn)行的,def語句將創(chuàng)建一個(gè)函數(shù)對(duì)象并將其賦值給一個(gè)變量名。def語句一般的格式如下所示: def (arg1,arg2... ar
推薦度:
導(dǎo)讀總結(jié)Python編程中函數(shù)的使用要點(diǎn):為何使用函數(shù) 最大化代碼的重用和最小化代碼冗余 流程的分解 編寫函數(shù) >>def語句 在Python中創(chuàng)建一個(gè)函數(shù)是通過def關(guān)鍵字進(jìn)行的,def語句將創(chuàng)建一個(gè)函數(shù)對(duì)象并將其賦值給一個(gè)變量名。def語句一般的格式如下所示: def (arg1,arg2... ar

為何使用函數(shù)

  • 最大化代碼的重用和最小化代碼冗余
  • 流程的分解
  • 編寫函數(shù)

    >>def語句
    在Python中創(chuàng)建一個(gè)函數(shù)是通過def關(guān)鍵字進(jìn)行的,def語句將創(chuàng)建一個(gè)函數(shù)對(duì)象并將其賦值給一個(gè)變量名。def語句一般的格式如下所示:

    def (arg1,arg2,... argN):
     
    

    通常情況下,函數(shù)體中會(huì)有一個(gè)return語句,可以出現(xiàn)在函數(shù)體的任何位置,它表示函數(shù)調(diào)用的結(jié)束,并將結(jié)果返回至函數(shù)調(diào)用處。但是return語句是可選的,并不是必須的。從技術(shù)角度上說,一個(gè)沒有返回值的函數(shù)自動(dòng)返回了none對(duì)象,但是這個(gè)值可以被忽略掉。

    >>def語句是實(shí)時(shí)執(zhí)行的
    Python的def語句實(shí)際上是一個(gè)可執(zhí)行的語句:當(dāng)它運(yùn)行的時(shí)候,它創(chuàng)建一個(gè)新的函數(shù)對(duì)象并將其賦值給一個(gè)變量名。(請(qǐng)記住,Python中所有的語句都是實(shí)時(shí)運(yùn)行的,沒有對(duì)像獨(dú)立編譯時(shí)間這樣的流程)因?yàn)樗且粋€(gè)語句,它可以出現(xiàn)在任一語句可以出現(xiàn)的地方——甚至是嵌套在其他語句中。

    if test:
     def func():
     ...
    else:
     def func():
     ...
    ...
    func()
    

    它在運(yùn)行時(shí)簡單地給一個(gè)變量名進(jìn)行賦值。與C語言這樣的編譯語言不同,Python函數(shù)在程序運(yùn)行之前并不需要全部定義,更確切地說,def在運(yùn)行時(shí)才評(píng)估,而在def之中的代碼在函數(shù)調(diào)用時(shí)才會(huì)評(píng)估。

    就像Python中其他語句一樣,函數(shù)僅僅是對(duì)象,在程序執(zhí)行時(shí)它清除地記錄在了內(nèi)存之中。實(shí)際上,除了調(diào)用之外,函數(shù)允許任意的屬性附加到記錄信息以供隨后使用:

    othername=func #Assign function object
    othername() #Call func again
    
    func() #call object
    func.attr=value #attach attribute
    
    

    一個(gè)例子:定義和調(diào)用

    def times(x,y):
     return x*y
    
    times(2,4) #return 8
    times(3.12,4) #return 12.56
    times('Ni',4) #return 'NiNiNi'
    
    

    上面代碼中對(duì)函數(shù)的三次調(diào)用都能正確運(yùn)行,因?yàn)椤?“對(duì)數(shù)字和序列都有效,在Python我們從未對(duì)變量、參數(shù)或者返回值有過類似的聲明,我們可以把times用作數(shù)字的乘法或是序列的重復(fù)。

    換句話說,函數(shù)times的作用決定于傳遞給它的參數(shù),這是Python的核心概念之一。

    需要強(qiáng)調(diào)的是,如果我們傳入了一個(gè)不支持函數(shù)操作的參數(shù),Python會(huì)自動(dòng)檢測出不匹配,并拋出一個(gè)異常,這樣就能減少我們編寫不必要的類型檢測代碼。

    >>局部變量
    所有在函數(shù)內(nèi)部定義的變量默認(rèn)都是局部變量,所有的局部變量都會(huì)在函數(shù)調(diào)用時(shí)出現(xiàn),并在函數(shù)退出時(shí)消失。

    函數(shù)設(shè)計(jì)概念

  • 耦合性:對(duì)于輸入使用參數(shù)并且輸出使用return語句。
  • 耦合性:只有在真正必要的情況下使用全局變量。
  • 耦合性:不要改變可變類型的參數(shù),除非調(diào)用者希望這樣做。
  • 聚合性:每一個(gè)函數(shù)都應(yīng)該有一個(gè)單一的、統(tǒng)一的目標(biāo)。
  • 大小:每一個(gè)函數(shù)應(yīng)該相對(duì)較小。
  • 耦合:避免直接改變?cè)诹硪粋€(gè)模塊文件中的變量。
  • 函數(shù)對(duì)象:屬性和注解
  • >>間接函數(shù)調(diào)用
    由于Python函數(shù)是對(duì)象,我們可以編寫通用的處理他們的程序。函數(shù)對(duì)象可以賦值給其他的名字、傳遞給其他函數(shù)、嵌入到數(shù)據(jù)結(jié)構(gòu)、從一個(gè)函數(shù)返回給另一個(gè)函數(shù)等等,就好像它們是簡單的數(shù)字或字符串。

    把函數(shù)賦值給其他變量:

    def echo(message):
     print(message)
    
    x = echo
    x('Indirect call!') #Prints:Indirect call!
    
    

    傳遞給其他函數(shù):

    def indirect(func,arg):
     func(arg)
    
    indirect(echo,'Argument call') #Prints:Argument call
    
    

    把函數(shù)對(duì)象填入到數(shù)據(jù)結(jié)構(gòu)中:

    schedule=[(echo,'Spam!'),(echo,'Ham!')]
    for (func,arg) in schedule:
     func(arg)
    

    從上述的代碼中可以看到,Python是非常靈活的!

    >>函數(shù)內(nèi)省
    由于函數(shù)是對(duì)象,我們可以用用常規(guī)的對(duì)象工具來處理函數(shù)。

    func.__name__
    dir(func)
    

    內(nèi)省工具允許我們探索實(shí)現(xiàn)細(xì)節(jié),例如函數(shù)已經(jīng)附加了代碼對(duì)象,代碼對(duì)象提供了函數(shù)的本地變量和參數(shù)等方面的細(xì)節(jié):

    dir(func.__code__)
    func.__code__.co_varnames
    func.__code__.co_argument
    

    工具編寫者可以利用這些信息來管理函數(shù)。

    >>函數(shù)屬性
    函數(shù)對(duì)象不僅局限于上一小節(jié)中列出的系統(tǒng)定義的屬性,我們也可以向函數(shù)附加任意的用戶定義的屬性:

    func.count=0
    func.count+=1
    
    func.handles='Button-Press'
    
    

    這樣的屬性可以用來直接把狀態(tài)信息附加到函數(shù)對(duì)象,而不必使用全局、非本地和類等其他技術(shù)。和非本地不同,這樣的屬性信息可以在函數(shù)自身的任何地方訪問。這種變量的名稱對(duì)于一個(gè)函數(shù)來說是本地的,但是,其值在函數(shù)退出后仍然保留。屬性與對(duì)象相關(guān)而不是與作用域相關(guān),但直接效果是類似的。

    >>Python3.0中的函數(shù)注解
    在Python3.0也可以給函數(shù)對(duì)象附加注解信息——與函數(shù)的參數(shù)相關(guān)的任意的用戶定義的數(shù)據(jù)。Python為聲明注解提供了特殊的語法,但是,它自身不做任何事情;注解完全是可選的,并且,出現(xiàn)的時(shí)候只是直接附加到函數(shù)對(duì)象的__annotations__屬性以供其他用戶使用。

    從語法上講,函數(shù)注解編寫在def頭部行,對(duì)于參數(shù),它們出現(xiàn)在緊隨參數(shù)名之后的冒號(hào)之后;對(duì)于返回值,它們編寫于緊跟在參數(shù)列表之后的一個(gè)->之后。

    def func(a:'spam',b:(1,10),c:float) -> int:
     return a+b+c
    

    注解和沒注解過的函數(shù)在功能和使用上完全一樣,只不過,注解過的函數(shù),Python會(huì)將它們的注解的數(shù)據(jù)收集到字典中并將它們附加到函數(shù)對(duì)象自身。參數(shù)名變成鍵,如果編寫了返回值注解的話,它存儲(chǔ)在鍵return下,而注解的值則是賦給了注解表達(dá)式的結(jié)果:

    func.__annotations__
     #Prints:{'a':'spam','c':,'b':(1,10),'return':}
    

    注意點(diǎn)

    如果編寫了注解的話,仍然可以對(duì)參數(shù)使用默認(rèn)值,例如:a:'spam'=4 意味著參數(shù)a的默認(rèn)值是4,并且用字符串'spam'注解它。
    在函數(shù)頭部的各部分之間使用空格是可選的。
    注解只在def語句中有效。
    匿名函數(shù):lambda

    除了def語句之外,Python還提供了一種生成函數(shù)對(duì)象的表達(dá)式形式。由于它與LISP語言中的一個(gè)工具很相似,所以稱為lambda。就像def一樣,這個(gè)表達(dá)式創(chuàng)建了一個(gè)之后能夠調(diào)用的函數(shù),但是它返回了一個(gè)函數(shù)而不是將這個(gè)函數(shù)賦值給一個(gè)變量名。這也就是lambda有時(shí)叫做匿名函數(shù)的原因。實(shí)際上,它們常常以一個(gè)行內(nèi)函數(shù)定義的形式使用,或者用作推遲執(zhí)行一些代碼。

    >>lambda表達(dá)式
    lambda的一般形式是關(guān)鍵字lambda,之后是一個(gè)或多個(gè)參數(shù),緊跟的是一個(gè)冒號(hào),之后是一個(gè)表達(dá)式:

    lambda argument1,argument2,...argumentN:expression using arguments
    

    由lambda表達(dá)式所返回的函數(shù)對(duì)象與由def創(chuàng)建并賦值后的函數(shù)對(duì)象工作起來是完全一樣的,但是lambda有一些不同之處讓其在扮演特定的角色時(shí)很有用。

    lambda是一個(gè)表達(dá)式,而不是一個(gè)語句。
    lambda的主體是一個(gè)單個(gè)的表達(dá)式,而不是一個(gè)代碼塊。
    一下兩段代碼生成了同樣功能的函數(shù):

    def func(x,y,z):return x+y+z
    func(2,3,4) #Return 9
    
    f = lambda x,y,z : x + y + z
    f(2,3,4) #Return 9
    
    

    默認(rèn)參數(shù)也能在lambda中使用

    x=(lambda a="fee",b="fie",c="foe": a+b+c)
    x("wee") #Prints:'weefiefoe'
    

    在lambda主體中的代碼像在def內(nèi)的代碼一樣都遵循相同的作用域查找法則。

    >>為什么要使用lambda
    通常來說,lambda起到了一種函數(shù)速寫的作用,允許在使用的代碼內(nèi)嵌入一個(gè)函數(shù)的定義。它們總是可選的,因?yàn)榭偸悄軌蛴胐ef來代替。

    lambda通常用來編寫跳轉(zhuǎn)表:

    L=[lambda x: x ** 2,
     lambda x: x ** 3,
     lambda x: x ** 4]
    
    for f in L:
     print(f(2)) #Prints:4,8,16
    print(L[0](3)) #Prints:9
    
    

    實(shí)際上,我們可以用Python中的字典或者其他數(shù)據(jù)結(jié)構(gòu)來構(gòu)建更多種類的行為表:

    key='got'
    {'already':(lambda: 2+2),
     'got':(lambda: 2*4),
     'one':(lambda: 2 ** 6)}[key]() #Prints:8
    

    這樣編寫代碼可以使字典成為更加通用的多路分支工具。

    最后需要注意的是,lambda也是可以嵌套的

    ((lambda x:(lambda y: x+y))(99))(4) #Prints:103
    

    在序列中映射函數(shù):map

    map函數(shù)會(huì)對(duì)一個(gè)序列對(duì)象中的每個(gè)元素應(yīng)用被傳入的函數(shù),并且返回一個(gè)包含了所有函數(shù)調(diào)用結(jié)果的一個(gè)列表。

    counters=[1,2,3,4]
    def inc(x):return x+10
    list(map(inc,counters)) #[11,12,13,14]
    

    由于map期待傳入一個(gè)函數(shù),它恰好是lambda最常出現(xiàn)的地方之一。

    list(map((lambda x: x+10),counters)) #[11,12,13,14]
    

    函數(shù)式編程工具:filter和reduce

    在Python內(nèi)置函數(shù)中,map函數(shù)是用來進(jìn)行函數(shù)式編程的這類工具中最簡單的內(nèi)置函數(shù)代表。所謂的函數(shù)式編程就是對(duì)序列應(yīng)用一些函數(shù)的工具。例如過濾出一些元素(filter),以及對(duì)每對(duì)元素都應(yīng)用函數(shù)并運(yùn)行到最后的結(jié)果(reduce)。

    list(filter((lambda x: x>0),range(-5,5))) #[1,2,3,4]
    

    序列中的元素若其返回值是真的話,將會(huì)被加入到結(jié)果列表中。

    reduce接受一個(gè)迭代器來處理,但是,它自身不是一個(gè)迭代器,它返回一個(gè)單個(gè)的結(jié)果。

    from functools import reduce #Import in 3.0,not in 2.6
    reduce((lambda x,y: x+y),[1,2,3,4]) #Return:10
    reduce((lambda x,y: x*y),[1,2,3,4]) #Return:24
    

    上面兩個(gè)reduce調(diào)用,計(jì)算了一個(gè)列表中所有元素的累加和與累積乘積。

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    總結(jié)Python編程中函數(shù)的使用要點(diǎn)

    總結(jié)Python編程中函數(shù)的使用要點(diǎn):為何使用函數(shù) 最大化代碼的重用和最小化代碼冗余 流程的分解 編寫函數(shù) >>def語句 在Python中創(chuàng)建一個(gè)函數(shù)是通過def關(guān)鍵字進(jìn)行的,def語句將創(chuàng)建一個(gè)函數(shù)對(duì)象并將其賦值給一個(gè)變量名。def語句一般的格式如下所示: def (arg1,arg2... ar
    推薦度:
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品欧美一区二区三区 | 国模冰冰炮交图150 国模吧国模吧一二区 | 在线观看色视频网站 | 亚洲 欧美 中文 日韩专区 | 国产成人高清亚洲一区久久 | 亚洲国内精品 | 国内视频一区二区三区 | 久久亚洲欧美综合激情一区 | 亚洲国产精品热久久 | 欧美日韩性视频一区二区三区 | 91久久精品一区二区三区 | 欧美亚洲综合图区在线 | 精品视频一区二区三区四区 | 精品日韩一区二区三区 | 亚洲欧美日韩另类 | 亚洲欧洲国产成人综合一本 | 亚洲精品制服丝袜二区 | 一级成人毛片免费观看 | 国产播放器一区 | 国内久久| 一级成人a免费视频 | 国产日本在线 | 欧美激情一区二区亚洲专区 | 国产精品久久久久aaaa | 欧美日韩一区二区在线 | 免费国产一区 | 亚洲色欧美| 精品国产3p一区二区三区 | 欧美视频区 | 国产精品手机视频一区二区 | 国产精品免费观看视频播放 | 欧美日韩亚洲一区二区三区在线观看 | 国模冰冰炮交图150 国模吧国模吧一二区 | 香蕉精品视频 | 亚洲欧美一区二区三区孕妇 | 91大神在线精品视频一区 | 日韩欧美一区二区三区四区 | 久久人精品| 欧美日韩一区二区在线 | 欧美亚洲国产一区二区 | 国产精品资源在线观看 |