0. 前言 接著上一篇 "博客" 的內容,我將繼續介紹Python相關的語法。部分篇章可能不只是簡單的語法,但是對初學者很有幫助,也建議讀懂。 1. 表達式 由數字、符號、括弧、變數等組成的組合。 算術表達式 邏輯表達式 賦值表達式 在Python中,變數無需實現聲明,也不需要指定類型。 在Pyth ...
0. 前言
接著上一篇博客的內容,我將繼續介紹Python相關的語法。部分篇章可能不只是簡單的語法,但是對初學者很有幫助,也建議讀懂。
1. 表達式
由數字、符號、括弧、變數等組成的組合。
- 算術表達式
- 邏輯表達式
- 賦值表達式
- 在Python中,變數無需實現聲明,也不需要指定類型。
a = 1 # 無需聲明和指定類型
在Python中,賦值即定義,如果一個變數已經定義,賦值相當於重新定義。
2. 記憶體管理
在其他語言,如C++和C中,記憶體管理是非常重要的,因為在一段記憶體地址被釋放之後,記憶體中會留下一個“空洞”,造成記憶體碎片化。通常地,開發者會利用特定的策略來管理記憶體,把需要經常變動的值放到一個區域,靜態的值放到另一個區域。開發者手動管理維護記憶體,不僅麻煩,還很容易留下安全隱患。
在Python編程中無須關心變數的存亡,也不關心記憶體的管理。Python語言和Java一樣,採用了類似的垃圾收集的機制(Garbage Collection)。
簡單的理解:首先,在Python中,一切皆對象。Python使用引用計數ob_refcnt
記錄所有對象的引用數。當對象引用數ob_refcnt
變為0,它就被認為是生命結束了,記憶體也會被回收。例如在函數運行結束時,局部變數就會被自動銷毀,記憶體被回收。變數賦值給其他對象時,記憶體被回收。下麵舉一個例子:
num1 = 12 # 定義一個變數,這時候在記憶體中存放12這個值,num標識符對它進行引用,ob_refcnt=1
num2 = num1 # 現在num2和num1的值都在同一個地址,它被引用的次數為2,ob_refcnt=2
# 現在對上面兩個變數重新賦值,也就是相當於重新定義
num1 = 1
num2 = 2
# 這個時候,剛纔的記憶體中的12,因為被引用的次數為0,也就是ob_refcnt=2,那麼記憶體就被回收了
缺點:記憶體回收機制(Grabage Collection)因為是自動的,所以效率註定不高,在對程式性能要求高的環境中,這一點是致命的。 (不過也還是可以自己動手調一下的,這裡暫時不提)
作為初學入門的同學,先瞭解這麼多就可以了,如果想再全面地瞭解,這裡推薦一篇博客我認為寫得挺好的,以供參考。[點擊這裡]
3. 程式控制
3.1 順序結構
所謂順序結構,也就是串列。就是一條一條語句按照順序執行。比如:先洗手,再吃飯,再洗碗。
# 下麵三種行為按照從上到下的順序執行
washing_hand() # 洗手
eat() # 吃飯
washing_dishes() #洗碗
3.2 分支結構
分支結構:根據不同情況判斷,條件滿足執行某條件下的語句。
3.2.1 if...else...語句
比如,小明考試及格,就吃金拱門,考試不及格,就罰做家務。
if score >= 60: # 這裡設置60分為及格
eat_KFC() # 及格了就吃金拱門
else: # 否則
do_housework() # 不及格就做家務
if...else...就是Python中用作判斷的語句。if後面的條件語句就是判斷的依據,它返回的是一個布爾值。而if下麵的都是代碼塊,是在if條件語句為True的時候,才會執行。
3.2.2 if...elif...else...語句
上面的例子是單分支結構,要實現多分支結構該怎麼辦呢?下麵有一個例子:
myScore = 58
if myScore >= 80 and myScore<=100:
print("Good.") # 八十分以上,優秀
elif myScore >=60 and myScore <80:
print("Pass.") # 六十分以上,及格
elif myScore<60 and myScore>=0:
print("Fail.") # 六十分以下,不及格
else: # 在上麵條件之外的,也就是小於0分或者大於100分了,那麼就算做是錯誤分數了
print("錯誤分數")
有部分情況下,條件語句並沒有返回一個__布爾值__怎麼辦呢?在Python中,如果在if後面的條件語句沒有返回一個布爾值,那麼它會把這個語句放進bool()
函數中進行轉換,轉換後就會返回一個布爾值了。
if 3: # 這裡的3並不是一個條件語句,它經過bool()函數轉換成布爾值,但是這個操作是我們看不到的
print('True')
else:
print('False')
下麵,給出一些常見的對象/常量經過bool()函數轉換後的值,以供參考
對象/常量 | 值 |
---|---|
“”-空字元串 | 假 |
“string”-非空字元串 | 真 |
0 | 假 |
非0 - 一個非0實數 | 真 |
()空元組 | 假 |
[]空列表 | 假 |
{}空字典 | 假 |
None | 假 |
3.3 迴圈結構
迴圈結構:條件滿足就反覆執行,不滿足就不執行或不再執行。
3.3.1 while語句
比如,小明在七點前要寫作業,小明在7點之後可以看電視,所以他隔一會就檢查一次。
time = 5
while time<7: # 這是一個迴圈體,如果time<7,就會一直迴圈
do_homework() # 七點前做作業
time += 1 # 每一次迴圈加一個小時
watching_tv() # 跳出迴圈之後就執行看電視操作了
和if...else..結構類似,while下麵的語句塊也是在條件滿足的時候執行,直到條件不滿足後退出。
3.3.2 for語句
還有另一個語句可以實現迴圈結構——for語句。他的結構是這樣的:
for element in sequence: # 當可迭代對象中有元素可以迭代,進入迴圈體,執行block
block
上面所提到的可迭代對象,簡單理解可以說是一組元素,比如[1, 2, 3]
首先,先介紹一下range(start, stop[, step])
函數。
參數說明:
- start: 計數從 start 開始。預設是從 0 開始。例如range(5)等價於range(0, 5);
- stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5
- step:步長,預設為1。例如:range(0, 5) 等價於 range(0, 5, 1)
下麵再舉個for迴圈的例子:
for i in range(10):
print(i)
執行結果:
0
1
2
3
4
5
6
7
8
9
迴圈一共執行了10次,每一次i獲取range(10)返回的列表中的一個元素。直到range(10)的元素被獲取完了,迴圈就結束了。
3.3.3 continue語句
continue語句的作用是:中斷當前迴圈的當次操作,繼續下一次迴圈,如果沒有下一次迴圈就結束迴圈。舉例,列印10以內的偶數:
for i in range(10):
if i % 2 == 1:
continue
print(i)
3.3.4 break語句
break語句:終止當前迴圈,跳出迴圈體。
舉例: 列舉1000以內被7整除的前20個數
count = 0 # count是一個計數器
for i in range(0, 1000, 7):
print(i)
count += 1 # 每次列舉一個數就加1
if count >=20: # 如果count大於等於20
break # 終止當前迴圈,跳出迴圈體
註:迴圈被break打斷叫不正常結束,else子句無效
3.3.5 迴圈 else子句
在while和for後面跟著的一個子句,結構如下
while condition:
block
else: # 在while迴圈正常結束後執行else裡面的代碼塊
block
for element in sequence:
block
else: # 在for迴圈正常結束後執行else裡面的代碼塊
block
迴圈異常拋出也是不正常結束,else子句無效。這種子句在特定情況下很有用,比如用於檢測迴圈是否正常結束。
3.4 嵌套結構
上面我們說的分支和迴圈,都是可以嵌套的。什麼是嵌套呢?下麵舉個例子,判斷一個數為幾位數:
print("輸入一個0-99999的數")
num = input(">>") # input()函數用作讀取鍵盤輸入
num = int(num) # input()函數讀取的輸入為字元串類型,因為Python是強類型語言,所以這裡要做一個類型轉換,轉換為整型
if num >= 1000:
if num >=10000:
print(5)
else:
print(4)
else:
if num >= 100:
print(3)
elif num >= 10:
print(2)
else:
print(1)
在if...else...中又插入一個或多個if...else...,這種方式就叫做嵌套。
上面的例子中,我並不是從五位數到四位數到三位數這樣一路判斷下來的,一方面是為了演示嵌套結構,另一方面,我這裡用到了二分搜索演算法,這種演算法從中間開始查找,如果是判斷一個一百位數,或者一千位數,這樣的演算法明顯會比順序查找高效得多。在以後的博客,我會再具體介紹演算法相關的內容。