作者自我介紹:大爽歌, b站小UP主 ,直播編程+紅警三 ,python1對1輔導(dǎo)老師 。
學(xué)編程,到底是在學(xué)什么?
一是語法。
二是思想。
語法這個好理解,每一門語言都有自己的一套語法。
很多語言的語法其實(shí)并不是很難。
比如python的語法就是很簡單的。
但是很多人還是會覺得學(xué)編程很難。
那么難在哪里,難的是思想。
什么是思想?
什么是思想?
思想是一個無比廣博的概念。
無所不包,無邊無涯,無法用言語去描述它完整的樣子。
但是,在具體的場景中,在具體的問題中,
針對這一場景或問題的思想,是可以被我們詳細(xì)感知到,觀察到的。
即只有結(jié)合具體的問題,才能具體的去描述出來。
1 學(xué)習(xí)精神
比如把思想狹義的理解為:學(xué)習(xí)編程需要的精神
那么此時我認(rèn)為編程的思想就是要不斷地摸索,嘗試,觀察與思考。
事實(shí)上,我不僅用這一思想去學(xué)習(xí)編程,我也用這一思想去規(guī)劃我的人生。
2 解決問題的邏輯
如果把思想狹義的理解為:解決問題的邏輯
那么此時思想可以近似理解為廣義的算法。
為什么我這里描述其為廣義的算法,
因?yàn)槔碚撋现v,任何一串能在有限的時間及空間內(nèi)運(yùn)行完的代碼,
都可以認(rèn)為表達(dá)了一種算法。
而很多時候,一些編程問題,并沒有用到什么經(jīng)典的算法思想,
只是根據(jù)問題的業(yè)務(wù)需要組織的代碼。
當(dāng)業(yè)務(wù)簡單時,代碼很簡潔,業(yè)務(wù)繁瑣時,代碼很繁瑣。
編寫這樣的代碼往往并不是很難,只是需要跟著業(yè)務(wù)去一步一步地編寫代碼。
從大眾的習(xí)慣上來講,把這里面的邏輯稱為業(yè)務(wù)邏輯可能更合適。
而狹義的算法邏輯則是以CLRS(算法導(dǎo)論)為代表的經(jīng)典算法及其衍生。
比如很多學(xué)生刷算法題往往就是刷的后者。
很多開發(fā)的工作,處理的往往則是前者,比如根據(jù)各種需求去實(shí)現(xiàn)數(shù)據(jù)庫的增刪查改。
所以廣義的算法可以分為:
- 業(yè)務(wù)邏輯
- (狹義的)算法邏輯
根據(jù)這個分法,這里可以簡單的說一個題外話:
對于編程新手,掌握一個語言的基礎(chǔ)語法后,
可能會面臨兩個選擇:
- 做開發(fā)項(xiàng)目,比如實(shí)現(xiàn)一個小游戲,編寫一個爬蟲,開發(fā)一個網(wǎng)站。
- 刷算法題,比如去leetcode刷題。
我個人當(dāng)時的選擇是1,同時我個人也更傾向于推薦新人先選1。
當(dāng)然這只是一家之言,每個人的情況不同,照搬未必合適。
比如要是準(zhǔn)備校招的學(xué)生,可能選擇2更好。
3 組織代碼的方法
如果把思想狹義的理解為:組織代碼的思維
個人把此時的思想描述為編程思維:
應(yīng)該怎么去組織我們的代碼,
或者說,在什么時候應(yīng)該用什么語法。
這往往需要我們能夠去理解,語法本身所承載的思想。
這里簡單嘗試下,不結(jié)合具體的代碼去思考。
未來也會專門出一篇文章,嘗試結(jié)合具體的代碼去分析(以具體的代碼為例子,去展示我個人對編程思維的理解)。
-
循環(huán)
比如當(dāng)我們需要重復(fù)做某件事時,那么往往需要使用循環(huán)。
兩種循環(huán)分別對應(yīng)兩種重復(fù)方式:
1 - 重復(fù)固定次數(shù): for
2 - 按條件重復(fù): while, 滿足某種條件就一直重復(fù),不滿足則退出
記錄零散無關(guān)聯(lián)的信息(數(shù)據(jù)),我們可以用單個變量去分別記錄。
而若要記錄有關(guān)聯(lián)的多個信息,我們則往往需要容器。
-
容器
什么是容器呢,
簡單的理解,能存放多個變量的。
以python為例,容器有 - 元組 tuple,
- 列表 list,
- 字典 dict
不同的數(shù)據(jù)關(guān)系,則要選擇不同的容器。
比如這些數(shù)據(jù)都是同一類數(shù)據(jù),比如一堆人的名字,那么此時適合選擇列表作為容器。
比如這些數(shù)據(jù)是兩三個一組固定的,那么往往選擇元組作為一個組的容器。
比如這些數(shù)據(jù)存在一一對應(yīng)關(guān)系,那么此時適合選擇字典作為容器。
-
函數(shù)
如果有一連串代碼,在多個地方都要用到。
那么最好把這串代碼放到一個函數(shù)里面。
在需要用到的地方去調(diào)用。
這樣可以降低代碼重復(fù),且方便統(tǒng)一修改。
不僅如此,函數(shù)還可以用于去組織代碼,將代碼按功能分類,使代碼有結(jié)構(gòu)層次感,也方便理解和思考。