- 本教程為python3文檔解讀
- 本教程面向完全型小白,只要你會在電腦上打字,那你就可以看懂。
- 參考視頻觀看,味道更加:https://space.bilibili.com/186584185/#!/video
- 建議優先閱讀本系列的《編程的本質》這一章節。
貫穿始終的理念:別廢話,就是干!
往期回顧:
- 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
結構分析:
def 關鍵字
define的縮寫,就是定義的意思。函數名字
名字一般以英文或者下劃線開頭。內部可以摻雜數字。
比如galipy1、galipy2、gali_py、_gali2py、galipy_
不過,一般以下劃線開頭的名字在程序中都有特殊作用,所以你就乖乖用英文取名字吧。冒號
括號里的形式參數。
什么是形式參數呢?其實就是一個用來存儲你輸入的值的變量,這個變量可以有多個,看你自己需要幾個,自行設定。縮進
有時我們還會遇到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
下面就是程序的主體框架思路了。
- 我們來看第一句:
比較相鄰的元素。 如果第一個比第二個大,就交換他們兩個。
看到這句你能寫出什么?
什么是相鄰元素?列表的一號位和二號位,二號位和三號位,以此類推。
相鄰不就是差一個的意思嗎!
所以,用程序表示就是: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]
這不就是:如果、相鄰、比較、交換嗎?
我們在看下一句:
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。 在這一點,最后的元素應該會是最大的數。
說白了不就是先比較第一個與第二個,再比較第二個與第三個,再比較第三個與第四個,以此類推。
這不就是挨個遍歷嗎?
遍歷用啥?for語句啊
所以程序語言如何寫?
我們要從第一個遍歷到最后一個,從1,到結尾,這是一個范圍,所以會用range函數,和表示長度的len函數。
所以,代碼如下:
for i in range(len(a)):
這不就是從列表第一個值0號位開始,到結尾位嗎?
但是,我們在比較到倒數第二位時,就是比較最后兩位的大小,所以也就不用在用最后一位比較其他的了,所以,我們的范圍應該縮小一位。
變成len(a) - 1
也就是:
for i in range(len(a) - 1):
我們繼續往下讀:
- 針對所有的元素重復以上的步驟,除了最后一個。
這不就是循環往復嗎,所以自然是用while循環了。并且設置好判斷條件就行了。
于是就有:
while len(a):
但是人家強調除了最后一個,所以,應該少循環一次
while len(a) - 1:
為了方便書寫,我們這樣寫
b = len(a) - 1
while b :
在設置下判斷條件的改變方式
b = len(a) - 1
while b :
b = b - 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 的簡寫形式。
- 最后,用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( )函數~
希望上面的展示能讓初學編程的你理解程序是如何寫出來的~
如果學到了,記得在簡書給咖喱py點贊,好讓我知道你懂了~