Python以語法簡單、關鍵字少著稱,因此經常被各大媒體忽悠其是一門非常容易入門的程式語言。他的特定描述自然不言而喻,但其是否容易入門卻飽受爭議。因為每個人的基礎都不一樣。
市面上大部分的 Python 入門書籍的目錄都非常長(畢竟缺少某個重要的知識點會被批),但是作為入門來說,真的需要所有的知識點都學習一遍嗎?
對於入門者來說,看著這些書籍目錄學習往往會遇到各種陷阱,今天我就來分享一下我的個人觀點。
語法太多了Python 的語法規則多不多?其實非常多,如果你學習過一些古老不再更新的程式語言,對比下來你就會發現其實 Python 語法非常多。
因為 Python 需要適應現代的開發要求,他"逼不得已"需要不斷加入新的語法特性,比如像"裝飾器"、"海象運算子"等等。
此時初學者會陷入第一個陷阱——抵受不住"目錄"的誘惑,感覺自己跳過了某個知識點就會無法入門。
作為入門者我是不建議學習這些東西(短期內你大機率用不上)。
那麼,到底需要學習哪些語法?
分支判斷迴圈說白了就是 if 和 for 迴圈。
其實,學習這些語法不是要你去記憶怎麼寫,大部分時候這些語法語句不需要我們親手敲出每個字母,因為現在的 ide 都非常友好,一般都能提供生成程式碼段的功能,如下是 vscode 的演示:
經常看到有人建議入門要親手輸入每段程式碼,大家一定要三思,這隻能提升你鍵盤打字水平
有段時間我經常需要來回切換多種程式語言,但並不考驗我的語法記憶水平,這就是程式碼段的好處
小夥伴:"那其他的語法規則呢,比如運算子優先級別這些,我總是記不住怎麼辦?"
其實我也從來沒有去記憶啥運算子優先級別,因為在出現多種運算子時,我總是使用括號明確他們的優先級別:
小夥伴:"這樣子看起來,好像很容易入門,if 和 for 語法真的這麼容易學習?"
並不是,像 if 語法的學習重點不是怎麼寫,而是怎麼構造 bool 值,這就需要你進一步瞭解基本的資料型別(str、int、bool這些)。
幸好這些知識點的數量非常少,對於入門來說也不需要深入瞭解每個型別的儲存機制(比如需要多少個位元組)
以上這些知識點可能只是一本入門書籍中的1到3個章節的內容
序列的處理非常重要當你基本瞭解 if 和 for 的使用後,下一步就要了解序列的資料結構(列表、元組)。
此時,初學者會陷入另一個坑——列表有許多方法需要記憶!
同樣地,我也不推薦入門者記憶這些方法,只需要記住最常用的1、2個操作即可。比如:
新增元素:append移除元素:remove同理,字串也有許多處理方法,通常我們只需要學習少量幾個方法即可
小夥伴:"?!,就這樣子?"
事實上,後期你可能連上述2個操作都很少用上。因為在 Python 中更傾向於構造新的序列,而非對序列原地操作。
當你後期學會了推導式之後,你就會發現用得最多的語法就是 if 和 for
你可能疑惑,為什麼序列的處理很重要?
不管你學習什麼的程式語言,不管你是應用開發還是普通的辦公自動化學習,真正複雜的邏輯大部分來自於序列的處理。
比如一堆檔案、每個檔案中又會有一堆的資料。
而簡單的單個數據,往往操作也是非常直白簡單。
字典要不要在這個階段學習?我建議是可以嘗試瞭解,如果發現自己不能理解,那就跳過。因為後期總會有他的應用場景,那時候結合場景學習會更加輕鬆
學習分解問題的思維經過上面2個階段的學習,你會發現自己充其量只能解決小學加減乘除的簡單問題,稍微複雜一點的問題你就毫無頭緒。
此時你就陷入了另一個陷阱——一邊思考邏輯一邊寫程式碼
多數入門書籍都不會教你這一點,因為這不是 Python 的特性,但他極其重要。
程式設計的本質是把現實邏輯用程式碼表達出來
而現實中,我們要完成一件比較複雜的事情時,都是先考慮整體流程,劃分出多個子流程,最後才針對每個子流程考慮細節。
我的文章少不了案例。
考慮以下的現實場景:你希望從你家裡書架上(有100多本)找出某作者的書。
你可能覺得這個事情非常簡單,不就是從頭開始,每本書都看看作者名字,符合就拿出來?
這個思考過程實際就是從整體到細節的過程:
首先,你會考慮從哪裡開始找,總有個搜尋方向。比如從書架左上角橫向掃過每一行的書其次,在沒有開始找之前,你就決定找出一本書後,看封面的作者名字最後,符合條件要拿出來,與原來的書區別開來注意上述每一點的思考都是在你開始操作之前就決定的,這就是整體到細節的考慮。
你不會隨手拿起一本書,然後才想到底怎麼找作者名字?找到又要不要拿出來?這是非常反人類直覺的做法。
而 Python 初學者卻經常使用這種反人類直覺程式設計——寫到哪,想到哪
現在換成 Python 問題。
一個資料夾下有許多文字檔案,每個檔案相當於一本書,裡面有書名、作者名字等資訊:
下面是一個反直覺的寫法。本文最後會給出自定義函式的做法,你能明顯感受到2種寫法的思維區別。
第一步:怎麼能保證取出每一個檔案,沒有遺漏也不會重複取出?
經過網上搜索"python 資料夾檔案",可以找到多種方式,我就隨手用其中一種:
import osfor file in os.listdir(r'目標資料夾路徑'): # file 就是每個檔案的路徑 pass
第二步:有一個檔案路徑,怎麼讀取裡面的內容?
網上搜索"python 讀取檔案",找到:
with open('檔案路徑(記得帶字尾)', 'r') as f: lines = f.readlines() # lines 是一個列表,每個元素就是檔案中的一行內容
這一步其實是第一步裡面的後續操作,於是:
import osfor file in os.listdir(r'目標資料夾路徑'): # file 就是每個檔案的路徑 with open(file, 'r') as f: lines = f.readlines()
第三步:檔案中作者行內容是有"作者:"字首,給你這一行,怎麼提出裡面的作者名字?
這是普通字串操作:
於是,現在程式碼成這樣(順手把書名也取出):
import osfor file in os.listdir(r'目標資料夾路徑'): with open(file, 'r') as f: lines = f.readlines() # 第三步 book = lines[0].split(':')[1] author = lines[1].split(':')[1]
第四步:判斷書名是不是我們要找的,符合要取出來
這就用上 if 判斷和基本的序列操作:
import os# 第四步results = []target = '小明'for file in os.listdir(r'目標資料夾路徑'): with open(file, 'r') as f: lines = f.readlines() book = lines[0].split(':')[1] author = lines[1].split(':')[1] # 第四步 if target==author : results.append(book)
現在,results 這個列表就是結果了
程式碼看似簡單,但是,假如現在儲存書籍的不再是文字檔案,而是一個 Excel,你能一下子知道修改哪個地方嗎?
初學者往往就在這種細節中受到挫折。明明我看懂別人寫的,但是解決自己問題時卻懵逼了
這是因為,Python 中有一個知識點能完美匹配"整體到細節"的過程!但初學者一般不怎麼會用
一定要學習自定義函式為什麼程式語言基本都有自定義函式的特性?因為這符合我們解決問題的思維邏輯。
仍然解決前面的問題:
# 第一步:從書架上取出書def get_file_paths(folder): pass# 第二步:看封面,得知書名與作者def get_book_message(file): pass return book,author# 第三步:看看是否符合def match(author): return author=='小明'
怎麼感覺少了最後一步,"取出符合條件的書"?
看看整體呼叫:
results=[]for file in get_file_paths(r'目標資料夾路徑'): book,author = get_book_message(file) if match(author): results.append(book)
"取出符合條件的書" 的邏輯包含在整體過程中
接下來,就是逐一實現每個自定義函式就可以。解決的思路與之前反直覺一樣。
但是怎麼感覺現在程式碼量比之前更多了?
的確如此,但是,如果現在資訊儲存在 excel 中,你就能馬上知道在哪個函式修改,並且修改的負擔變少了很多
為什麼?
因為函式定義帶有約束,看看上面 get_book_message 的函式定義,必需傳入一個檔案路徑,必需返回元組(書名,作者)。
而整體流程和其他的每一步的函式是不管你怎麼從一個檔案路徑得到這個元組,過程不重要,結果最重要
怎樣進階上面的總結(針對入門):
語法學習簡單為主(if、for)基本序列要了解(列表、元組),但其物件操作方法不用特意記憶學會分解問題的思維學會自定義函式實際上,點3才是最重要,其他點只是為他服務
因此,Python 的進階仍然是圍繞點3而展開。
比如,前面的例子中,整體流程程式碼中仍然包含了 "取出符合條件的書" 的邏輯,這其實不太合理。那麼此時你就學習新的語法知識點,讓你能簡化整體流程程式碼。
這可能需要你學習:
lambda高階函式的定義(專有名詞很嚇人,實際就是能把邏輯傳遞給函式引數)又比如:
# 第二步:看封面,得知書名與作者def get_book_message(file): pass return book,author
這個函式只是返回書名和作者名,如果還有其他的資訊,那麼整體流程的程式碼也很麻煩。
此時,你就需要學習面向物件的知識:比如定義類(其實用命名元組也行)
我認為一切按自己的實際需求出發選擇性學習是最好的,因為有使用場景學起來最輕鬆。