Python基礎語法
1. Python標識符
在 Python 里,標識符由字母、數字、下劃線組成。
在 Python 中,所有標識符可以包括英文、數字以及下劃線(_),但不能以數字開頭。
Python 中的標識符是區分大小寫的。
以下劃線開頭的標識符是有特殊意義的。
-
以單下劃線開頭
_foo
的代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用from xxx import *
而導入。 -
以雙下劃線開頭的
__foo
代表類的私有成員。 -
以雙下劃線開頭和結尾的
__foo__
代表 Python 里特殊方法專用的標識,如__init__()
代表類的構造函數。
補充:
Python 可以同一行顯示多條語句,方法是用分號 ;
分開,如:
>>> print ('hello');print ('runoob');
hello
runoob
2. Python保留字符
下面的列表顯示了在Python中的保留字。這些保留字不能用作常數或變數,或任何其他標識符名稱。
所有 Python 的關鍵字只包含小寫字母。
and | exec | not |
---|---|---|
assert | finally | or |
break | for | pass |
class | from | |
continue | global | raise |
def | if | return |
del | import | try |
elif | in | while |
else | is | with |
except | lambda | yield |
3. 行和縮進
學習 Python 與其他語言最大的區別就是,Python 的代碼塊不使用大括號 {} 來控制類,函數以及其他邏輯判斷。python 最具特色的就是用縮進來寫模塊。
縮進的空白數量是可變的,但是所有代碼塊語句必須包含相同的縮進空白數量,這個必須嚴格執行。
以下實例縮進為四個空格:
if True:print ("True")
else:print ("False")
以下代碼將會執行錯誤:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 文件名:test.pyif True:print ("Answer")print ("True")
else:print ("Answer")# 沒有嚴格縮進,在執行時會報錯print ("False")
4. Python引號
Python 可以使用引號( ’ )、雙引號( " )、三引號( ‘’’ 或 “”" ) 來表示字符串,引號的開始與結束必須是相同類型的。
其中三引號可以由多行組成,編寫多行文本的快捷語法,常用于文檔字符串,在文件的特定地點,被當做注釋。
word = 'word'
sentence = "這是一個句子。"
paragraph = """這是一個段落。
包含了多個語句"""
5. Python注釋
Python中單行注釋采用 #
開頭。
Python 中多行注釋使用三個單引號 '''
或三個雙引號 """
。
# 第一個注釋
print ("Hello, Python!") # 第二個注釋'''
這是多行注釋,使用單引號。
這是多行注釋,使用單引號。
這是多行注釋,使用單引號。
'''"""
這是多行注釋,使用雙引號。
這是多行注釋,使用雙引號。
這是多行注釋,使用雙引號。
"""
6. Python空行
函數之間或類的方法之間用空行分隔,表示一段新的代碼的開始。類和函數入口之間也用一行空行分隔,以突出函數入口的開始。
空行與代碼縮進不同,空行并不是Python語法的一部分。書寫時不插入空行,Python解釋器運行也不會出錯。但是空行的作用在于分隔兩段不同功能或含義的代碼,便于日后代碼的維護或重構。
記住:空行也是程序代碼的一部分。
7. 輸入輸出
輸入輸出的最基本的方法就是控制臺(PyCharm下方彈出的窗口、windows自帶的cmd程序)。用戶通過控制臺輸入一些字符串, 程序再通過控制臺打印出一些字符串。
輸入輸出的最常見方法是圖形化界面。 如平時用到的 QQ, 瀏覽器, steam 等, 都不需要用戶輸入命令,
而只是通過鼠標點擊窗口點擊按鈕的方式來操作。
通過控制臺輸出
print('hello')a = 10
print(a)b = True
print(b)
更多的時候, 我們希望能夠輸出的內容是混合了字符串和變量的。**例如:**輸出num = 10
num = 10
print(f'num = {num}')
注意:
-
使用 f 作為前綴的字符串, 稱為 f-string
-
里面可以使用 { } 來內嵌一個其他的變量/表達式
-
python里面還支持許多格式化字符串的方法,此處簡單理解即可
通過控制臺輸入
eg1:
num = 0
num = input('請輸入一個整數: ')
print(f'你輸入的整數是 {num}')
運行結果(綠色數字為輸入):
注意:
- input 的參數相當于一個“提示信息”,也可以沒有
- input 的返回值就是用戶輸入的內容. 是字符串類型
eg2:
a = input('請輸入第一個整數: ')
b = input('請輸入第二個整數: ')print(f'a + b = {a + b}')
運行結果:
此處的字符串是拼接不是算術運算,如果要想進行算術運算, 需要先轉換類型
eg3:
a = input('請輸入第一個整數: ')
b = input('請輸入第二個整數: ')a = int(a)
b = int(b)print(f'a + b = {a + b}')
運行結果:
通過 int( ) 把變量轉成了 int 類型
類似的, 使用 float( ), bool( ), str( ) 等可以完成對應的類型轉換
8. 常量和表達式
可以把 Python 當成一個計算器, 來進行一些算術運算
print(1 + 2 - 3)print(1 + 2 * 3)print(1 + 2 / 3)
運行結果:
形如 1 + 2 - 3 這樣是算式, 在編程語言中稱為 表達式, 算式的運算結果, 稱為 表達式的返回值
其中 1 , 2 , 3 這種稱為 字面值常量, + - * / 這種稱為 運算符 或者 操作符
注意:這里對于2/3
這種計算結果,在一般類似于 C / Java 中結果為0(小數部分被截斷),但是在Python中得到的結果則是一個小數,更符合日常使用的直覺。
9. 變量和類型
變量的介紹
示例:
給定四個分數, 67.5, 89.0, 12.9, 32.2 , 編寫代碼, 求這四個分數的方差
PS: 方差的計算過程: 取每一項, 減去平均值, 計算平方, 再求和, 最后除以 (項數 - 1)
在這個代碼中,需要先計算四個數的平均值再計算方差,所以就需要一個變量保存平均數。
avg = (67.5 + 89.0 + 12.9 + 32.2)/4
total = (67.5 - avg)**2 + (89.0 - avg)**2 + (12.9 - avg)**2 + (32.2 - avg)**2
result = total/3
print(result)
注意:
- avg, total, result 均為變量.
- ** 在 Python 中表示乘方運算. ** 2 即為求平方
變量可以視為是一塊能夠容納數據的空間。這個空間往往對應到 “內存” 這樣的硬件設備上
定義變量
a = 10
創建變量的語句非常簡單, 其中
- a 為變量名. 當我們創建很多個變量的時候, 就可以用名字來進行區分
- = 為賦值運算符, 表示把 = 右側的數據放到 = 左側的空間中
注意: 變量的名字要遵守一定規則
硬性規則(務必遵守)
-
變量名由數字字母下劃線構成
-
數字不能開頭
-
變量名不能和 “關鍵字” 重復
-
變量名大小寫敏感. num 和 Num 是兩個不同的變量名
軟性規則(建議遵守)
-
變量名使用有描述性的單詞來表示, 盡量表達出變量的作用
-
一個變量名可以由多個單詞構成, 長一點沒關系, 但是含義要清晰
-
當變量名包含多個單詞的時候, 建議使用 “駝峰命名法”. 形如 totalCount , personInfo 這種, 除 了首個單詞外, 剩余單詞首字母大寫
數學上, 變量通常使用 x, y, z 這種簡單的英文字母或者拉丁字母表示. 但是在編程中不建議這樣使用
原因是編程中, 一個程序里通常會同時創建出很多個變量. 如果只是使用單個字母表示, 在變量多了 的時候, 就很難記住哪個變量是干啥的, 從而給維護程序帶來了一定的困難。因此我們更建議使用帶 有明確描述性的名字, 來表示變量的用途。
使用變量
讀取變量的值
a = 10
print(a)
修改變量的值
a = 20
print(a)
注意:在 Python 中, 修改變量也是使用 = 運算, 看起來和定義變量沒有明顯區別.
當然,也可以用一個變量的值賦給另外一個變量
a = 10
b = 20a = bprint(a)
print(b)
變量的類型
與C/Java不同,Python 變量的類型不需要顯式指定, 而是在賦值的時候確定的。
(1)整數
a = 10
print(type(a))
運行結果:
<class 'int'>
PS: type 和 print 類似, 也是 python 內置的函數. 可以使用 type 來查看一個變量的類型
注意:和 C++ / Java 等語言不同, Python 的 int 類型變量, 表示的數據范圍是沒有上限的. 只要內存足夠 大, 理論上就可以表示無限大小的數據
(2)浮點數(小數)
a = 0.5
print(type(a))
運行結果:
<class 'float'>
注意:和 C++ / Java 等語言不同, Python 的小數只有 float 一種類型, 沒有 double 類型。但是實際上 Python 的 float 就相當于 C++ / Java 的 double, 表示雙精度浮點數。
(3)字符串
a = 'hello'
print(type(a))
運行結果:
<class 'str'>
使用 ’ ’ 或者 " " 引起來的, 稱為 字符串. 可以用來表示文本
注意: 在 Python 中, 單引號構成的字符串和雙引號構成的字符串, 沒有區別. 'hello'
和 "hello"
是 完全等價的。
補充:字符串的應用
可以使用len函數獲取字符串長度
a = 'hello'
print(len(a))
可以使用 + 針對兩個字符串進行拼接
a = 'hello'
b = 'world'
print(a + b)
此處是兩個字符相加,不能拿字符串和整數/浮點數相加
(4)布爾
布爾類型是一個特殊的類型, 取值只有兩種,True (真) 和 False (假)。
PS: 布爾類型也是數學上的一個概念. 初中就學過一個概念叫做 “命題” , 進一步的就可以判定 命題的真假
a = True
print(type(a))
b = False
print(type(b))
運行結果:
<class 'bool'>
<class 'bool'>
布爾類型在后續進行邏輯判斷的時候也非常重要。
(5)其他
除了上述類型之外,Python中還有list,tuple,dict,自定義類型。
補充:
-
為什么需要這么多的類型?
(1) 類型決定了數據在內存中占據多大空間。
例如 float 類型在內存中占據 8 個字節。
PS: 計算機里面使用二進制來表示數據. 也就是每個位只能表示 0 或者 1.
1 個二進制位, 就稱為是一個 “比特”, 8 個二進制位, 就稱為一個 “字節” (Byte)
一個 float 變量在內存中占據 8 個字節空間, 也就是 64 個二進制位
電腦有 16GB 的內存空間, 也就是一共有 1024 * 1024 * 1024 * 8 這么多的二進制位
(2) 類型其實約定了能對這個變量做什么樣的操作.
例如 int / float 類型的變量, 可以進行 + - * / 等操作
而 str 類型的變量, 只能進行 + (并且行為是字符串拼接), 不能進行 - * / , 但是還能使用 len 等其他操作.
總結: 類型系統其實是在對變量進行 “歸類”. 相同類型的變量(數據) 往往具有類似的特性和使用規則
-
動態類型特性
在 Python 中, 一個變量是什么類型, 是可以在 “程序運行” 過程中發生變化的. 這個特性稱為 “動態類型”
a = 10 print(type(a)) a = 'hello' print(type(a))
運行結果:
<class 'int'> <class 'str'>
在程序執行過程中, a 的類型剛開始是 int, 后面變成了 str
C++/Java 這樣的語言則不允許這樣的操作。 一個變量定義后類型就是固定的了. 這種特性則稱為 “靜 態類型”
動態類型特性是一把雙刃劍
-
對于中小型程序, 可以大大的解約代碼量(比如寫一段代碼就可以同時支持多種類型)
-
對于大型程序, 則提高了模塊之間的交互成本(程序員 A 提供的代碼難以被 B 理解)
-
10. 關系運算符
(1)如果關系符合, 則表達式返回 True. 如果關系不符合, 則表達式返回 False
a = 10
b = 20print(a < b) #Ture
print(a <= b) #Ture
print(a > b) #Flase
print(a >= b) #Flase
print(a == b) #Flase
print(a != b) #Ture
(2)關系運算符不光針對整數/浮點數進行比較, 還能針對字符串進行比較
a = 'hello'
b = 'world'print(a < b) #Ture
print(a <= b) #Ture
print(a > b) #Flase
print(a >= b) #Flase
print(a == b) #Flase
print(a != b) #Ture
注意:
- 直接使用 == 或者 != 即可對字符串內容判定相等 (這一點和 C / Java 不同).
- 字符串比較大小, 規則是 “字典序”
關于字典序:
想象一個英文詞典, 上面的單詞都是按照字母順序排列. 如果首個字母相同, 就比較第二個字母 (就比如著名單詞 abandon)
我們認為一個單詞在詞典上越靠前, 就越小;越靠后, 就越大
(3)對于浮點數來說, 不要使用 == 判定相等
print(0.1 + 0.2 == 0.3) #False
注意: 浮點數在計算機中的表示并不是精確的! 在計算過程中, 就容易出現非常小的誤差
print(0.1)
print(0.2)
print(0.3)
print(0.1 + 0.2)
運行結果:
可以看到, 0.1 + 0.2 的結果并非是 0.3 , 雖然這個最后的數非常小了, 但是仍然會導致 == 的結果為 False。
現在很多主流語言都有這種問題,這個是 IEEE754 標準規定的浮點數格式所引入的問題,所以不需要做過多討論
正確的比較方式: 不再嚴格比較相等了, 而是判定差值小于允許的誤差范圍。
a = 0.1 + 0.2
b = 0.3print(-0.000001 < (a - b) < 0.000001)
實際工程實踐中, 誤差在所難免, 只要保證誤差在合理范圍內即可
11. 邏輯運算符
像 and or not
這一系列的運算符稱為 邏輯運算符。
- and 并且,兩側操作數均為 True, 最終結果為 True。 否則為 False。 (一假則假)
- or 或者,兩側操作數均為 False, 最終結果為 False。 否則為 True。 (一真則真)
- not 邏輯取反,操作數本身為 True, 則返回 False。 本身為 False,則返回 True。
注意:
一種特殊寫法
a < b and b < c 這個操作等價于 a < b < c 。 這個設定和大部分編程語言都不相同
關于短路求值
和其他編程語言類似, Python 也存在短路求值的規則.
-
對于 and, 如果左側表達式為 False, 則整體一定為 False, 右側表達式不再執行
-
對于 or, 如果左側表達式為 True, 則整體一定為 True, 右側表達式不再執行
print(10 > 20 and 10 / 0 == 1) #False
print(10 < 20 or 10 / 0 == 1) #True
上述代碼沒有拋出異常, 說明右側的除以 0 操作沒有真正執行
12. 賦值運算符
(1) =
的使用
=
表示賦值. 這個我們已經用過很多次了. 注意和 ==
區分.
=
除了基本的用法之外, 還可以同時針對多個變量進行賦值.
鏈式賦值
a = b = 10
多元賦值
a, b = 10, 20
代碼實例: 交換兩個變量
#代碼1(基礎寫法)
a = 10
b = 20tmp = a
a = b
b = tmp#代碼2(多元賦值)
a = 10
b = 20a, b = b, a
(2) 復合賦值運算符
Python 還有一些 復合賦值運算符。 例如 += -= *= /= %=
其中 a += 1
等價于 a = a + 1
。 其他復合賦值運算符也是同理
注意: 像 C++ / Java 中, 存在 ++ --
這樣的自增/自減運算符。 Python 中則不支持這種運算。 如果需要使用,
則直接使用 += 1 或者 -= 1
++ --
最大的問題就是容易分不清前置和后置的區別。這一點 Python 語法在設計的時候就進行了 規避, 避免出現這種不直觀, 并且容易混淆的語法