1. 程式人生 > >AI 學習之路——輕鬆初探 Python 篇(二)

AI 學習之路——輕鬆初探 Python 篇(二)

image

這是「AI 學習之路」的第 2 篇,「Python 學習」的第 2 篇

我將分兩篇講解下 Python 的基礎語法,這是第一篇。大家也可以在很多地方看到入門的學習資料,我就簡單的根據自己理解和學習,用盡量簡單和好理解的方式,再來小入門一下,文中可能會用到一些 Java 上的理解。

總而言之,我不希望是一種閱讀文件的方式,而是用一種思考和共鳴的方式去理解各個知識點。

一些建議

今天在群裡,有的小夥伴建議我使用一些類似 PyCharm 這樣的智慧編譯器來入門 Python,實際上我何嘗不想用編譯器呢,我也是老早就下載了 PyCharm,但我還是決定在學習的過程中不使用任何智慧編譯器,使用命令列和純文字編輯器來一個字元一個字元的寫程式碼,我也建議大家這樣做,先暫時放放手裡的編譯器。

為什麼一再強調這樣做呢,在上大學的時候,每次學一門新的語言,老師都會強調讓我們用命令列來編譯程式碼,這樣做不僅能幫助我們更好的理解一門語言的編譯過程,而且一行一行敲出來可以更好的培養我們對這門語言的「語感」,是不是真的和學英語感覺差不多,實際上確實是差不多的,寫程式碼也是要一個「語感」。

我們在控制檯或者終端中輸入「python3」將進入 Python 的互動式環境,在互動式環境中,我們可以直接輸入程式碼,回車後,每一行程式碼的結果都會被列印輸出出來。你也可以通過執行「python test.py」來執行一個 .py 檔案。但這兩種輸出方式有一定區別,舉個例子。

在互動式環境下輸入以下程式碼並回車

>>> 'Python is the best language. '
'Python is the best language. '

‘Python is the best language’是一個字串,我們下篇文章會說到。這裡我們發現,輸入我們輸入了一個字串並回車後,互動式環境直接幫我們把這個字串打印出來了。我們試試在 test.py 檔案中輸入這段程式碼吧

'Python is the best language. '

通過「python test.py」執行檔案發現沒有任何輸出,它不會像互動式環境下輸出每一行。提醒大家一點的是,在互動式環境中,我們可以省略「.py」,直接通過「 python test」來執行 Python 檔案。

我們把「test.py」稍作修改,新增 print 語句,就能打印出來了

print('Python is the best language. ')

這裡推薦大家使用「Sublime Text」配合互動式環境來進行學習,在 Sublime Text 中進行程式碼編寫,在 Tools –> Build System 中選擇 Python 後,通過「Command+B」(Mac) 來編譯,如果有需要驗證某一行程式碼,就複製到互動式環境中去驗證,使用這種方式來學習 Python 語法,別提有多來勁了。

image

輸入輸出

1. print

我們看到了好幾次「print()」了,Python 的輸出語句,2.x 和 3.x 是有所區別的:
這是 2.x 的語法

>>> print 'Hello, Python'

這是 3.x 的語法

>>> print('Hello, Python')

print() 也可以帶多引數,用「,」相隔,每次遇到逗號會出處一個空格,就像這樣:

>>> print('小之','正在','帥氣的','學 Python')
小之 正在 帥氣的 學 Python

不止是字串,print() 還可以打印出整數:

>>> print(2017-1994)
23

然後配合剛剛的多引數函式就可以組合出一些有意思的輸出:

>>> print('小之今年',2017-1994,'歲。')
小之今年 23 歲。

我還在青春期呢。

2. input

我們可以通過 input() 來進行等待輸入,然後把輸入結果放到一個變數中,3.x可以支援中文變數名!

>>> 姓名 = input()
小之
>>> 姓名
`小之`

我們通過鍵盤輸入,將「小之」這個字串存放在了「姓名」這個變數中,輸出「姓名」會直接把存放的字串給打印出來。

我們搭配一下上面的知識,來綜合應用下:

>>> 姓名 = input()
小之
>>> 性別 = input()
男
>>> print('姓名:',姓名,'性別:',性別)
姓名:  小之 性別:  男

Python 的縮排

Python 不像 Java,它沒有大括號和分號這樣明顯的程式碼塊控制符號,一切的程式碼塊都是通過縮排來區分,這樣做的好處是,它強制你寫出語法嚴格的縮排模式,不會像 Java 一樣,只要你符號使用的對,你甚至可以極端的把所有程式碼寫在一行裡。

但這樣做又會有一些問題,如果邏輯比較複雜,可能你的程式碼就會有非常冗長的「迷之縮排」,看的你懷疑人生。用 Java 寫客戶端的同學可能會有一個體會,在寫一些巢狀請求或者涉及到匿名內部類的時候應該深有體會,環環相扣的大括號在你眼前像麻花一般晃動,酸爽自知,不過好在有了「Lambda」和一些鏈式結構,這種情況才有所緩解,這裡就不深談了。

在 Python 裡,這種情況可能會更嚴重,但實際上這種縮排語法也有一種反向指引作用,他會促使你去想盡一切辦法寫一些縮排比較少的程式碼,為了達到這個目的,首先你就得保證你的程式碼擁有良好的設計性,每個函式遵守「單一原則」。

這讓我想到了「單元測試」,測試驅動開發就是這樣,如果你想讓你的程式碼具有可測性,那你不得不在開發階段就讓程式碼具有良好的設計性,每一個函式都儘量只做一個事,這樣才能把每一段邏輯「可命名化」。

好比做菜可以分好多步驟,比如洗菜、切菜、炒菜、放調料等,你得把每個步驟都拎出來一個函式,這個函式名就叫洗菜,然後它只乾洗菜的事。如果你把這些步驟都放在一個函式裡,函式名叫做菜,這實際上不是一個很好的做法,因為它乾的事太多了,而你的命名不能很好的讓閱讀你程式碼的人細化的理解到它到底做了啥。

所以,縮排裡面的門道可多了呢。

資料型別

1. 整數與浮點數

Python 的資料型別和其他語言比較類似,整數運算始終是精確的,而浮點數可能會有精度的丟失。

沒錯,即便是整數的除法,結果也是精確的:我們使用 5/3 來看看結果

>>> 5/3
1.6666666666666667

「/」計算的結果是浮點數,5/3 你無論試幾次,它都是這個結果。即便整除,最後還是浮點數。

>>> 6/3
2.0

還有一個取整除法「//」,這是一種割尾取值:

>>> 5//3
1

當然,還有我們熟悉的「%」,餘數計算:

>>> 5%3
2

2. 布林值

布林值只有兩種值:True 和 False,不是 True 就是 False,經常用在判斷語句中,他們可以搭配 and、or、not 來運算,也可以直接輸出或者通過布林運算計算出來:

>>> True
True
>>> False
False
>>> 2>1
True
>>> 2<1
False

if age >= 23:
    print('比小之成熟')
else:
    print('比小之年輕')

3. 空值

Python 中的空值用「None」表示,和 Java 中的 null 有點像。

4. 變數

Python 中的變數是可以被任何資料型別賦值的,這是動態語言的特性,而像 Java 這樣的靜態語言,在給變數賦值的時候,是需要指定型別的。

int a = 10; //指定 a 為整型
a = "Test";  // 編譯期報錯,型別不匹配

但 Python 沒有這種問題,同樣的變數可以被賦予不同型別的值。

a = 10;     // a 為整數型別
a = 'Test' // a 現在是字串型別

不過 Python 和 Java 變數的記憶體語義是類似的。變數都是指向一個引用。

a = 'ABC'
b = a
a = "XYZ"
print(b)

這裡的 b 打印出來是 ‘ABC’,a 和 b 儲存的是引用指標,b = a 的時候,b 儲存了 a 的引用,當 a 的引用變化的時候,b 的引用當然不會變化,而字串又是一種常量池的實現方式,所以 b 就會打印出來 ‘ABC’,大家是不是覺得和 Java 非常類似呢

常量在 Python 中用大寫字母表示:

PI = 3.141592653

不過實際上它也是個變數,也可以被修改。只是約定俗成用這種方式來表示常量罷了。

image

開篇大吉,加入我們一起學習 AI,現在群的氛圍很好,質量很高,上面是二維碼,請備註「AI」