iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 15
3

紙上得來終覺淺,絕知此事要躬行(南宋-陸游)- 其實光是看小馬的文章還不夠,想要澈底了解python如何解問題一定要實際演練

大家好,我是「心原一馬」,
很高興自己在鐵人賽中已經走了一半的路程了,
也是個很好的反思我們的方向以及目標的時間點呢。
今日主要不聊語法,聊聊為讀者們指引學習方向這塊。

為了真正能夠幫助想跟著小馬腳步學習「活用python- 路遙知碼力,日久練成精」的讀者,
小馬決定在此重要的里程碑上,
插入對於適合的線上程式練功平台的介紹。

覺得小馬提供的課後練習不夠嗎?
歡迎課後同時搭配線上解題系統自我練習(等一下會介紹)。
小馬自我回顧幾個於Day1開賽之初宣告的「教學理念及目標」:

  • 希望讓讀者認識python的精簡語法
  • 希望教給讀者化繁為簡的問題思維

竭至目前為止,小馬還算滿意自己的撰文,
並非完全介紹所有python中的語法,
但python精華的基礎語法也大概介紹了七、八成,
十幾天下來,也收集了數十個範例供大家實做演練,
然而,只是這樣看例子,
小馬仍擔心有不足之處。

高意境難駕馭的語法?

打個比方來說,
就像一個人想學習寫作,
他拜讀了大文豪的作品,
但由於意境高深而僅僅只能停留在「欣賞」的階段。

python的「切片」與「列表生成式」的意境甚是,
小馬許多朋友停留在「哇,這語法好炫」,但仍難以駕馭的階段,
譬如在Day10所描述的完美洗牌問題
你能想像c/c++可能要十行能解的問題,
將python切片特性用到極致僅需兩行嗎?

def pefectShuffle(deck):
    n= len(deck)//2
    deck[::2], deck[1::2]= deck[:n], deck[n:]

兩把python屠龍刀「切片」與「列表生成式」都傳授給你了,
但實際運用在解題上仍非一朝一夕便能上手的,
徨論實際常常需要各種語法融會貫通的使用。

嗯…如果你平時只是在文章列表中看看文章,
並沒有實際試著打程式,
然後期許自己有一天也能精通程式的話…

那麼今天小馬有一個好消息和一個壞消息要告訴你,
你想先聽哪個?
壞消息是,程式光看不練是很難進步的。
好消息是,程式要練習很簡單,你只要有一台電腦和網路就可以開始了

語言是用來溝通的,不只是用「看」的或「背」的

其實「程式語言」(如: python)和「外國語言」(如: 英語)兩者常常被拿來比較,
人們發現兩者似乎有些共通性,
用途都是用來溝通
只是外語是跟人類溝通,
程式語言是跟電腦溝通。

要提升外語能力最快的方式,
小馬覺得大概還是跟外國人實際對話、聊天吧。
否則,你可能背誦許多英語教科書的單字、文法,
實際對話時卻沒有經驗而仍然難以開口。

程式語言也類似,
或許你記得很多python的語法、規則,
但是你從未自己試著思考解題,
實際碰到問題時仍不知道這些語法可以如何運用。

今天起開始進入實戰吧

雖說要練習外語的難度有點高,
首先你要先有外國朋友或是有個說外語的環境。
相較之下,
要練習程式實在太容易了,
就看你有沒有心練習了,
今天就介紹一個適合練功的online judge平台(線上解題系統,簡稱OJ)給大家吧。

打怪練功升級般的訓練自己- CodeWars

小馬曾在這篇文章中盤點六個當今還蠻多人使用的OJ,
其實不同情境、不同需求都各自有適合的平台可供練習,
小馬覺得這些OJ也沒有絕對的好壞之分。
在這邊小馬則推薦codeWars做為練功平台,
(網址:https://www.codewars.com/)
你只要會註冊一個帳號即可上CodeWars練習了,
該平台為英文,讓你練程式兼練閱讀英文,
如註冊帳號有困難者,可參考這篇教學

進入平台後,你可以選擇自己想練習的語言,
(由於本系列就是教python語言,先選python)
Codewars的題目稱為Kata,題目分級很細,
細分至八個等級,數字愈小表示等級愈高。
一開始建議從8~6級的題目練起,
這級數的題目大多只是小菜一碟,
但對於熟悉想要熟悉python精簡語法者無非是非常好的途徑,

當在Codewars解開問題時,
便可以看到其它人跟自己同樣是python語言解答,
並且最佳解法是參與者共同票選出來的,
通常看到的解答也都是python精簡語法的展現,
故Codewars蠻適合做為各位「路遙知碼力,日久練成精」的輔助學習。

在Codewars解開問題後能看到其它好解答的機制,
也很好的克服了一般你在其它OJ上看不到別人解答而有點閉門造車研究的感覺,
有可能當你在Codewars思索一番後,
看到更好的解答,
會有「哦,原來還有這麼漂亮的解法」的驚呼吧。

噢,原來還能這樣解

究竟Codewars如何讓自己成長,
這邊舉一個今天隨意看到的8級的題目聊聊,
此題要定義一個函數

def set_alarm(b1, b2):
    pass

我們要讓函數返回一個布林值,
只有當b1Trueb2False我們才返回True
其餘狀況返回False
這題目夠簡單吧?
不過假設你對布值運算的了解不夠深入,
你可能就順手寫下這樣的程式碼了:

def set_alarm(b1, b2):
    if b1==True and vacation==False:
        return True
    else:
        return False

但是當你按下summit按鈕後,
你會發現其實大家投票的漂亮解答是這個:

def set_alarm(b1, b2):
    return b1 and not b2

或許你便能從別人更加精簡或巧妙的解法,
開拓自己的想法,
所以小馬推Codewars同時能訓練語法之美大概便是這樣腦力激盪的過程吧。

莫忘萬丈高樓平地起

雖說你可能會覺得Codewars 8~6級的題目有點太簡單,
但可以試做幾題檢視自己對python語法的掌握程度,
說不定看到投票最佳解時會有意外收穫。
當自我評估掌握程度足夠時,
亦可往5~4級題目邁進。
別忘了,要解一個大問題也常常要拆成小問題一一攻破。

總之希望這篇文章能給讀者練成python精簡語法一條明路。

鐵人賽過一半,剩下十五日的目標?

相較於前十五日一些小程式小問題的前奏,
後十五日會期望能夠實戰運用這些精簡語法,
介紹更加進階的程式技巧,
帶讀者們來看python精簡語法可以如何處理這些經典問題
以下是目前在規劃中的內容,歡迎對底下主題感興趣者追蹤後續篇章。
(底下不一定照順序講,實際以撰文安排流暢為準則)

進階程式技巧

  • 靈活定義函數參數
  • 遞迴函數使邏輯簡化
  • 任意規則的排序技巧
  • 問題不大時,窮舉所有可能的技巧

程式小專題

  • 數字趣味特性(友好數、婚約數)
  • 八皇后問題
  • 數獨
  • 青蛙過河
  • 馬踏棋盤

上一篇
Day14- 理解Python的生成器與迭代器; 高階函數map, filter, reduce 秀一波,竟有兩個好像似曾相識?
下一篇
Day16- Project1- 數字世界的朋友與戀人 (趣味數論問題: 友好數、婚約數)
系列文
活用python- 路遙知碼力,日久練成精30

尚未有邦友留言

立即登入留言