1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 3198字,需瀏覽 7分鐘

         ·

        2019-08-31 23:49

        Python入門系列16

        897ddc9c332d3c298d3f2f84d33aadfe.webp

        函數(shù)篇


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


        1

        前言


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


        4dbe51690936851ce272799223d8d5f7.webp


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


        2

        定義函數(shù)


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


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

        >>>?hello?world!


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


        3

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


        1. 形參和實參

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

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


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

        想象一個實際場景,當(dāng)我們在計算減法算數(shù)的時候,需要你手寫一個函數(shù),傳入x,y并且將最終相加的結(jié)果打印出來。


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

        >>> 1


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


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

        >>>?1


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


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

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


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

        >>>?3.14


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


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

        >>>?31.400000000000002


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


        4

        函數(shù)的返回值


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


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

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

        >>>?4


        b81646bf00746e8f0c7b269737bfc68e.webp


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


        8ebd0a58834d43f776968a5e49bde61f.webp


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


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

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


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


        8b9ffa41990db8d874f5c12a4daaec32.webp


        5

        python的序列解包


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


        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'通過元組索引得到的值:{fruit[0]},?{fruit[1]}')
        banana,?apple?=?buy(20)
        print(f'通過解包得到的值:{banana},?{apple}')

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


        可以看到,如果我們?nèi)コ匈I水果,身上帶了大于10塊錢的錢,那么我就可以同時買到蘋果和香蕉,同時函數(shù)將兩個值一起返回,得到的是元組,在調(diào)用時解析時,可以直接對元組進(jìn)行解包操作,直接定義對應(yīng)變量的名稱即可!推薦用解包形式去得到函數(shù)多個返回值,因為邏輯非常清晰!


        6

        你不知道的python小知識點


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

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


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


        84bcdf6ad5877f9bc73e5cbac7ae7f87.webp


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


        Tips:

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


        拓展知識:

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


        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)侥??就是類似將元素串起來形成一個鏈子一樣。如下:


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

        >>>?1?1?1


        3. "序列解包"賦值

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


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

        >>>?1?2?3


        至此完!


        瀏覽 81
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久草在线视频福利资源站 | 毛片美国基地 | 黄色av网站在线观看 | 日本青青视频 | 日本三级片一区二区 | 亚洲乱亚洲乱妇28p | 免看一级a一片成人久久最新章节 | 精品人妻一区二区三区蜜桃 | 国内一级A片 | 《禁止的爱浴室吃奶无删》 |