真香,理解記憶法學習Python基礎語法

dongfanger發表於2020-12-03

這篇文章很難寫!我最開始學 Python,和大多數人一樣,是看的菜鳥教程:

image-20201202093309781

在寫完這篇文章的第一遍後,我發現並沒有寫出新意,很可能讀者看到後,會和我當初一樣,很快就忘了。我現在已經不是讀者而是作者了,我想我可以做出一些改變,降低閱讀門檻,加強理解記憶。

版本選擇

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基礎語法

語句

交流不可能是按單詞來交流,而是按語句。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 規範的程式碼,標準化的空行一目瞭然:

真香,理解記憶法學習Python基礎語法

函式

例子中 input()print() 這種 名字 + () 形式的叫做函式,寫 Python 經常會用到函式,也需要我們自己寫函式。函式是一塊程式碼片段,有輸入,有輸出,可以重複使用,有特定功能,比如 input() 用來鍵盤輸入,print() 用來列印到螢幕顯示。我們寫 Python 程式碼都是在 .py 檔案中來寫的,每個 .py 檔案在 Python 中叫做模組。模組多了以後,我們需要把它們按照業務意義分別放到不同的目錄進行管理,有些目錄中包含 __init__.py 檔案,這種目錄叫做包。

import 與 from...import

模組與模組之間是分離的,除了 Python 已經為我們提供的基礎語法,如果想用其他模組的程式碼,就需要使用 importfrom..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 是動態、強型別語言。

參考資料:

https://www.runoob.com/python3/python3-basic-syntax.html

相關文章