<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python入門(mén)系列16 - 函數(shù)篇

          共 3198字,需瀏覽 7分鐘

           ·

          2019-08-31 23:49

          Python入門(mén)系列16

          897ddc9c332d3c298d3f2f84d33aadfe.webp

          函數(shù)篇


          本篇文字為2187字,閱讀時(shí)間約為9分鐘。


          1

          前言


          函數(shù)篇 ------ 說(shuō)起函數(shù),大家高中應(yīng)該都學(xué)過(guò)類似的概念,函數(shù)指一個(gè)量隨著另一個(gè)量的變化而變化,而在編程中,函數(shù)的概念則不盡相同。舉個(gè)例子,比如打過(guò)dota的同學(xué)都知道,在dota中通過(guò)shift可以對(duì)英雄進(jìn)行預(yù)操作,也就是當(dāng)英雄還沒(méi)到某一地方時(shí),我們可以通過(guò)shift鍵來(lái)設(shè)定好相應(yīng)的路徑以及施法,來(lái)完成對(duì)英雄的提前操作,這樣起到的作用就是將操作模板化。


          4dbe51690936851ce272799223d8d5f7.webp


          而相應(yīng)的,在程序中,函數(shù)就是為了將代碼進(jìn)行模板化管理,它可以實(shí)現(xiàn)一些特定功能的小方法或是小程序。而在python小課堂之前的介紹中,其實(shí)就已經(jīng)介紹過(guò)不少python自帶的函數(shù)了,比如print()、max()、ord()等。。


          2

          定義函數(shù)


          通常在python中,我們可以類似下面的寫(xiě)法去定義一個(gè)函數(shù):


          def?print_hello(words):
          ??print('hello?'?+?words)
          ??
          print_hello('world!')

          >>>?hello?world!


          def作為python中的關(guān)鍵標(biāo)識(shí)字,全拼define 定義的意思,后面的print_hello作為函數(shù)的名稱,小括號(hào)里面可以傳入不同的參數(shù),以便外面調(diào)用時(shí)將參數(shù)傳入。想后面的print_hello('world!')就是將'world!' 傳入到print_hello中。


          3

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


          1. 形參和實(shí)參

          其中print_hello(words): words代表的是函數(shù)的形參,形式上的參數(shù)。

          其中print_hello('world!'):'world!'代表的是函數(shù)的實(shí)參,即實(shí)際的參數(shù)。


          2. 必須參數(shù)和關(guān)鍵字參數(shù)

          想象一個(gè)實(shí)際場(chǎng)景,當(dāng)我們?cè)谟?jì)算減法算數(shù)的時(shí)候,需要你手寫(xiě)一個(gè)函數(shù),傳入x,y并且將最終相加的結(jié)果打印出來(lái)。


          def?sub(x,?y):
          ????sub?=?x?-?y
          ????print(sub)
          sub(2,1)

          >>> 1


          調(diào)用add函數(shù)時(shí),傳入的1,2稱之為必須參數(shù),也就是實(shí)參,傳入時(shí)是有順序的,所以我們最終結(jié)果得到的是1,但是如果我們把sub(2,1)改成了sub(1,2)最終得到的結(jié)果就是-1,有沒(méi)有一種方法依然可以得到1呢?此時(shí)使用關(guān)鍵字參數(shù)即可實(shí)現(xiàn)。忽略實(shí)際參數(shù)傳入時(shí)的順序,寫(xiě)法如下:


          def?sub(x,?y):
          ????sub?=?x?-?y
          ????print(sub)
          sub(y?=?1,x?=?2)

          >>>?1


          可以看到,在傳入實(shí)參時(shí),我們可以指定對(duì)應(yīng)的函數(shù)形參值,進(jìn)行傳入對(duì)應(yīng)的值,來(lái)達(dá)到無(wú)序傳入。關(guān)鍵字參數(shù)在一些源碼中是經(jīng)常被用到的!


          3. 默認(rèn)參數(shù)

          場(chǎng)景更新一下!比如現(xiàn)在需要我們求一個(gè)半徑默認(rèn)為1的圓形面積,半徑可以通過(guò)外界因素進(jìn)行改變,請(qǐng)?jiān)O(shè)計(jì)出對(duì)應(yīng)的函數(shù)。代碼如下:


          def?circle_area(r?=?1):
          ????area?=?3.14?*?r
          ????print(area)
          circle_area()

          >>>?3.14


          默認(rèn)參數(shù)就是在形參處寫(xiě)好一個(gè)默認(rèn)值,若調(diào)用時(shí)沒(méi)有傳入值,則變量會(huì)取默認(rèn)值。再來(lái)看下如果傳入值會(huì)發(fā)生什么?


          def?circle_area(r?=?1):
          ????area?=?3.14?*?r
          ????print(area)
          circle_area(10)

          >>>?31.400000000000002


          可以看到外面調(diào)用10時(shí),將形參r=1覆蓋掉了,最終算出來(lái)的結(jié)果以r=10為準(zhǔn)。


          4

          函數(shù)的返回值


          函數(shù)的返回值:通過(guò)return關(guān)鍵詞來(lái)進(jìn)行返回,當(dāng)我們調(diào)用函數(shù)時(shí),可以將函數(shù)的處理結(jié)果返回到調(diào)用處,來(lái)看一個(gè)加法的函數(shù)例子:


          def?add(x,?y):
          ????sum?=?x?+?y
          ????return?sum

          result?=?add(1,?3)
          print(result)

          >>>?4


          b81646bf00746e8f0c7b269737bfc68e.webp


          如果什么add函數(shù)不寫(xiě)return值呢?來(lái)看下結(jié)果:


          8ebd0a58834d43f776968a5e49bde61f.webp


          上面的例子可以看到,python函數(shù)默認(rèn)return值為None,而#代表的是注釋,在代碼中起到的作用是解釋當(dāng)前代碼的意思,是寫(xiě)給人看的,并不執(zhí)行。同樣的#只能注釋一行,要想注釋多行可以使用 ''' 你的代碼 ''',"""? 你的代碼 """? ,也就是所謂的三雙引號(hào)和三單引號(hào)。如下:


          '''
          def?add(x,?y):
          ????sum?=?x?+?y
          ????return?sum
          '''

          """
          result?=?add(1,?3)
          print(result)
          """


          return關(guān)鍵詞在函數(shù)中也代表這停止的意思,也就說(shuō)在函數(shù)中如果遇到return,那么return后面的代碼不會(huì)進(jìn)行執(zhí)行。如下:


          8b9ffa41990db8d874f5c12a4daaec32.webp


          5

          python的序列解包


          在python的函數(shù)中,返回值是可以有多個(gè)值的,比如現(xiàn)在有一個(gè)場(chǎng)景,讓你去超市買(mǎi)水果,然后你花錢(qián)買(mǎi)到了蘋(píng)果和香蕉。我用簡(jiǎn)單的函數(shù)代碼來(lái)演示下:


          81b18c666d01ec65bac9342f4d5cccc0.webp


          def?buy(money):
          ????if?money?>?10:
          ????????fruit_a?=?'banana'
          ????????fruit_b?=?'apple'
          ????????return?fruit_a,?fruit_b

          fruit?=?buy(20)
          print(type(fruit))
          print(f'通過(guò)元組索引得到的值:{fruit[0]},?{fruit[1]}')
          banana,?apple?=?buy(20)
          print(f'通過(guò)解包得到的值:{banana},?{apple}')

          >>>?<class?'tuple'>
          >>>?通過(guò)元組索引得到的值:banana,?apple
          >>>?通過(guò)解包得到的值:
          banana,apple


          可以看到,如果我們?nèi)コ匈I(mǎi)水果,身上帶了大于10塊錢(qián)的錢(qián),那么我就可以同時(shí)買(mǎi)到蘋(píng)果和香蕉,同時(shí)函數(shù)將兩個(gè)值一起返回,得到的是元組,在調(diào)用時(shí)解析時(shí),可以直接對(duì)元組進(jìn)行解包操作,直接定義對(duì)應(yīng)變量的名稱即可!推薦用解包形式去得到函數(shù)多個(gè)返回值,因?yàn)檫壿嫹浅G逦?/span>


          6

          你不知道的python小知識(shí)點(diǎn)


          1.python的系統(tǒng)遞歸參數(shù)

          現(xiàn)在有一個(gè)場(chǎng)景,請(qǐng)你實(shí)現(xiàn)打印一句話hello!并且在函數(shù)內(nèi)部調(diào)用自己本身。代碼實(shí)現(xiàn)如下:


          def?print_hello(words):
          ? print(words)
          ? print_hello(
          'hello')
          print_hello('world!')


          84bcdf6ad5877f9bc73e5cbac7ae7f87.webp


          可以看到報(bào)錯(cuò)了!錯(cuò)誤中文大概意思是遞歸錯(cuò)誤,超過(guò)最大遞歸深度。最大深度就是屏幕上的993次。


          Tips:

          遞歸 ---> 遞歸的意思就是函數(shù)本身自己調(diào)用自己。比如上面的例子中,在print_hello函數(shù)中又調(diào)用了自己,所以python就會(huì)一直執(zhí)行下去,但是python自身有檢測(cè)遞歸函數(shù)的機(jī)制,所以如果你寫(xiě)了一個(gè)死循環(huán)這樣的遞歸,它會(huì)直接進(jìn)行最大次數(shù)的嘗試并且報(bào)錯(cuò)。常見(jiàn)的錯(cuò)誤:在程序中若寫(xiě)了一個(gè)死循環(huán)遞歸方法,最終報(bào)錯(cuò)的信息則是:MemoryError: stack overflow,也就是常說(shuō)的棧內(nèi)存溢出。


          拓展知識(shí):

          在上一節(jié)中,我曾經(jīng)說(shuō)過(guò)一個(gè)python自帶的包,叫做sys。通過(guò)sys可以來(lái)設(shè)定遞歸函數(shù)的最大深度。請(qǐng)看下面的代碼:


          import?sys
          sys.setrecursionlimit(1000)

          def?print_hello(words):
          ??print(words)
          ??print_hello('hello')

          print_hello('world!')


          2. python的鏈?zhǔn)劫x值

          在python中,是支持鏈?zhǔn)劫x值的,什么是鏈?zhǔn)侥兀烤褪穷愃茖⒃卮饋?lái)形成一個(gè)鏈子一樣。如下:


          a?=?b?=?c?=?1
          print(a,?b,?c)

          >>>?1?1?1


          3. "序列解包"賦值

          道理和上面講過(guò)的序列解包差不多:


          a,?b,?c?=?1,?2,?3
          print(a,?b,?c)

          >>>?1?2?3


          至此完!


          瀏覽 81
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久成人小电影 | 日韩高清无码本道 | 久久久亚洲熟妇熟 | 亚洲一区福利在线 | 国产高清无码内射 |