敲黑板:
1:文字多建議用PC版看。
2:內容過於硬核真實,耐心看完都是好漢。
4:給個關注,你點亮的是星星之火。
一 程式設計師一半以上的工作時間,都在想著兩個問題?假如你已經是一個大公司的程式設計師了,你到了崗位,為自己衝了一杯苦咖啡提神,然後開啟自己新款的macbook pro,點開自己的任務郵件,彈出了下面這些任務。
1)需要一個可以根據使用者年齡來自動把使用者劃分、分類的功能。
2)使用者註冊的時候需要對他的身份證、照片資訊進行實名認證。
3)有使用者買下訂單的時候、售後組的同事會收到下單通知。
4)在炒股的時候,程式可以根據金叉、死叉、MCAD等技術指標給操盤手提供交易訊號。
5)程式透過機器學習方法、總結出10000個心臟病人的心電圖的一些規律,然後將這種規律用於快速診斷病人的心電圖資料。或者預警操作等。
6)根據使用者的心情、改變智慧家居里的燈光環境。
上面的這些問題從小到大、從易到難、從具體到抽象、跨越了很多個領域。但有意思的是,無論這樣的問題多麼的奇怪,作為一個受到過專業訓練、有著豐富經驗的程式設計師,你會從下面這兩個問題“尋找”到這些問題的解決方案:
1)我要如何利用程式語言,來儲存、組織、構建這些問題的關鍵資訊?
2)這些資訊我儲存好了,我要如何用程式語言來操作它們?
這兩個問題我們把它叫做“導火線”問題、它不僅僅是開發人員順藤摸瓜,找到關鍵解決方案的問題。也是所有程式語言的研發者,各種各樣開發類庫(工具包)的作者思考的問題。
各位小夥伴們,這篇分享看完後,可以回過頭來嘗試構思一下上面這六個問題。
所以對於我們去學習一門開發語言,帶著如何儲存資訊、如何操作資訊這兩個問題去思考,去探索,學習起來也不會那麼“莫名其妙”了。
二 是不是所有的程式語言,都有這些語法?是的。
所以說掌握這些基礎的語法邏輯,對於學習程式設計和分析需求問題有很大的幫助。現在我們就來看看圍繞兩個“導火線”的語法吧。
三 第一個問題,日常生活中的資訊,要怎麼樣透過程式語言儲存到計算機裡變數的概念"變數,就是計算機程式語言用於放置資訊的盒子”。
這句話不記得是出自哪裡,但它是我見過對變數描述最精準的,大多數開發人員能理解到這個層面就足夠了。
我們來看一下這段Python程式碼,它展示了Python是如何裡面用變數儲存資訊的。
這裡先提前和大家介紹一下Python語言裡的 “=” 這個符號是什麼意思。
它不是等於的意思,它是一個Python操作資訊的一個符號,叫做 賦值 操作。
意思就是把“=”符號右邊的資訊儲存到左邊的變數裡面。大部分程式語言都是用“=”這個符號來代表 賦值 操作。
這段程式碼前六行就是透過賦值操作,把我們最基本的資訊儲存到變數裡。
為了更好的管理現實中的資訊,幾乎所有的程式語言,都會把這些基本的資訊型別歸納為下面幾類:
【符號資訊】
這是所有資訊型別的根基,其實我們大腦就是一臺非常厲害的符號處理機器。比如 + 號,比如H這個字母等。在Python裡,我們可以用雙引號把符號資訊括起來,代表這是一個符號資訊。比如:
“+”
“h”
【字串資訊】
字串資訊就是由若干個字元資訊組成的,比如人的名字、一篇文章、一段程式碼等等。在Python裡我們可以這樣來表示字串資訊。
“Hello Word”
“I love you”
字串資訊是在軟體開發裡用的最多的一種資訊型別。
【整數型別資訊】
這裡的整數型別和我們數學課程裡的整數概念是一樣的,用於計數的。比如年齡、少數民族的數量、你有幾個未接來電等等。
在C語言,C++這樣有一定年頭的語言,會把整數型別又劃分為,整數、長整數等型別。這樣做的目的是讓經驗豐富的程式設計師能更好的挖掘程式的效能(在C語裡,整數的計算速度比長整型快一些,長整形能儲存更大的數字)。
但是在Python裡面把這些概念弱化了,對於Python程式設計師來說,只要知道整形型別就可以了。這也是為什麼Python要比像C++,Java這些語言學習起來要輕鬆一些。
【浮點數資訊】
浮點數就是用來記錄帶有小數點的數字的,比如你的身高、你的血壓等。浮點數在C++,C這類語言裡,也被劃分成很多子型別。在Python裡面我們只要記住,帶小數點的數字,就是浮點數資訊型別。
【布林資訊】
布林資訊(Boole)是用來判斷對錯的,所以它只有兩種狀態,是,或否。它是一個很有用的資訊型別,後面講到選擇結構語法時,布林資訊就是重點。
舉一個具體的例子,我們要比較一個人的實際照片和身份證上的照片是否匹配。如果匹配我們就會得到一個布林資訊:True,反之亦然。
資訊型別有很多種,上面五種無論是Python還是JAVA都可以很好的處理,也有一些特殊的資訊分類只在特定的程式語言裡才有。其實只要掌握好這五種資訊型別,學習、生活、工作就夠用了。
在Python裡,關於給變數定性的問題,還有一個小規則。如果我們把一個字串資訊放到一個變數裡,這個變數就叫做字串變數。
這裡出一個小小的題目:透過這些知識,你是否能透過剛才那段程式碼,來判斷上面的變數是什麼樣的型別嗎?
如何給變數取名字?
name = “you name”
小白第一次看到上面這段程式碼時,會有一個疑問。name這個變數儲存的是一個名字,那麼是不是這樣的變數只能叫name ?
其實這個name也可以叫做mingzi,或者xkfudjw等等。只要能讓大家理解這個變數是用來放置“名字資訊”的就可以。也就是說變數自己的名字,可以隨意取,只要不是程式語言裡內建的變數名就可以了。
當然作為一個負責任的程式設計師,變數的命名是有講究的,這裡面的講究,不亞於給人取名字。
2 資料結構的概念資訊除了我們能看得見,聽得到的內容外,還有一個重要概念非常重要。我們來看一下這個例子。
比如“小嶽嶽”、“于謙”、“孫悅”、“郭德綱”,這四個字串。我們很自然知道它是著名相聲演員的名字,他們都來自於德雲社。
計算機知道它們是字串,但不知道它們之間的關係。為了告訴計算機,這四個人都是德雲社的人,在編寫程式碼時,會建立一個列表,然後把這四個人的名字放到列表裡面。這個列表就叫做“德雲社”。
看下面的程式碼。
解決資料(變數)之間關係的儲存和計算,就需要資料結構這個概念來幫忙。德雲社這個例子用的是列表資料結構。
通訊錄、員工列表、客戶清單、救援資訊等等都可以使用列表這樣的資料結構來組織資訊。
當然資料結構有很多種,除了列表還有
1)陣列
2)字典
3)元祖
4)集合
這些都是Python裡面比較常用的。在其他程式語言裡面,還有更多的資料結構。資料結構是一種非常強大的工具,配合上變數的概念,那麼基本上可以把我們能想到的資訊,用程式語言組織起來。
比如下面的例子,這個例子除了用到列表資料結構,還用到了字典資料結構。大家能猜出來下面這段程式碼組織了什麼樣的資訊嗎?
自己親自敲敲程式碼,更有趣
其中 team_xxxx 這個變數使用字典這種資料結構,把OMG 團隊成員的的資訊記錄了下來。然後在用列表這種資料結構,把隊員資訊儲存在OMG裡。最後兩行的print就是把OMG的資訊列印到螢幕上。
在用Python解決實際問題時,列表、字典這兩種資料結構基本上就夠用了。關於列表、字典更多的概念和知識、還有使用例子,下一篇章帶大家好好體驗。
假如我們想用上面的方法來記錄另外一個戰隊的資訊,只要按照上面的套路來敲程式碼就好了。但作為一個程式設計師,我們有更秒的方法。
3 類的概念類這個概念在很多程式語言書籍裡面算是比較靠後的知識點,但我覺得一開始就有必要讓大家接觸它,因為在目前流行的程式語言裡、實際工作中、第三方庫的使用等都繞不開這個概念。
那到底什麼是類呢?我們先來思考一下這個問題。
假如現在你的老闆,讓你在明天下午下班前,做一份公司新產品PPT,要求高大尚、色彩絢麗、不少於60頁。當你接到這個任務時,你會怎麼做呢?
如果是我,我們會去下載PPT模板,藉助它來快速做我們自己的PPT。類這個概念就和PPT模板這個概念是一樣的,它們都有如下特點。
1)提前組織好資料的結構。
2)要用的時候,可以快速填充資料,快速使用。
類除了能組織好資料結構外,還可以把操作資料的方法(操作資料的動作)組織起來,這個在後面會為大家介紹。
我們先來看一下,如何使用類這個概念,來改進英雄聯盟戰隊資訊的組織方式。
第53行Python程式碼,意思是我們建立了一個類(模板),叫做LolTeam。“:”後面換行的意思就是描述了這類的結構。
(友情提示:現在看不懂沒關係,看個大概就好,後面會有專項練習)。
描述完後,就要考慮如何使用它?
從第74行程式碼,和82行程式碼可以看出來。OMG戰隊和IG戰隊都使用了LolTeam這個模板。
換句話說。在軟體開發領域,我們會把IG、OMG這兩個變數,叫做LolTeam這個類的例項。
有了這類,我們就可以建立若干這樣的實力。
我們來小小的總結一下:
在軟體開發領域,類還有很多的概念和用法、比如類的繼承、類的派生、私有類、公有類等等。這些內容會在後面再為大家分享。
知道了透過程式語言變數的概念來儲存資訊,下一步就是要知道該如何操作它。
三 第二個問題,如何讓計算機操作這些資訊?1 資訊的基本運算說到操作資訊,沒有比我們人類還厲害的了。我們可以回想一下這樣的場景,我們拿著話筒,看著顯示器上出現歌詞提示,根據自己腦海裡的音調與顯示器上的歌詞進行合成,然後透過嘴巴把聲音輸出出來,這應該是我們每個人都經歷過的事情。
計算機程式語言處理資訊的方法,和我們在KTV唱歌時,腦袋處理歌詞的情況一樣,都是透過一些原子運算組合成複雜的操作,再由這些複雜的操作組合成更系統化的動作,從而解決實際問題,所以原子運算至關重要。什麼是原子運算?
原子運算就是那些不能再被拆解的動作。
比如一個舞蹈動作可以被拆解成若干個子動作,若其中一個子動作無法再被拆解,那麼這個動作就是原子運算。
原子運算不能被拆分,所以它也足夠的簡單,我們來看看程式語言裡,那些最基本的原子運算。
賦值運算:
這個運算在講解變數的時候,為大家介紹過。就是把“=”號右邊的資訊,放置到“等號”左邊的變數裡。
算術運算:
透過運算子,將運算子兩邊的資訊進行加減乘除等數學運算,算術運算子,主要用來處理整數、浮點數這型別的資訊的。我們可以想像一下,生活中哪些場景可以用到算術運算子?
比較運算子:
就是用來比較運算子兩邊資訊的,比大小、比相同等。比較的結果只會有兩種,是或否。
邏輯運算子:
邏輯運算子就三種:與、或、非。軟體開發工程師透過這三種簡單的運算子來構建一個龐大的邏輯關係。對於這三種邏輯運算子,我們可以這樣來簡單理解。
與:達成所有條件,才能闖關
或:只要有一個條件達成,就算闖關
非:與當前意思完全相反的意思
在Python裡面,與、或、非對應的運算子號是:and、or、not 。
下面是一些簡單的例子。
建議大家開啟Pycharm然後自己敲一下這些程式碼,感受一下。
不同開發語言,邏輯運算子的表達方式會不一樣。
比如JAVA,與或非對應的運算子是 “&&,||,!”雖然符號不一樣,但概念卻是完全一樣的。
其他:
還有很多運算子。我怕我一一介紹、大夥看得會睡著。其實好的學習方法是知道這些運算子的作用。解決實際問題時,遇到問題時再詳細查閱相關資料。
在下一個分享裡面,我會把這些運算子整理出來。分享給大家。
2 有了變數、有了運算子、可以開始按照自己的思路發明創造了。有了儲存現實中各種各樣資訊的變數、資料結構等,也有了處理資訊的運算子等。但是還差一樣東西,把這些思路透過程式語言有效的組織起來,這就是語法結構。所有程式語言都有這三種基本的語法結構,順序、選擇、迴圈,現在我們就具體來了解一下。
順序結構
計算機CPU執行指令操作的時候,是一行一行指令執行的,所以開發語言的編譯器、直譯器在執行程式碼的時候也是自上而下、一行一行程式碼執行的。這個很好理解,就像我們說話、做事情一樣得一句一句地說、一件一件事情地做。
有的小夥伴可能會問,為啥我的電腦可以一邊追劇、一邊下載東西呢?這兩件事情不是同時都在執行嗎?
其實這是一種錯覺!
計算機在1微秒的時候給你看到你需要追劇的畫面,趁你的大腦正在解析追劇畫面的時候,計算機在下1微秒的時候去下載需要的資料。這種切換很快速,我們人類的知覺是感覺不到的,我們只能感覺到這兩件事情是同時在進行。
我們來看一下下面這一段程式碼:
這段程式碼的執行順序就是 1,2,3,4行的執行。所以行的概念在程式語言裡很重要。
在Python裡面輸入完程式碼,然後回車。那麼剛剛輸入的內容就是一行程式碼。像Java這些語言,一行程式碼的結束標誌是“;”號。不同開發語言的行結束符會不一樣,但意思是一樣的。
選擇結構
根據國外人類行為學家的統計,我們每天平均要做3000個選擇。所以在用程式語言解決工作中實際問題的時候,我們會用到大量的選擇語句結構來組織我們的思路和程式碼、從而完成複雜的程式邏輯。我們先看一下選擇結構的執行圖。
從上面的圖可以很容易的看出,選擇語句結構很簡單。但它很靈活,如何體現它的靈活呢?
從上圖左下分支可以看出,透過“巢狀”的方法、我們可以套上數百個數千個選擇條件,來模擬實現我們日常生活中的一些複雜情況。我們來看一下具體的Python程式碼長什麼樣子。
第6行的 “if” 就是python選擇語法結構的關鍵字。
“x >= 0” 是這個選擇結構的條件。
第8行的“else”也是一個關鍵字,它後面緊跟的程式碼就是這個選擇條件達成不了,需要執行的操作。也可以把它看成是一個備選方案。
我們來“讀”一下這段程式碼,當x>0的時候,程式在螢幕上列印“您輸入的數字是正整數”,否則螢幕上列印的是“您輸入的數字是負整數”。
根據這樣的套路,我們還可以改造這段程式碼,讓它變得更復雜。
根據這樣的套路,我們可以把選擇結構做得很精細,再加上邏輯運算子和比較運算子。我們可以模擬出在日常生活中那些複雜的邏輯判斷,和複雜的決策。
在Python裡面,為了讓程式設計師在編寫複雜業務邏輯的時候,能把程式碼寫的更簡潔一些。Python還提供了一些簡化的選擇結構語法。這些對工作有幫助的語法,後面講解一些有趣例子的時候會為大家說明。
迴圈順序、選擇這兩種組織程式碼的方式還算是比較接近我們平常思考問題的方式。但到了迴圈,這個組織語言的方式就和我們平常的思維習慣有點不一樣了(切換思維警告)。
上大學的時候,教我們C語言的老師,在講解迴圈結構之前,給我們提了一個問題,我印象深刻。
老師問:“用程式碼編寫一個x,y,z 這三個正整數變數相加的程式”。這個題目很簡單,如果用Python來編寫程式碼如下:
老師又問:“如果不是x,y,z而是可以自定義相加整數的個數,該怎麼辦?”。
這是一個很有啟發性的問題。它告訴我們,如果還是按照上面程式碼的的思路來設計、編寫程式碼,這個問題是無解的(大夥可以想象為什麼?)。
若我們要解決這個問題,需要其他的思路。這個思路要解決兩個問題。
1)程式要知道使用者到底輸入了幾個整數。
2)需要一種方法,可以迴圈的相加這幾個整數。
第一個問題,我會在其他篇幅裡和大家分享。這裡重點是要說明程式語言裡,迴圈結構的思考方式和用法。
它的結構也很簡單,同樣和選擇結構一樣,可以不斷的“巢狀”,然後形成一個複雜的迴圈“機器”。不過這裡需要注意一點,迴圈的巢狀要慎用,因為它嚴重的影響程式碼執行的效率(大家可以想象為什麼?)。
現在我們來看一下在Python裡面,兩種迴圈結構。
上圖中,while就是python迴圈語法結構的關鍵字, y <100 是執行迴圈的條件。y=y+1是迴圈執行的語法。這段程式碼的意思就是讓Y這個變數自己每次加1,加100次。是不是很簡單?小夥伴們可以思考一個問題,如何使用 while來解決自定義整數個數相加的問題?
我們再來看Python裡另外一個重要的迴圈語法結構,for迴圈。
第一行程式碼,是一個整數列表變數 num_list.
第四行程式碼裡的for是for迴圈關鍵字,後面的in是條件。
第四行可以這樣來翻譯,把num_list裡面的整數一個一個的取出來放到i裡面。每取出一次都執行x=x+1這段程式碼,直到把num_list裡的整數取完。這樣的迴圈還有一種叫法,叫做迭代器。
這就是for迴圈的用法。while和for迴圈這兩種迴圈結構各有各的好處,在python程式設計開發裡面都會經常的用到。在其他的程式語言裡,像Java,c#等,會有更多的迴圈結構語法。
現在我們有了迴圈結構這樣的思想武器,再來思考---“如果不是x,y,z而是可以自定義相加整數的個數,該怎麼辦?”這樣的問題了,我們來看下面的程式碼。
友情提示:現在大夥沒有必要把程式碼每一行都看懂,看個大概,知道長什麼樣子就可以了。後面會為大家詳細說明。
四 老古人說得對,百變不離其中
我在構思這篇分享的時候反覆在想,哪一些東西對於初學者來說是重要的?是具體的程式碼案例?還是一些思想、思考問題的方式。想來想去我決定還是後者。
因為我想起了一個我原來的同事。它寫程式碼的水平還算不錯,規規矩矩、整整齊齊。但他寫程式碼的效率很低,有時寫出來的BUG也很奇怪。
慢慢的我把他調整到了負責一些不是很核心的模組開發。
當時我在想為啥他會這樣,後來看他程式碼的時候我發現,他對一些基礎的概念或者解決問題的思路上有問題。
也就是說技能會了,但意識跟不上。所以才會造成他寫程式碼效率不高,BUG也不少這些問題。所以我強烈地感受到,在我們學習程式設計技能的時候,普遍會不重視“意識”這個東西。
在遇到程式設計具體需求是:
1)我要如何利用程式語言,來儲存解決這些問題的關鍵資訊?
2)這些資訊我儲存好了,我要如何用程式語言來操作它們?
這是解決開發問題的核心切入點,然後在慢慢利用其它的一些思考方式來分析問題。最後在透過變數的設計、在透過語法結構的設計來完成一段程式碼的設計,然後敲程式碼就可以了。
下一篇主要就針對Python這門開發語言,帶著問題來做一些“語法專線訓練吧”。