在網路上隨手買了一本電腦書給弟弟,滿便宜的399,超商取貨省下很多往返書局的時間。設定環境和PyCharm我先先幫他設好,等他未來有空再自己去摸索。今天學了運算子,變數,資料型別,if…else, 迴圈。
注意事項:請不要讓小孩連續1小時進行「近距離觀看手機/螢幕/作業/書」,這會增加小孩近視的風險,要和學校上課/下課一樣,中間增加其他活動讓眼睛可以休息。
我們家小孩國小五年級。我覺得,程式寫不完也學不完,程式只是一個工具去解決問題。
教學的實況:https://youtu.be/vTQ4MChepHY
隨手買的書:Python 程式設計「超入門」
http://www.books.com.tw/products/0010734452
對照看的網路教材:30天Python學習分享路程
https://ithelp.ithome.com.tw/users/20107812/ironman/1539
索引
01 Python撰寫前的準備
02 如何建立Python專案與介紹PyCharm介面
03 識別字與變數
04 Python資料型態
05 Python資料型態(下)
06 運算單元
07 流程控制-for迴圈與while迴圈
08 Python-決策判斷篇if else敘述
09 Python-函式使用介紹
10 介紹如何使用PyCharm安裝函式庫
11 寫爬蟲程式前你必須知道的些事情
12 什麼是HTTP協定_
13 Python-使用Request向Server端請求資源
14 使用BeautifulSoup解析原始碼
15 BeautifulSoup(下)
16 Python-檔案處理篇(上)
17 Python -檔案處理篇(下)
18 Python Selenium模組介紹 (一)
19 Python Selenium模組介紹 (二)
20 Python 例外處理
21 Python 物件導向(一)
22 Python 物件導向(二)
23 Python 物件導向(三)
24 Python物件導向(四)
25 Python 正則表達式篇
26 Python 做一個簡單的小爬蟲(一)
27 Python 做一個簡單的小爬蟲(二)
28 Python 做一個簡單的小爬蟲(三)
29 Python 分享三年前大學爬蟲專題心得
30 Python 自學30天心得分享
一小時PYTHON入門-PART 1
https://hellolynn.hpd.io/2017/01/18/%E4%B8%80%E5%B0%8F%E6%99%82python%E5%85%A5%E9%96%80-part-1/
一小時PYTHON入門-PART 2
https://hellolynn.hpd.io/2017/01/18/%E4%B8%80%E5%B0%8F%E6%99%82python%E5%85%A5%E9%96%80-part-2/
Python – 十分鐘入門
http://tech-marsw.logdown.com/blog/2014/09/03/getting-started-with-python-in-ten-minute
Python基础
https://morvanzhou.github.io/tutorials/python-basic/basic/
大陸人(周莫烦)錄製的中文教學影片,感覺好專業!而且相關的進階教學都很完整!
附註: python3 和 python2 差不多,直接學 python3 比較好,可以省下「unicode」文字編碼在 encode/decode 轉換上的問題。
如何使用Python來寫遊戲——超級瑪麗第一關
https://kknews.cc/zh-tw/game/px4j6z2.html
零基础学Python之—AI五子棋(1)
https://zhuanlan.zhihu.com/p/28364376
Python开发小游戏(上)
https://www.youtube.com/watch?v=NdMqMTDh05Y
Python Web 程式設計入門實戰
https://hahow.in/courses/58001218da04300700fdee95/main?curriculum=5a1e1742a2c4b000589dcfe1
這個課程裡,有2個免費試看的項目:
- Python 程式設計初體驗(寶可夢 Pokemon 對戰遊戲範例)
- PTT 表特版與八卦版網路圖片網路爬蟲基礎(Requests/BeautifulSoup)
我覺得他寫Pokemon 這段寫的滿好的,在學習完 python 的 object 還有 def 後就可以用這個來練習物件、函數還有繼承的概念。
分享第二天的心得:
雖然第一天很快地講解了一次「運算子,變數,資料型別,if…else, 迴圈(for)」,但幾乎都是我在講,所以他用聽的,幾乎95%以上內容隔天都忘了。
第二天,重新再講一次,也讓他多去打書上的範例程式,自己打過一次,他比較記的起來,只是比較,他自己打過的範例,他也是都忘光光。@_@;
分享第三天的心得:
接著第二天遇到的,在學到函式(fuction) 之後,出了很多題目給他做,但他一題都沒做出來,也都是我自己公佈答案,感覺像是前二天都是白講的,像是進度只有零。
首先是,印出數字 1到 20,前二天都有練習到,但到了第三天,完全沒有印象,也完全無法實用,所以再翻回去一開始的 for count in range() 再來。
接著是判斷某一個數字是不是質數,質數的定義滿簡單的,就是中間遇到的數字,不能有餘數是零的數字。用python 就是把目的的數字去 mod (符號用:%) 去跑迴圈,有遇到結果等於零就是被整除,就不是質數。最後程式只有超短的5~6行,也是都我自己完成,他一行也擠不出來。
接著我們一起完成了一個函數,把一個變數放進去,可以傳回 True or False 用來判斷是不是質數。我們試了很多數字進去,確定函數沒問題,也有使用debug mode 去一行一行 trace code, 並講解變的變化。
接著我們又練習一個「輸入2個數字,傳回較大的」的函數,程式也是 3~4行,簡單的if 判斷,他說想不出來怎麼寫,我們先回去練習一次 if 的判斷,再回來寫這一個函數。我先試給他看,沒有 if 的話,用 return 可以傳回第一個參數值a,還有傳回第二個參數值b,接著練習傳回 a > b , 是可以傳回 boolean。請他接著完成整個 function 只差一個 if … eles … 他想很久,還是想不出來要怎麼寫,我後來就跟他講答案,方法很多,打給他看某一個解法。
對函數有基本認識後,也完成了一個「判斷某數是否為質數」的函數,我請弟弟列出 1~100 裡的數字有那些是質數,也一樣,想半他就呆坐很久,也想不出來,我就請他印出 1~ 100, 曾學過弟弟也打過的範例,還是說不知道、不清楚、不會。好吧我再跟他講答案。接著我問,在這個1~100的架構下,遇到 for 的變數內容是 >= 10 and <= 20 的才印出來,他也不會。我又再跟他講答案。接著都有這個 for + if + print 的架構,只要把 if 裡的判斷換成去呼叫我們一起完成的判斷質數函數就行,我請他來完成,他也說不會寫。我就再示範、講解還有進入 debug mode step by step trace code 給他看。
最後,我試了一個 2維的迴圈給他看,會印出一個 5 x 5 的 * 正方形,我問他怎麼印出 * 做的三角形。我想二維小朋友應該比較無法想像,所以印出星星的部份,我換成一維的迴圈,因為python 可以用 “*” * 5 來完成印星星,我試範一維迴圈完成印出5 x 5 的 * 正方形,我在紙上畫了一個三角形的形狀請他接下去做,他也不會。
我跟他說 for count in range(5) 是印出 0 1 2 3 4,我想印出 5 4 3 2 1 要怎麼做,他也不會。
我先示範,在迴圈外放一個變數 ,每次進 for loop 時減一給他看,可以完成 印 5 4 3 2 1. 我問他不使用這一個變數 只用 for count in range(5) 怎麼印出 5 4 3 2 1 他還是想不出來,我說很簡單哦,就用 5 去減 counter 就是答案了。
第三天的最後的感想是:
除了書上的範例是已知的答案,超過書上的問題,都是我一個人在唱獨角戲來實作。而且,講過的東西忘記是很正常。
最後弟弟問我一個問題:
爸爸你為什麼要教我寫程式。
我實在是不知道該回答什麼好。對呀,教他寫程式要做什麼?似乎有點太早。跟他講寫程式可以賺錢,小孩也不用這麼早出來賺錢。跟他解寫程式可以幫他解決生活上遇到的問題,他生活上的問題似乎都很簡單,不用寫程式也可以解決,科科。
第4天的心得:
弟弟隨手翻到 Dictionary,於是我們練習一下書上的範例,弟弟照書上的範例打完後,修改一下範例,改出了很多錯誤,我覺得這很棒,我也是透過 try error 來學習,進而成長,透過 try error 可以知道程式語言的限制和框架的範圍,大多的書和網路上Youtube 的教學都是只教「正確」的部份,透過寫有錯誤的,去了解為什麼錯,應該更能記的起來這個程式語言如何去操作。
我們練習的 sample:
menu={"a":1, "b":10, "c":100} for o in menu: print(o) print(menu[o])
弟弟把 “b”:10 換成 “b”:def 我說 def 是保留字,不能用,他換成 “b”:xyz 錯誤訊息是 xyz not defined 我說要把 xzy 變成 “xyz” 或 要先指定 xyz 的值給他,像是 xyz=”abc” 之類。
結論:弟弟對子串變數還不是很了解。
所以我們重頭回來講 1+1 = 2 這是數值的變數,但 “1” + “1” = “11” 這是字串內容。
接著練習 while(True): 的迴圈,他寫了一個小程式
while(True): print("打人")
我問弟弟怎麼改寫成,只打 10次就離開。弟弟照著書上while 的範例,改寫完成了,滿厲害的,好像比較了解變數的使用方法。
接著我把 print(“打人”) 改成 print(“打a人”) 我問他,怎麼改寫成第 1次寫 “打1人”,第2次是輸出 “打2人”… 以此類推。他說他不會。
我就加了一個變數 a 來疊加,並使用 debug mode 去 step by step trace code 給弟弟看,看 a 值每次都會被加一,我問他怎麼把值印出來,他說不會。
我說,print(“打a人”) 可以換成 print(“打” + “a” + “人”) 因為字串可以相加,像火車的車箱一樣可以串起來。把 print(“打” + “a” + “人”) 換成 print(“打” + a + “人”) 會出錯,顯示 must be str not int, 是說必需要用字串來加字串,因為 a 是數值變數,所以要在 a 的外面加一個 str(a) 把他轉換成字串型別,就可以相加。最後就是我們要的結果了。
寫程式對我來說,像是翻譯和拼圖。把人類預期的結果透過程式語言的符號去表達給電腦看,電腦就可以照我們的意思去快速地運算出我們想要的結果。拼圖的概念的針對需要的項目去學習就可以了,因為可以學的東西範圍太多,練習的範例多一點,可以拼出的圖片就會比較大一點。
第5天的心得:
收到 Anita 的留言,我想跟弟弟分享,所以我重頭照這篇文章,進行 review,還沒 review 完,弟弟還是狀況外,review 到函數那裡,我問他有一個函數傳入 2個變數長的像醬子:
def bigger(a,b): 的函數要傳回比較大的那一個數字,函數要怎麼寫,他說,他想到頭痛。我們就休息了,結果他還是什麼程式都不會寫,也還沒有分享到 Anita 的留言:
Good job!這麼認真的爸,小孩將來也會承襲老爸認真解決問態度滴,只是小孩還是小孩,老爸講課手放胸前太嚴肅了啦!
我是想跟他說一個解決問題的態度。
第6天的心得:
我們在八方雲集吃晚餐,弟弟問我呆會回家,會不會再教他寫程式,我說因為你最基本的基礎都還沒了解,不用回家,在這裡就可以教你了,我們用筆寫在八方雲集的餐盤的紙的背面。
我先問他:
a=50 b=40
要怎麼寫讓這 2個變數內容的值交換變成 a=40, b=50,弟弟回答不出來,我公佈答案是:
c=a a=b b=c
再回到講 def bigger(a,b):
他說他還是不會寫,我說這個需要使用到 if , 於是我講了很多 python 書裡提到的範例,然後再回到這一個 bigger(a,b): 的函數,弟弟還是無法自己完成。
我又舉了一個例子
hp=10 (皮卡丘的血剩 10滴) hp = hp -15 (皮卡丘被攻擊,扣15滴) if hp <=0: print("皮卡丘失去戰鬥能力") else: print("皮卡丘開始反擊")
講完問他有沒有了解 if 的用法,他說有。我們再回到講 bigger 傳回較大內容值的函數。我說我們先讓傳回值 =c 所以在最下面先寫 return c 那中間的 code 還缺什麼,他說他不會,不知道怎麼寫。我說,其實我們寫程式就是要叫電腦做事情,我們要先知道傳回較大內容值如果是人類,要怎麼來判斷,再把人類希望電腦去做的事情,翻譯成電腦可以看的懂的程式語言,讓電腦去計算。
如果我們先設定 c=a, 程式碼如下:
def bigger(a,b): c=a if ....(1)...: ....(2)... return c
上面程式碼裡, …(1)… 和 …(2)… 分別要寫什麼。透過醬子寫,弟弟終於回答的出來 …(1)… 和 …(2)… 裡要寫什麼內容。
第7天的心得:
跟弟弟一起看了幾篇 youtube 的教學。
Python基础
https://morvanzhou.github.io/tutorials/python-basic/basic/
等函數都會寫了,再開始挑戰 class.
第8天的心得:
之前就跟弟弟玩過計算幾月幾日星期幾的數學遊戲,原理是除以 7 取餘數。以 2018年1月1日星期1來說,與要的星期的餘數相差0, 所以魔術數字加 0 即可。
這個「萬年曆」的程式,我第一次遇到的時候覺得很神奇。
最後程式碼如下:
def getDays(m): m_list=[31,28,31,30,31,30,31,31,30,31,30,31] o=0 for c in range(m-1): #print("month:", c+1) #print("days:", m_list[c]) o = o + m_list[c] #print("count:", o) #print("finally:", o) return o def getWeek(m,d): w1 = d magic=0 if m > 1: w1 = w1 + getDays(m) w1 = (w1 + magic) % 7 return w1 w2 = getWeek(8, 20) print("Week", w2)
說明:上面是求出 2018-08-20 ,print 輸出的值是 1,代表星期一。中間我們需要處理用 for i in range(n) 去累加1月到7月中間的天數。最後再用 mod(%符號) 去取餘數,就可以算出幾月幾日星期幾。如果再接下去處理是要處理「潤年」的部份,每4年會有一天 2月變 29日。
公元年數被4除盡的是閏年, 但如被100除得盡而被400除不盡的則不是閏年。公元2000年可以被4及400整除,所以公元2000年是閏年。但1700,1800及1900因不 被400整除,所以不是閏年。
第9天的心得:
今天考弟弟,怎麼寫程式去累加 1~ 100,弟弟說不知道,我提示他說用 for i in range(n) 去處理,他還是說不知道,不會寫。我公佈答案:
o = 0 for i in range(1000): print("i:", i+1) o = o + (i+1) print("i:", o)
弟弟說他知道答案是 5050,但不會寫程式。數學的寫法是 (1+ 100) * (100/2) = 101 * 50 = 5050
Max心得:
C語言、其他程式語言、課業、溝通技巧、樂觀、不生氣、行動力這些看不見技能和我們肉身的肌肉一樣,需要經過多次的練習,才能變的更強壯、更熟練。但去練習一件不喜歡的事情,無法持久而且心裡也會不舒服,效率不好。
相關文章:
一個程式師媽媽的嘆息-兒童程式教育之我見
http://www.cc.ntu.edu.tw/chinese/epaper/0038/20160920_3802.html
問題一:為何要學寫程式?
問題二:為何兒童要學寫程式?
問題三:兒童用什麼方式學寫程式?
Python或JavaScript這種不需編譯可以直接執行看到結果,可能是較理想的程式教育入門。若兒童在沒有大人的監督指導下使用3C,孩子們可能玩起線上遊戲、上社群網站聊天、甚至是上了兒童不宜的網站。
結語
「未蒙其利、先受其害」。兒童在使用3C、電腦時,若沒有家長在旁督導(老師都不見得顧得到),他們很快會受這虛擬世界吸引,商人餵他們什麼都直接買帳,完全沒有過濾也不需要思考。我們本來希望能培養邏輯觀念強、會思考的未來人類,結果很可能是提早毀了他們的身心。個人的建議是在兒童閱讀能力及數學邏輯基本觀念未培養完成前,請不要給他們電腦(3C)。先學會親近自然、愛好藝術、多多閱讀會是我個人的選擇。