新聞中心
Python以語(yǔ)法簡(jiǎn)單、關(guān)鍵字少著稱,因此經(jīng)常被各大媒體忽悠其是一門非常容易入門的編程語(yǔ)言。他的特定描述自然不言而喻,但其是否容易入門卻飽受爭(zhēng)議。因?yàn)槊總€(gè)人的基礎(chǔ)都不一樣。

市面上大部分的 Python 入門書籍的目錄都非常長(zhǎng)(畢竟缺少某個(gè)重要的知識(shí)點(diǎn)會(huì)被批),但是作為入門來(lái)說(shuō),真的需要所有的知識(shí)點(diǎn)都學(xué)習(xí)一遍嗎?
對(duì)于入門者來(lái)說(shuō),看著這些書籍目錄學(xué)習(xí)往往會(huì)遇到各種陷阱,今天我就來(lái)分享一下我的個(gè)人觀點(diǎn)。
語(yǔ)法太多了
Python 的語(yǔ)法規(guī)則多不多?其實(shí)非常多,如果你學(xué)習(xí)過(guò)一些古老不再更新的編程語(yǔ)言,對(duì)比下來(lái)你就會(huì)發(fā)現(xiàn)其實(shí) Python 語(yǔ)法非常多。
因?yàn)?Python 需要適應(yīng)現(xiàn)代的開(kāi)發(fā)要求,他"逼不得已"需要不斷加入新的語(yǔ)法特性,比如像"裝飾器"、"海象運(yùn)算符"等等。
此時(shí)初學(xué)者會(huì)陷入第一個(gè)陷阱——抵受不住"目錄"的誘惑,感覺(jué)自己跳過(guò)了某個(gè)知識(shí)點(diǎn)就會(huì)無(wú)法入門。
作為入門者我是不建議學(xué)習(xí)這些東西(短期內(nèi)你大概率用不上)。
那么,到底需要學(xué)習(xí)哪些語(yǔ)法?
- 分支判斷
- 循環(huán)
說(shuō)白了就是 if 和 for 循環(huán)。
其實(shí),學(xué)習(xí)這些語(yǔ)法不是要你去記憶怎么寫,大部分時(shí)候這些語(yǔ)法語(yǔ)句不需要我們親手敲出每個(gè)字母,因?yàn)楝F(xiàn)在的 ide 都非常友好,一般都能提供生成代碼段的功能,如下是 vscode 的演示:
經(jīng)常看到有人建議入門要親手輸入每段代碼,大家一定要三思,這只能提升你鍵盤打字水平
有段時(shí)間我經(jīng)常需要來(lái)回切換多種編程語(yǔ)言,但并不考驗(yàn)我的語(yǔ)法記憶水平,這就是代碼段的好處
小伙伴:"那其他的語(yǔ)法規(guī)則呢,比如運(yùn)算符優(yōu)先級(jí)別這些,我總是記不住怎么辦?"
其實(shí)我也從來(lái)沒(méi)有去記憶啥運(yùn)算符優(yōu)先級(jí)別,因?yàn)樵诔霈F(xiàn)多種運(yùn)算符時(shí),我總是使用括號(hào)明確他們的優(yōu)先級(jí)別:
小伙伴:"這樣子看起來(lái),好像很容易入門,if 和 for 語(yǔ)法真的這么容易學(xué)習(xí)?"
并不是,像 if 語(yǔ)法的學(xué)習(xí)重點(diǎn)不是怎么寫,而是怎么構(gòu)造 bool 值,這就需要你進(jìn)一步了解基本的數(shù)據(jù)類型(str、int、bool這些)。
幸好這些知識(shí)點(diǎn)的數(shù)量非常少,對(duì)于入門來(lái)說(shuō)也不需要深入了解每個(gè)類型的保存機(jī)制(比如需要多少個(gè)字節(jié))
以上這些知識(shí)點(diǎn)可能只是一本入門書籍中的1到3個(gè)章節(jié)的內(nèi)容
序列的處理非常重要
當(dāng)你基本了解 if 和 for 的使用后,下一步就要了解序列的數(shù)據(jù)結(jié)構(gòu)(列表、元組)。
此時(shí),初學(xué)者會(huì)陷入另一個(gè)坑——列表有許多方法需要記憶!
同樣地,我也不推薦入門者記憶這些方法,只需要記住最常用的1、2個(gè)操作即可。比如:
- 添加元素:append
- 移除元素:remove
同理,字符串也有許多處理方法,通常我們只需要學(xué)習(xí)少量幾個(gè)方法即可
小伙伴:"?!,就這樣子?"
事實(shí)上,后期你可能連上述2個(gè)操作都很少用上。因?yàn)樵?Python 中更傾向于構(gòu)造新的序列,而非對(duì)序列原地操作。
當(dāng)你后期學(xué)會(huì)了推導(dǎo)式之后,你就會(huì)發(fā)現(xiàn)用得最多的語(yǔ)法就是 if 和 for
你可能疑惑,為什么序列的處理很重要?
不管你學(xué)習(xí)什么的編程語(yǔ)言,不管你是應(yīng)用開(kāi)發(fā)還是普通的辦公自動(dòng)化學(xué)習(xí),真正復(fù)雜的邏輯大部分來(lái)自于序列的處理。
比如一堆文件、每個(gè)文件中又會(huì)有一堆的數(shù)據(jù)。
而簡(jiǎn)單的單個(gè)數(shù)據(jù),往往操作也是非常直白簡(jiǎn)單。
字典要不要在這個(gè)階段學(xué)習(xí)?我建議是可以嘗試了解,如果發(fā)現(xiàn)自己不能理解,那就跳過(guò)。因?yàn)楹笃诳倳?huì)有他的應(yīng)用場(chǎng)景,那時(shí)候結(jié)合場(chǎng)景學(xué)習(xí)會(huì)更加輕松
學(xué)習(xí)分解問(wèn)題的思維
經(jīng)過(guò)上面2個(gè)階段的學(xué)習(xí),你會(huì)發(fā)現(xiàn)自己充其量只能解決小學(xué)加減乘除的簡(jiǎn)單問(wèn)題,稍微復(fù)雜一點(diǎn)的問(wèn)題你就毫無(wú)頭緒。
此時(shí)你就陷入了另一個(gè)陷阱——一邊思考邏輯一邊寫代碼
多數(shù)入門書籍都不會(huì)教你這一點(diǎn),因?yàn)檫@不是 Python 的特性,但他極其重要。
編程的本質(zhì)是把現(xiàn)實(shí)邏輯用代碼表達(dá)出來(lái)
而現(xiàn)實(shí)中,我們要完成一件比較復(fù)雜的事情時(shí),都是先考慮整體流程,劃分出多個(gè)子流程,最后才針對(duì)每個(gè)子流程考慮細(xì)節(jié)。
我的文章少不了案例。
考慮以下的現(xiàn)實(shí)場(chǎng)景:你希望從你家里書架上(有100多本)找出某作者的書。
你可能覺(jué)得這個(gè)事情非常簡(jiǎn)單,不就是從頭開(kāi)始,每本書都看看作者名字,符合就拿出來(lái)?
這個(gè)思考過(guò)程實(shí)際就是從整體到細(xì)節(jié)的過(guò)程:
- 首先,你會(huì)考慮從哪里開(kāi)始找,總有個(gè)搜索方向。比如從書架左上角橫向掃過(guò)每一行的書
- 其次,在沒(méi)有開(kāi)始找之前,你就決定找出一本書后,看封面的作者名字
- 最后,符合條件要拿出來(lái),與原來(lái)的書區(qū)別開(kāi)來(lái)
注意上述每一點(diǎn)的思考都是在你開(kāi)始操作之前就決定的,這就是整體到細(xì)節(jié)的考慮。
你不會(huì)隨手拿起一本書,然后才想到底怎么找作者名字?找到又要不要拿出來(lái)?這是非常反人類直覺(jué)的做法。
而 Python 初學(xué)者卻經(jīng)常使用這種反人類直覺(jué)編程——寫到哪,想到哪
現(xiàn)在換成 Python 問(wèn)題。
一個(gè)文件夾下有許多文本文件,每個(gè)文件相當(dāng)于一本書,里面有書名、作者名字等信息:
下面是一個(gè)反直覺(jué)的寫法。本文最后會(huì)給出自定義函數(shù)的做法,你能明顯感受到2種寫法的思維區(qū)別。
第一步:怎么能保證取出每一個(gè)文件,沒(méi)有遺漏也不會(huì)重復(fù)取出?
經(jīng)過(guò)網(wǎng)上搜索"python 文件夾文件",可以找到多種方式,我就隨手用其中一種:
- import os
- for file in os.listdir(r'目標(biāo)文件夾路徑'):
- # file 就是每個(gè)文件的路徑
- pass
第二步:有一個(gè)文件路徑,怎么讀取里面的內(nèi)容?
網(wǎng)上搜索"python 讀取文件",找到:
- with open('文件路徑(記得帶后綴)', 'r') as f:
- lines = f.readlines()
- # lines 是一個(gè)列表,每個(gè)元素就是文件中的一行內(nèi)容
這一步其實(shí)是第一步里面的后續(xù)操作,于是:
- import os
- for file in os.listdir(r'目標(biāo)文件夾路徑'):
- # file 就是每個(gè)文件的路徑
- with open(file, 'r') as f:
- lines = f.readlines()
第三步:文件中作者行內(nèi)容是有"作者:"前綴,給你這一行,怎么提出里面的作者名字?
這是普通字符串操作:
- '作者:小明'.split(':')[1]
這應(yīng)該是入門必需學(xué)會(huì)的方法,當(dāng)然你也可以網(wǎng)上搜索"python 字符串分割"
于是,現(xiàn)在代碼成這樣(順手把書名也取出):
- import os
- for file in os.listdir(r'目標(biāo)文件夾路徑'):
- with open(file, 'r') as f:
- lines = f.readlines()
- # 第三步
- book = lines[0].split(':')[1]
- author = lines[1].split(':')[1]
第四步:判斷書名是不是我們要找的,符合要取出來(lái)
這就用上 if 判斷和基本的序列操作:
- import os
- # 第四步
- results = []
- target = '小明'
- for file in os.listdir(r'目標(biāo)文件夾路徑'):
- 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)
現(xiàn)在,results 這個(gè)列表就是結(jié)果了
代碼看似簡(jiǎn)單,但是,假如現(xiàn)在儲(chǔ)存書籍的不再是文本文件,而是一個(gè) Excel,你能一下子知道修改哪個(gè)地方嗎?
初學(xué)者往往就在這種細(xì)節(jié)中受到挫折。明明我看懂別人寫的,但是解決自己?jiǎn)栴}時(shí)卻懵逼了
這是因?yàn)?,Python 中有一個(gè)知識(shí)點(diǎn)能完美匹配"整體到細(xì)節(jié)"的過(guò)程!但初學(xué)者一般不怎么會(huì)用
一定要學(xué)習(xí)自定義函數(shù)
為什么編程語(yǔ)言基本都有自定義函數(shù)的特性?因?yàn)檫@符合我們解決問(wèn)題的思維邏輯。
仍然解決前面的問(wèn)題:
- # 第一步:從書架上取出書
- def get_file_paths(folder):
- pass
- # 第二步:看封面,得知書名與作者
- def get_book_message(file):
- pass
- return book,author
- # 第三步:看看是否符合
- def match(author):
- return author=='小明'
怎么感覺(jué)少了最后一步,"取出符合條件的書"?
看看整體調(diào)用:
- results=[]
- for file in get_file_paths(r'目標(biāo)文件夾路徑'):
- book,author = get_book_message(file)
- if match(author):
- results.append(book)
- "取出符合條件的書" 的邏輯包含在整體過(guò)程中
接下來(lái),就是逐一實(shí)現(xiàn)每個(gè)自定義函數(shù)就可以。解決的思路與之前反直覺(jué)一樣。
但是怎么感覺(jué)現(xiàn)在代碼量比之前更多了?
的確如此,但是,如果現(xiàn)在信息保存在 excel 中,你就能馬上知道在哪個(gè)函數(shù)修改,并且修改的負(fù)擔(dān)變少了很多
為什么?
因?yàn)楹瘮?shù)定義帶有約束,看看上面 get_book_message 的函數(shù)定義,必需傳入一個(gè)文件路徑,必需返回元組(書名,作者)。
而整體流程和其他的每一步的函數(shù)是不管你怎么從一個(gè)文件路徑得到這個(gè)元組,過(guò)程不重要,結(jié)果最重要
怎樣進(jìn)階
上面的總結(jié)(針對(duì)入門):
- 語(yǔ)法學(xué)習(xí)簡(jiǎn)單為主(if、for)
- 基本序列要了解(列表、元組),但其對(duì)象操作方法不用特意記憶
- 學(xué)會(huì)分解問(wèn)題的思維
- 學(xué)會(huì)自定義函數(shù)
實(shí)際上,點(diǎn)3才是最重要,其他點(diǎn)只是為他服務(wù)
因此,Python 的進(jìn)階仍然是圍繞點(diǎn)3而展開(kāi)。
比如,前面的例子中,整體流程代碼中仍然包含了 "取出符合條件的書" 的邏輯,這其實(shí)不太合理。那么此時(shí)你就學(xué)習(xí)新的語(yǔ)法知識(shí)點(diǎn),讓你能簡(jiǎn)化整體流程代碼。
這可能需要你學(xué)習(xí):
- lambda
- 高階函數(shù)的定義(專有名詞很嚇人,實(shí)際就是能把邏輯傳遞給函數(shù)參數(shù))
又比如:
- # 第二步:看封面,得知書名與作者
- def get_book_message(file):
- pass
- return book,author
這個(gè)函數(shù)只是返回書名和作者名,如果還有其他的信息,那么整體流程的代碼也很麻煩。
此時(shí),你就需要學(xué)習(xí)面向?qū)ο蟮闹R(shí):比如定義類(其實(shí)用命名元組也行)
我認(rèn)為一切按自己的實(shí)際需求出發(fā)選擇性學(xué)習(xí)是最好的,因?yàn)橛惺褂脠?chǎng)景學(xué)起來(lái)最輕松。
網(wǎng)站標(biāo)題:為什么你總是學(xué)不會(huì)Python,入門Python的4大陷阱
鏈接分享:http://www.5511xx.com/article/dphcdge.html


咨詢
建站咨詢
