這篇文章很難寫!我最開始學 Python,和大多數人一樣,是看的菜鳥教程:
在寫完這篇文章的第一遍後,我發現並沒有寫出新意,很可能讀者看到後,會和我當初一樣,很快就忘了。我現在已經不是讀者而是作者了,我想我可以做出一些改變,降低閱讀門檻,加強理解記憶。
版本選擇
Python 有 2 個不相容的版本,Python2 和 Python3。Python2 已經逐漸被淘汰,現在只需要學 Python3 即可。
語法是什麼
先直觀感受一下,用不同程式語言在介面上列印出 HelloWorld 字樣:
C 語言
#include <stdio.h>
int main(void)
{
printf("Hello World!");
return 0;
}
Python
print("HelloWorld!")
看到了麼,結果一樣,但是程式語言的寫法不一樣,就像中文和英文,同一個意思,卻是用不同字元表達出來的。語法就是用來告訴你該怎麼表達的一套規則。學 Python 只有懂 Python 語法,才能知道怎麼寫程式碼。
從一個例子講起
假設我們要用 Python 實現這樣一個功能,鍵盤輸入"大河向東流"後,螢幕上會顯示“天上的星星參北斗”。用 Python 實現的程式碼為:
# 獲取鍵盤輸入
pre_sentence = input()
# 判斷如果輸入的句子是大河向東流
if pre_sentence == "大河向東流":
# 在螢幕上列印天上的星星參北斗
print("天上的星星參北斗")
這個例子涉及到這些名詞術語:編碼、識別符號、語句、縮排、程式碼塊、引號、註釋、空行、函式。
編碼
編碼,是指把人類語言編成計算機能懂的二進位制(010101 這種)。不同國家的字元是不一樣的,用來編碼的字符集也就不一樣。美國的字符集包括英文字母、標點符號字元、阿拉伯數字,叫做 ASCII。歐洲的字符集,加入了帶重音的字元、希臘字母等叫做,Latin-1。中國!加入了漢字!叫做 GB2312。後來加入了生僻字、繁體字及日韓漢字等,叫做 GBK。天下大亂,亂碼無法交流,ISO 國際標準化組織決定一統江湖,Unicode 誕生。再優化優化,UTF-8。
預設情況下,Python3 原始碼檔案都是以 UTF-8 編碼,字串都是 unicode 字串,讓全球不同國家無障礙程式設計。程式碼中既可以寫英文也可以寫中文,但是中文只能用來顯示和註釋,不決定程式執行。
識別符號
識別符號是程式設計時使用的名字,比如例子中的 pre_sentence
。在 Python 中,名字由字母、數字、下劃線組成,不能以數字開頭,並且區分大小寫。比如以下是合法的:
a_12_b_
_a1
_A1
以下是非法的:
1abc
$ddd
我們在寫程式碼的時候,經常需要取名字,取名最好具有業務意義。有些名字包含多個英文單詞,寫在一起不好閱讀,名字又不能包含空格,要麼首字母大寫,要麼用下劃線來分隔。現有的 Python 程式碼庫中,這兩種方式都存在,因為 Python 是由開源社群發展來的,五花八門,百花齊放。為了越來越規範,Google 制定了 PEP8 規範(Python Enhancement Proposal 8),建議大家用下劃線來分隔。
下劃線除了用來分隔多個單詞,在 Python 中還有更多的作用。單個下劃線開頭 _foo
代表私有的,只能“自己”用。單個下劃線結尾 class_
可以用來解決和 Python 已有名字衝突。雙下劃線 __main__
在 Python 中有極其特殊的作用。
Python 已經把有些名字用了,你不能再用,否則會衝突報錯。可以在 cmd 中輸入 python
進入 Python 後,輸入以下程式碼檢視哪些名字已經被用了:
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
語句
交流不可能是按單詞來交流,而是按語句。Python 中一行程式碼就是一條語句,這是一般規定。也有少數例外,比如可以使用反斜槓(\),把一條語句寫成多行:
total = item_one + \
item_two + \
item_three
如果在 [], {}, 或 () 中,不用反斜槓(\)也可以寫成多行:
total = ['item_one', 'item_two', 'item_three',
'item_four', 'item_five']
反之亦然,Python 中多條語句也是能寫成一行的(不推薦):
import sys; x = 'runoob'; sys.stdout.write(x + '\n')
縮排
有些話不是一句就能說完的,比如我現在說的這句,哈哈。為了程式碼有層次,閱讀更方便,程式語言會使用縮排來斷句。Python 的縮排有點異類,不是用花括號 {}
,而是用 4 個空格,而且必須要縮排一致,否則就會報錯。比如:
if True:
print ("Answer")
print ("True")
else:
print ("Answer")
# 沒有嚴格縮排,在執行時會報錯
print ("False")
報錯:
IndentationError: unindent does not match any outer indentation level
如果用 PyCharm,那麼就完全不用擔心這個問題了,因為它有智慧提示,在編寫的時候就能糾正過來。我已經完全適應了敲空格,為什麼空格鍵設計的那麼大?就是用來敲的!
程式碼塊
“多條縮排相同的語句就叫做程式碼塊”,這是教程給的定義,我們平時說的程式碼塊,更多指的是相關聯的多行程式碼。比如,如果 xxx,那麼 xxx,否則 xxx:
if expression :
suite
else :
suite
引號
引號常用來框住字串,Python 同時支援單引號、雙引號、三引號,只要保證引號的開始和結束一致就行:
word = 'word'
sentence = "這是一個句子。"
paragraph = """這是一個段落。
包含了多個語句"""
單行用單引號或雙引號,多行用三引號。我一般會優先用雙引號,看著規範(毫無依據,哈哈哈)。
註釋
Python 的單行註釋用 #:
# 第一個註釋
print ("Hello, Python!") # 第二個註釋
Python 的多行註釋用三個單引號或三個雙引號:
'''
這是多行註釋,使用單引號。
這是多行註釋,使用單引號。
這是多行註釋,使用單引號。
'''
"""
這是多行註釋,使用雙引號。
這是多行註釋,使用雙引號。
這是多行註釋,使用雙引號。
"""
空行
空行也是 Python 程式碼的一部分,既能分隔不同業務程式碼,也能提高閱讀體驗。不過不需要刻意記哪些地方需要多少空行,在 PyCharm 中 CTRL + ALT + SHIFT + L 組合鍵可以快速格式化為符合 PEP8 規範的程式碼,標準化的空行一目瞭然:
函式
例子中 input()
、print()
這種 名字 + ()
形式的叫做函式,寫 Python 經常會用到函式,也需要我們自己寫函式。函式是一塊程式碼片段,有輸入,有輸出,可以重複使用,有特定功能,比如 input()
用來鍵盤輸入,print()
用來列印到螢幕顯示。我們寫 Python 程式碼都是在 .py 檔案中來寫的,每個 .py 檔案在 Python 中叫做模組。模組多了以後,我們需要把它們按照業務意義分別放到不同的目錄進行管理,有些目錄中包含 __init__.py
檔案,這種目錄叫做包。
import 與 from...import
模組與模組之間是分離的,除了 Python 已經為我們提供的基礎語法,如果想用其他模組的程式碼,就需要使用 import
或 from..import
來匯入。視使用需要不同,匯入格式也不同:
將整個模組( somemodule )匯入,格式為: import somemodule
從某個模組中匯入某個函式,格式為: from somemodule import somefunction
從某個模組中匯入多個函式,格式為: from somemodule import firstfunc, secondfunc, thirdfunc
將某個模組中的全部函式匯入,格式為: from somemodule import *
動態語言
Python 是動態語言,不需要指定資料型別。比如:
a = 1
b = "string"
強型別語言
Python 是強型別語言,經常會有人搞錯。比如:
a = 1
b = "string"
c = a + b
是會報錯的:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
不是相同的型別不能直接相加。
JavaScript 才是弱型別語言,不同資料型別可以直接相加。
小結
本文雖然參考了菜鳥教程,但是重新組織了寫作手法。先介紹了版本選擇和語法的概念,接著從一個例子講起,把相關的概念挨個講解了一遍,然後簡單提到了模組和包,引出了 import 的原因,最後說明了 Python 是動態、強型別語言。
參考資料: