在上一節的內容中,我們介紹了Python的誕生、發展曆程、特色、缺點和應用領域。從本節開始,我們將正式學習Python。Python是一門簡潔和優雅的語言,有自己特殊的一些語法規則。因此,在介紹Python編程的有關知識之前,先熟悉下Python的基礎語法,是非常有必要的。
截止到2023年7月,Python的最新版本爲3.12,本專欄將使用Python 3.x的語法介紹相關知識。
編碼格式在Python 2.x中,源文件默認編碼格式爲ASCII。如果內容中含有漢字,不指定編碼格式的話,便不能正確的讀取和輸出。可以將下面的代碼放到源文件的開頭,來指定編碼格式爲UTF-8。
# -*- coding: UTF-8 -*-
在Python 3.x中,源文件默認編碼格式爲UTF-8。故在使用Python 3.x時,通常不需要指定編碼格式。
標識符標識符是軟件編程中通用的概念,用于給變量、函數、接口、類等進行命名。Python中的標識符區分大小寫,由字母、數字和下劃線組成,第一個字符必須是字母或下劃線,不能以數字開頭。在Python 3.x中,可以用中文作爲標識符。
以下劃線開頭的標識符具有特殊含義。單下劃線開頭的標識符(比如:_name),表示不能直接訪問的類屬性,需通過類提供的接口才能訪問。雙下劃線開頭的標識符(比如:__age),表示類的私有成員。雙下劃線開頭和結尾的標識符(比如:__init__()爲類的構造函數),表示Python中的內置標識。
關鍵字Python中的關鍵字,也叫保留字,不能把這些關鍵字用作任何標識符的名稱。Python 3.11中一共有35個關鍵字,可用keyword模塊中的kwlist輸出這些關鍵字。
import platformimport keywordprint(platform.python_version())print(keyword.kwlist)
上述代碼的輸出如下:
3.11.4['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', '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中,單行注釋使用#,多行注釋使用三個單引號(''')或三個雙引號(""")。
import platformimport keyword#print('hello world')'''print(platform.python_version())print(keyword.kwlist)'''"""第一行注釋第二行注釋第三行注釋"""print('hello world')
多行通常情況下,python一行寫一條語句,結尾不需要添加任何結束符號(如:C/C++的分號)。如果語句比較長,需要跨越多行時,可以使用反斜杠'\'符號來實現多行語句。但有一個例外,在()、[]、{}中的多行語句,不需要使用反斜杠'\'符號。
a = 66b = 33 + \55 + \77# c爲元組c = (1, 3, 5, 7, 9)# d爲列表d = ['hello', 'world', 'Fighting']# e爲sete = {90, 91, 92}
當然,如果需要將多條語句寫在一行,Python也是允許的,在每條語句後面加上分號即可。
a = 66; b = 99; c = 1print(a + b + c)
空行空行與代碼縮進有所不同,空行是程序代碼的一部分,但並不是Python語法的一部分。編寫Python代碼時,即使不插入空行,Python解釋器運行也不會報錯。函數之間、類的方法之間、不同功能塊之間用空行進行分隔,表示一段新的代碼的開始,便于日後代碼的維護和重構。
def func1(): print('Hello world')def func2(): print('Hello World')func1()func2()
縮進與C/C++、Java等語言不同,Python不使用大括號{}來表示類、函數、邏輯塊的邊界範圍,而是使用縮進。縮進的空格數是可變的(推薦4個空格),但是同一個代碼塊的語句必須包含相同的縮進空格數,否則,程序運行時會報錯。
a = 99if a > 100: print('ok') print('a is larger than 100')else: print('cancel') print('a is equal to or less than 100')# 縮進空格不一致,運行會報錯:IndentationError: unindent does not match any outer indentation level print('hello')
引號Python可以使用單引號(')、雙引號(")、三引號(''' 或 """)來表示字符串。開始的引號與結束的引號的類型必須一致,三引號可以由多行組成。當字符串中含有雙引號時,可以使用單引號,這樣不需要使用轉移字符'\'。同樣的,當字符串中含有單引號時,可以使用雙引號。
a = 'Hello'# 字符串中含有單引號,使用單引號時,必須使用轉義字符b = 'I\'m hope_wisdom'# 字符串中含有單引號,使用雙引號時,不需要使用轉義字符c = "I'm hope_wisdom"d = '''I have a dream'''e = """成就 一億技術人"""
輸入輸出Python提供了input函數用于輸入。input函數將所有輸入都當作字符串看待,返回字符串類型。
Python提供了print函數用于輸出,默認的分隔符爲空格符,默認會換行(結尾符爲換行符),可以通過額外的sep和end參數指定分隔符和結尾符。
a = input('input your name: ')print('your name is', a)# 輸出:apple-banana-lemon#print('apple', 'banana', 'lemon', sep='-', end='#')
import在Python中需要引入其他庫和模塊的功能時,使用import關鍵字。
將整個模塊導入時,使用:import 模塊名。此時調用模塊中的函數時,必須帶上模塊名。
從模塊中導入函數A、B、C時,使用:from 模塊名 import A, B, C。此時調用模塊中的函數時,不用帶上模塊名。還可以使用as將函數名指定爲其他名稱,比如:from 模塊名 import A as A_alias(後續使用A_alias即可)。如果需要導入模塊中的所有函數,可以使用:from 模塊名 import *。
import platformfrom platform import version, releasefrom platform import processor as my_processorprint(platform.system())print(version(), release())print(my_processor())
運算符表達式由運算符和操作數兩部分組成,比如:66+88是一個表達式,其中,66、88是操作數,而+則是運算符。Python中常見的運算符可參考下表。
運算符
含義
使用說明
+
相加
a + b
-
相減
a - b
*
相乘
a * b
/
相除
a / b,10 / 4的結果爲:2.5
//
取整除
a // b,10 // 4的結果爲:2
%
取模
a % b,10 % 4的結果爲:2
**
取冪
a**b,2**3的結果爲:8
==
是否相等
a == b
!=
是否不等于
a != b
>
是否大于
a > b
<
是否小于
a < b
>=
是否大于等于
a >= b
<=
是否小于等于
a <= b
=
賦值
a = 100
+=
加法賦值
a += b,與a = a + b相同
-=
減法賦值
a -= b,與a = a - b相同
*=
乘法賦值
a *= b,與a = a * b相同
/=
除法賦值
a /= b,與a = a / b相同
//=
整除賦值
a //= b,與a = a // b相同
%=
取模賦值
a %= b,與a = a % b相同
**=
取冪賦值
a **= b,與a = a ** b相同
<<
左移幾位
a << 2
>>
右移幾位
a >> 2
&
按位與
a & b
|
按位或
a | b
~
按位取反
~a
^
按位異或
a ^ b
and
布爾與
a and b
or
布爾或
a or b
not
布爾非
not a
is
兩個標識符是否引用同一個對象
a is b
is not
兩個標識符是否引用不同對象
a is not b
in
是否爲序列、集合或映射的成員
a in b
not in
是否不爲序列、集合或映射的成員
a not in b
這些運算符的優先級可參看下表,表中的運算符從上到下,對應的優先級從高到低。
運算符
備注
**
冪運算
~ + -
按位取反、正號、負號
* / % //
乘、除、取模、取整除
+ -
加法、減法
>> <<
右移、左移
&
按位與
| ^
按位或、按位異或
<= < > >=
比較運算符
== !=
等于、不等于
= %= /= //= -= += *= **=
賦值運算符
is is not
身份運算符
in not in
成員運算符
not and or
邏輯運算符
條件控制在Python中,使用if、elif、else這三個關鍵字進行條件判斷與執行控制。
a = 66if a < 66: print('condition 1')elif a < 88: print('condition 2')elif a < 100: print('condition 3')else: print('condition 4')
if、else還可以用作三目運算符,用于簡化代碼。
a = 100b = 9 if a < 188 else 10
在Python 3.10中,新增了match、case的條件判斷。match後的對象會依次與case後的值進行匹配,如果匹配成功,則執行匹配到的表達式;否則,直接跳過。case _則可以匹配剩下的所有情況,但只能放在最後面,否則,運行時會提示類似的錯誤信息:wildcard makes remaining patterns unreachable。
a = 2match a: case 1: print('condition 1') case 2: print('condition 2') case 3: print('condition 3') case _: print('all')
循環在Python中,使用while和for in進行循環的執行。在循環體中,continue用于退出本次循環,繼續執行下一次循環;break則用于退出整個循環。while和for in後面,還可以添加else語句。當循環正常退出時,會執行else裏面的代碼;當循環執行了break跳出時,不會執行else裏面的代碼。
i = 0while (i < 10): if i == 5: i += 1 continue print(i) i += 1else: # 會執行下面的語句,因爲是正常退出循環的 print('while loop completed')a = ['C', 'S', 'D', 'N']for item in a: if item == 'D': break print(item)else: # 不會執行下面的語句,因爲是通過break跳出循環的 print('for loop completed')
#!/usr/bin/python3的作用在有些Python源碼中,會發現文件的首行爲:#!/usr/bin/python3或#!/usr/bin/env python3。這條語句在Windows下基本沒什麽作用,主要在Linux、Mac等系統下生效。當使用chmod +x file.py命令增加file.py文件的可執行權限後,可以通過上面的語句找到python3程序,進而通過./file.py的方式直接執行python源碼文件。
#!/usr/bin/python3和#!/usr/bin/env python3區別在于:前者直接指定了python3解釋器的具體路徑,後者則讓env去查找python3的路徑,並替換作爲python3解釋器的具體路徑。