【轉載】零基礎小白如何入門 Python 程式設計

Junting發表於2018-01-17

引子

我們來探討的問題是 —— 如何從零開始學習python。

相信你能看到這篇文章,一定心裡有一個學習程式設計教程式設計的想法,本文分享的知識可以為這兩個目標提供一些參考價值。

為什麼是我來講這個事情呢?在過去的兩個月時間內,作者在自己開發的教育平臺——uband友班上面開辦了一個python班級,報名的使用者 75%是零基礎使用者,還有25%是之前學過,這25%中有一些負基礎使用者。

如何教?是不是我發一教材,然後讓大家順著開始學?是不是我們先進行一些理論學習,視訊授課?

我分析了一下情況,發現以下幾個比較有意思的點:

  1. 來學習的人之中有 70%是女生。

  2. 學生黨和工作黨的比例是 3:2。

  3. 絕大部分人一天只能抽出1~2個小時學習(非脫產)。

  4. 基礎幾乎都沒有。

無疑這是一個極大的挑戰,下面我就來講一下如何教學。

學程式設計從理論還是從訓練開始?

這個問題讓我回想到了自己的科班的學習過程,有這樣一個故事給大家分享:

“2012年,過年回家的火車上,我提著行李走上了擁擠的車廂,對面的小哥頂著蓬鬆的頭髮,我知道,這也許是我的同行。24小時的上海到貴州的旅程就沒那麼孤單,因為我們都在討論架構、演算法、程式設計學習...這個工作了5 年的前輩給我的建議是,你現在看這個架構、程式設計理論等書籍,不求甚解即可,等你有了大把經驗,回來很快就能秒懂。

時間過去了2年,兩年中我也沒有看任務關於python的書籍,不過用它寫了七七八八不下幾萬行指令碼解決各種問題。有一些我在圖書館等人,隨手翻看了一本《Python cookbook》,是一本500+頁的大部頭書,我就那麼一頁頁翻看,等的人到了,我也看完了。

請問,我等了多久?

答案是:兩個小時”。

這個故事讓我思考了學習的兩種不同的模式。

學習的模式 — 創造還是模仿

先給大家看兩個學習者:

  1. 想要通過學習python程式設計完成一個自己的個人網站。

  2. 想要通過學習python,對比python和其他指令碼程式語言的設計優劣,然後改進之。

顯然這兩個人的學習方式勢必是不一樣的。

第一個人的學習重點在於 —— 模仿,這將是大多數程式設計師所做的工作,在這個階段,不要說程式設計是創造性的工作,頂多能說程式設計是一個有邏輯性的工作,模仿就可以了。

第二個人,顯然是一個程式設計科學家,北美的高校有一個研究方向叫做 programming language,我有幾個過去的同學都讀了這個專業的博士,還有我們著名的程式設計屆網紅“王垠”同學也是讀的這個專業,這個專業的使命是什麼—— “創造一門程式語言” or “改進現有的程式語言”,他們的工作,模仿是遠遠不夠的,需要了解整個理論體系、設計原則、處理細節等等...他們不能靠模仿來學習,因為沒有什麼可以模仿。

而學習程式設計最大的悲劇 —— 就是明明自己的目的是模仿逐步形成自己的技能,而誤以為自己要去創造新事物。

所以學習程式設計之前需要搞懂 —— 做創造性的工作;還是做模仿性的工作。

創造性的工作舉例:
詩歌創作、生物學研究、新車設計、設計一門程式語言、設計一個新的web容器。


模仿性的工作舉例:
朗讀英文詩歌、播音工作、程式設計一個APP、駕車、游泳、吉他彈唱、跳交際舞、雕刻小人、書法...

可以看到我們很大一部分事情,都是模仿型別的工作,模仿型別的工作時不需要從理論開始的,而是從練習開始的。比如學習游泳,沒有一個人是從看了一個月游泳的書籍開始的,而是教師在水下給你講,你去模仿他的動作,然後給你糾正。比如學習英語,就不說了,這麼多的人學習了十幾年還不能用,就是缺乏練習。

而學習程式設計,還是教程式設計,大部分也是模仿式的學習,模仿式的學習就要從練習開始,或者以練習為主的訓練開始,不然很可能浪費了大量的時間而沒有看到成果而放棄。 (我們接觸到的程式設計學習者這樣的情況不在少數)

瞭解了這個道理,我們開展教學就容易多了,那就是本著一個原則 —— 一開始就模仿寫程式碼。

開始學習

本文後面的部分是講 —— 如何進行模仿性的python學習,如果上面你的目的是創造性的,可以不看了。

那麼我們就要開始做真正的學習了,以下我以我自己設計的教學流程作為參考,指導一個零基礎開始的教學過程。

從一個故事開始學習變數和判斷

首先我們從一個老媽買菜的故事開始,第一週學習的內容是學習變數,可以看下面一張圖,我們是如何教變數的,記住這個是第一天,第一天學習程式設計,就要開始寫程式碼,這是我的教學過程要堅持的。不管寫的多,寫的少,都要開始模仿開始寫。

需求是下圖這樣的:

enter image description here

我們來看程式碼

#!/usr/bin/python
# -*- coding: utf-8 -*-
# @author: Guoshushu

# For beginner
# 1\. variable - num,str,boolean
# 2\. if
# 3\. > < >= <= == 
# 4\. print
def main():
  who = 'xiao的老媽 '
  good_price = 6  #小販的價格
  good_description = "西雙版納大白菜" #小販的招牌

  is_cheap = False #是否便宜
  reasonable_price = 5 #老媽能接受的最高價格
  buy_amount = 2 #準備買 2 斤

  # 開始你的表演
  # go 我們來走一組
  print "%s上街看到了%s,賣 %d 元/斤" % (who, good_description, good_price)

  if good_price <= reasonable_price:
    print '她認為便宜'
    is_cheap = True
    print '她買了 %d 斤' % (buy_amount)
  else:
    print '她認為貴了 '
    is_cheap = False
    print '她並沒有買,揚長而去'

  #homework
  #1\. 看 day1-homework.py

# run function
if __name__ == '__main__':
  main()

看到了麼,這一段程式碼實現了我們的需求,而且完全是 自然語言編寫,普通人都可以看懂,我們教會了:

# For beginner
# 1\. variable - num,str,boolean
# 2\. if
# 3\. > < >= <= == 
# 4\. print

可以注意到一點,我沒有教大家學習 if __name__ = “__main__”:這些事什麼意思,而是讓大家開始模仿,大家都是成年人,都有悟性,不需要花費太多的時間去低效地學習理論,之後自然會明白。

上面這一段程式碼,看懂就可以了麼?

不,我會要求我的學員自己在電腦上打一遍,真正他們打了過後,就會發現其實看懂是沒有用的,因為他們會發生以下的問題。

  1. 跑程式碼前沒有儲存成.py的檔案;

  2. if之後的符號用了中文的:(冒號)。

  3. 縮排寫錯了報 indent error。

  4. True和False寫成了 true 和 false。

  5. name 寫成了 name

  6. 64位的系統裝成了32位python,雖然已經提醒過。

  7. 變數名字之間用了空格,報錯。 ....

這些問題,不去實際寫程式碼是發現不了的,但是好訊息是,發現了一次,之後就基本不會再犯錯了,所以我們說程式設計模仿練習的必要,以及程式設計中犯錯報bug的必要。

如何學習列表

這裡再舉一個學習列表的例子,我們來看下面的程式碼:

# -*- coding: utf-8 -*-
# @author: Guoshushu

def main():
  good1 = '大白菜'
  good2 = '空心菜'
  good3 = '花菜'
  good4 = '生薑'
  good5 = '小龍蝦'

  # ....... 省略掉 100 個
  good100 = '蚌殼'

  print '老媽看到了 %s '% (good1)
  print '老媽看到了 %s '% (good2)
  print '老媽看到了 %s '% (good3)
  print '老媽看到了 %s '% (good4)
  print '老媽看到了 %s '% (good5)

def main2():
  goods = '大白菜,空心菜,花菜,生薑,小龍蝦'
  print '老媽看到了 %s' %(goods)

def main3():
  print '-------'
  lst = ['大白菜', '空心菜', '花菜', '生薑', '小龍蝦'] #列表
  for lst_item in lst:  #遍歷
    print '老媽看到了 %s '% (lst_item)

if __name__ == '__main__':
  main()
  main2()
  main3()

相信大家已經看到了,這一段是說明列表為何要使用,學習的過程需要了解為什麼要用列表,那就是 變數不夠用了嘛。

我們看上述3個函式就能夠明白,列表這個資料結構的演變過程,其實就是變數不夠用了,要用一個更牛逼的結構來一次放很多個資料,這樣理解起來會很自然。

相似的方法我用到了教授元祖、陣列等等方面,你要如何學? 我給你的建議就是,用起來,用起來。

所有的 3 周的學習的程式碼在我的github上,都可以自取,當然我不可能在一篇文章裡面全部講完,你可以去 github 下載我們的程式碼記錄,模仿。

本文以下附件內的github地址是我們 28 天的教學記錄和作業記錄,這個chat的同學可以試著開始寫,不過不好意思不能提供視訊教程。

一個月的碎片時間學習後,我們的學員可以完成以下的作業:

enter image description here

你可以在這一週用github的程式碼自學下,在chat裡我們討論這個。

教學的體會

最好的心態是不斷犯錯、不怕犯錯

我們的教育告訴我們,不要犯錯,犯錯是不好的,但是程式設計中,我們寫出了一個bug,編譯器給我們報錯了,那麼就是一個學習的機會。

看到報錯的時候心態就是 —— 我又有了一次學習的機會。而不是 —— 媽的如何又報錯了。這是程式設計時候面對報錯的太多。

道理我都講完了,同時你可以跟著我的github程式碼進行學習模仿,最重要的當然是堅持,但是我傾向於寫成 —— 用正確的方法堅持學習。就能很輕鬆學會。如果你是想要教程式設計老師,請一點要用模仿的方式教別人,不然會誤人誤己,切記。有任何問題,可以在我的chat中討論。

碎碎念

我前面提到過,其中有大部分的程式設計學員都是女同學,我發現她們的學習能力也是超強的,一個月的時間,而且幾乎都是每天 1 小時左右的時間,就可以在引導下基本掌握程式設計的基礎知識,很了不起。

社群的力量還是非常之大的,一開始學習,配置環境、寫第一行程式碼的時候,群裡的同學也是雞飛狗跳的,我真是感慨自己有勇氣開一個線上的教學生動手的程式設計課程,要知道,一般為了省事,大家都是採用錄視訊講一個看似非常詳細的課程,來規避這個麻煩。

不過實踐下來,這個效果的確最好,我們可以在chat裡面聊一聊,我也會請我的學員來分享自己的學習經歷。

資源

原文

相關文章