跟我讀python3文檔:016_帶你手撕程序,展現一個函數如何從思路到實現

貫穿始終的理念:別廢話,就是干!


往期回顧

  • break
  • continue
  • len( )函數
  • range( )函數的返回值,以及三個參數
  • 幫助函數
  • type( )
  • a, b = b, a

想看手撕程序的,請跳過4.6小節,直接往下翻。

4.6. Defining Functions

上期我們嘗試生成了10以內的斐波那契數列( the Fibonacci series),那么如何生成任意邊界的斐波那契數列呢?

這就要用到函數這個概念了。
相當于我們寫一個小程序,他的功能就是生成我們指定邊界的斐波那契數列,比如我在這個小程序中輸入10,他就會生成:1, 1, 2, 3, 5, 8。

那么這個小程序有哪些基本要素呢?
我們直接用代碼說話:

>>> def fib(n):   
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...

小程序fib( )就寫好了,也就是說,我們寫好了一個名為:fib( )的函數。
我們運行fib( ) 函數看看:

>>> fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

結構分析:

  1. def 關鍵字
    define的縮寫,就是定義的意思。

  2. 函數名字
    名字一般以英文或者下劃線開頭。內部可以摻雜數字。
    比如galipy1、galipy2、gali_py、_gali2py、galipy_
    不過,一般以下劃線開頭的名字在程序中都有特殊作用,所以你就乖乖用英文取名字吧。

  3. 冒號

  4. 括號里的形式參數。
    什么是形式參數呢?其實就是一個用來存儲你輸入的值的變量,這個變量可以有多個,看你自己需要幾個,自行設定。

  5. 縮進

  6. 有時我們還會遇到return語句,等遇到時在解釋。

試著自己參考著以上要點,模仿著寫幾個函數,然后執行看看能不能成功得到想要的結果。比如把我們之前介紹的冒泡排序法完善下~


到目前為你,如果你是跟著我的教程一步一步走來的話,那么恭喜你,你的一只腳終于邁進了編程的大門。
理論上,掌握了上邊的5個要點,再加上之前學的語句,你就可以開始用最原始的方法寫程序了。雖然大型程序還費點勁,但是解決點小問題還是綽綽有余的。
不過,你的編程之路才剛剛開始。
你現在只不過是初入江湖,離走出新手村還有很遠的道路。
建議先停下腳步,回憶回憶我們之前講的東西。

試著自己寫出:斐波那契數列、冒泡排序法。
如果你能完成上面兩個函數,并且成功運行,那么說明你的階段學習是合格的,可以開始之后的學習。
如果你發現自己依舊不能寫出來,那就停下來,回顧回顧以前講解的知識,看看自己到底是哪里不明白。


作者:咖喱py

手撕函數

下面,我以冒泡排序為例,給大家講解下寫程序的基本思路:

一、自然是先google下,看看什么是冒泡排序。

得到如下結果:

冒泡排序算法的流程如下:
比較相鄰的元素。 如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。 在這一點,最后的元素應該會是最大的數。
針對所有的元素重復以上的步驟,除了最后一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

上面這些就是思路。
下面的就是實現過程

二、按照提示構建程序。

我們依舊以[5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]這個列表為例。

a = [5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]

得到列表a

下面就是程序的主體框架思路了。

  1. 我們來看第一句:

比較相鄰的元素。 如果第一個比第二個大,就交換他們兩個。

看到這句你能寫出什么?
什么是相鄰元素?列表的一號位和二號位,二號位和三號位,以此類推。
相鄰不就是差一個的意思嗎!
所以,用程序表示就是:a[ i ]與a[ i + 1 ]

然后我們繼續看關鍵詞:比較、相鄰、如果、交換。
那我們就用程序表達出來唄:

if a[i] > a[i + 1]:
    a[i], a[i + 1] = a[I + 1], a[i]

我們讓 j = i + 1,方便書寫。

if a[i] > a[j]:
    a[i], a[j] = a[j], a[i]

這不就是:如果、相鄰、比較、交換嗎?


我們在看下一句:

  1. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。 在這一點,最后的元素應該會是最大的數。

說白了不就是先比較第一個與第二個,再比較第二個與第三個,再比較第三個與第四個,以此類推。
這不就是挨個遍歷嗎?
遍歷用啥?for語句啊
所以程序語言如何寫?
我們要從第一個遍歷到最后一個,從1,到結尾,這是一個范圍,所以會用range函數,和表示長度的len函數。
所以,代碼如下:

for i in range(len(a)):

這不就是從列表第一個值0號位開始,到結尾位嗎?
但是,我們在比較到倒數第二位時,就是比較最后兩位的大小,所以也就不用在用最后一位比較其他的了,所以,我們的范圍應該縮小一位。
變成len(a) - 1
也就是:

for i in range(len(a) - 1):

我們繼續往下讀:

  1. 針對所有的元素重復以上的步驟,除了最后一個。
    這不就是循環往復嗎,所以自然是用while循環了。并且設置好判斷條件就行了。
    于是就有:
while len(a):

但是人家強調除了最后一個,所以,應該少循環一次

while len(a) - 1: 

為了方便書寫,我們這樣寫

b = len(a) - 1
while b :

在設置下判斷條件的改變方式

b = len(a) - 1
while b :
    b = b - 1

  1. 最后,把他們組合一下:
a = [5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]
b = len(a) - 1
while b :
    for i in range(len(a)-1):

        j = i + 1

        if a[i]>a[j]:
            a[i], a[j] = a[j], a[i]

    b -= 1                                   #這是b = b - 1 的簡寫形式。
  1. 最后,用print函數把結果打印出來就可以了。
a = [5, 432, 23, 73, 98, 23, 765, 11, 90, 69, 4]
b = len(a) - 1
while b :
    for i in range(len(a)-1):

        j = i + 1

        if a[i]>a[j]:
            a[i], a[j] = a[j], a[i]

    b -= 1
print(a)

三、封裝為函數,方便調用。

有了主體框架了,我們在把它封裝下,做成一個可以排序任意長度列表的函數就可以了。
用我們新學的知識:自定義函數。
取個函數名字,就叫:bubble吧~

def bubble(a):
    b = len(a) - 1
    while b :
        for i in range(len(a)-1):
            j = i + 1
            if a[i]>a[j]:
                a[i], a[j] = a[j], a[i]
        b -= 1
    print(a)

大功告成~
試試你的bubble( )函數~

bubble函數.png

希望上面的展示能讓初學編程的你理解程序是如何寫出來的~
如果學到了,記得在簡書給咖喱py點贊,好讓我知道你懂了~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 我一直覺得寫代碼也可以寫出藝術,在不懂畫的人的眼里,《向日葵》不過是小孩子的涂鴉,在懂代碼的人眼里,那看似混亂的字...
    AidenRao閱讀 4,181評論 9 59
  • 某次二面時,面試官問起Js排序問題,吾絞盡腦汁回答了幾種,深感算法有很大的問題,所以總計一下! 排序算法說明 (1...
    流浪的先知閱讀 1,215評論 0 4
  • (2013年4月28日)關關雎鳩jujiu,在河之洲。窈窕淑女,君子好逑。參差荇xing菜,左右流之。窈窕淑女,寤...
    逸而全真閱讀 809評論 2 8
  • 周六早晨,帶著喜歡聽故事的興奮勁,去簡單心理主辦的“故事客棧——無水之魚”歇了歇腳,給自己的人生點個暫停,去他人的...
    豆璟閱讀 610評論 0 3
  • 1 對面坐著兩年未見的閨蜜––莫曉玉。 高大英俊,溫柔白凈,比歐陽要顧家,前提是單身,你周圍有這樣的人可要記得幫我...
    素一航閱讀 432評論 0 2