python學習筆記(二)流程控制

主要內容:

  • 用while循環重複執行代碼
  • 用if-elif-else語句執行判斷
  • 用for循環遍歷列表
  • 使用列表和字典推導式
  • 用縮進標識語句和代碼塊
  • 對布爾值和布爾表達式求值

(一)while循環

while循環結構如下:

while condition:
    body
else:
    post-code

condition是一個布爾表達式,返回結果爲True或False。如果condition返回結果爲True,則循環執行body部分代碼;如果返回結果爲Flase,則while循環執行post-code代碼,然後停止運行。Python解釋器根據代碼縮進的級別來識別這兩個部分。

注意,這裏的else部分是可選的。

continue語句:執行了continue語句,會導致body剩餘的語句被跳過,進行下一次condition計算,循環繼續進行。

break語句:執行了break語句,while循環立即終止。

(二)if-elif-else語句

最通用的if-elif-else結構的形式如下;

if condition1:
    body1
elif condition2:
    body2
.
.
else:
    body(n)

如果condition1返回的結果爲True,則執行body1語句;否則,如果condition2返回的結果爲True,則執行body2語句,一次類推,最後沒有返回True的condition,則執行else語句。

pass語句用作語句的佔位符,但是它不執行任何操作。

if x < 5:
    pass
else:
    x = 5

如下例:

'''
7.猜拳遊戲
石頭 剪刀 布
 0    1   2
 數據:
    unum 0 1 2
    cnum 0 1 2
'''
import random
unum=int(input("石頭(0),剪刀(1),布(2) 請選擇:"))
cnum=random.randint(0,2) #[0,2)
 
l = '石頭, 剪刀, 布'.split()
 
print("用戶:%s"%l[unum])
print("電腦:%s"%l[cnum])
if unum==0 and cnum==1:
	print("贏了!")
elif unum==0 and cnum==2:
	print("輸了!")
elif unum==1 and cnum==2:
	print("贏了!")
elif unum==1 and cnum==0:
	print("輸了!")
elif unum==2 and cnum==0:
	print("贏了!")
elif unum==2 and cnum==1:
	print("輸了!")
else:
    print('平局!')

(三)for循環

for循環遍歷的是任何可迭代對象的返回值,也就是任何可以生成值序列的對象。例如,for循環可以挨個遍歷列表、元組或字符串的元素。這裏可迭代的對象還可以是特殊的range函數,或者被稱爲生成器(generator),或生成器表達式的特殊類型函數。常見形式爲:

for item in sequence:
    body
else:
    post-code

對sequence的每個元素都會執行一次body部分的語句。一開始item會被設爲sequence的第一個元素,並執行body部分;然後item會被設爲sequence的第二個元素並執行body部分,等等,對sequence的其餘元素會逐個一次處理。

else部分是可選的。像while循環的else部分一樣,很少被用到。break和continue在for循環中的作用,和在while循環中是一樣的。

以下循環將會打印出x中每個數字的倒數:

>>> x = [1,2,3,4,5,6]
>>> for i in x:
	print(1/i)

	
1.0
0.5
0.3333333333333333
0.25
0.2
0.16666666666666666

在for循環體中,break 語句可以跳出 for 和 while 的循環體。如果你從 for 或 while 循環中終止,任何對應的循環 else 塊將不執行。
continue 語句被用來告訴 Python 跳過當前循環塊中的剩餘語句,然後繼續進行下一輪循環。

1.range函數

有時候循環需要顯式的索引(如值在列表中出現的位置)。這是可以將range函數和len函數結合起來使用,生成供for循環使用的索引序列。

x = [1, 3, 5, 6, -7, 9, -6]

for i in range(len(x)):
    if x[i] < 0:
        print('Found a negative number at index', i)

2.用初值和步進值控制range函數

如果你需要遍歷數字序列,可以使用內置range()函數。它會生成數列,也可以使用range指定區間的值。

range函數有兩個變體,可以對生成的值序列施以更多的控制。如果range函數帶有兩個數值參數,則第一個參數是結果序列的起始值,第二個參數是結果序列的結束值(不含)。

>>> for i in range(5):
	print(i)

	
0
1
2
3
4
>>> for i in range(3, 9):
	print(i)

	
3
4
5
6
7
8

也可以使range以指定數字開始並指定不同的增量(甚至可以是負數,有時這也叫做’步長’):

>>> for i in range(0, 10, 3):
	print(i)

	
0
3
6
9

負數

>>>for i in range(-10, -100, -30) :
    print(i)
 
    
-10
-40
-70

還可以使用range()函數來創建一個列表,這裏list()函數的作用是把range函數生成的值強制轉換爲列表。

>>> list(range(5))
[0, 1, 2, 3, 4]

3.for循環和元組拆包

元組拆包操作可以讓某些for循環變得簡潔一些。以下代碼將讀取元組列表,每個元組中包含兩個元素,計算每個元組中兩個數的乘積並進行加和。

somelist = [(1,2), (3, 7), (9, 5)]
result = 0
for t in somelist:
    result = result + (t[0] * t[1])

以下代碼效果相同但是更爲簡潔

somelist = [(1,2), (3, 7), (9, 5)]
result = 0
for x, y in somelist:
    result = result + (x * y)

元組的這種用法是Python提供的一種便利手段,表示列表的每個元素都應該是大小一致的元組,以便能拆包到for關鍵字後面跟着的元組變量中。

4.enumerate函數

enumerate函數返回的是元組(索引,數據項)。這樣可以不通過索引來訪問列表的數據項。索引是可用的。

x = [1, 3, 5, 6, -7, 9, -6]

for i, n in enumerate(x):
    if n < 0:
        print('Found a negative number at index', i)

5.zip函數

zip函數可以從一個或多個可迭代對象中逐一讀取對應元素,並合併爲元組,直至長度最短的那個可迭代對象讀取完畢。

>>> x = [1, 2, 3, 4]
>>> y = 'a, b, c'.split()
>>> z = zip(x, y)
>>> list(z)
[(1, 'a,'), (2, 'b,'), (3, 'c')]

6.實例:

通過for循環打印循環次數,i、j、k分別代表每一個for循環函數的循環次數:

total = 0

for i in range(1, 5):
    for j in range(1, 5):
        for k in range(1, 5):
            if (i != k) and (i != j) and (j != k):
                total += 1
                print("{0}{1}{2}".format(i, j, k))

print("Total: ", total)

(四)列表和字典推導式

利用for循環遍歷列表、修改或選中某個元素、新建列表或字典,這些都是十分常見的用法。

>>> x = [1, 2, 3, 4]
>>> x_squared = []
>>> for item in x:
	x_squared.append(item * item)

	
>>> x_squared
[1, 4, 9, 16]

推導式:

#列表推導式
new_list = [expression1 for variable in old_list if expression2]
#字典推導式
new_dict = [expression: expression2 for variable in list if expression3]

上述例子可以用推導式

>>> x = [1, 2, 3, 4]
>>> x_squared = [item * item for item in x]
>>> x_squared
[1, 4, 9, 16]

甚至可以用if語句來篩選列表的項

>>> x = [1, 2, 3, 4]
>>> x_squared = [item * item for item in x if item > 2]
>>> x_squared
[9, 16]

字典推導式也類似,但是需要同時給出鍵和值。如果要實現類似上面的例子,需要把數字作爲字典鍵,數字的平方作爲字典值,就可以用字典推導式來實現。

>>> x = [1, 2, 3, 4]
>>> x_squared_dict = {item: item * item for item in x}
>>> x_squared_dict
{1: 1, 2: 4, 3: 9, 4: 16}

生成器表達式

生成器表達式(generator expression)類似於列表推導式,看起來於列表推導式十分相像,只是用圓括號代替了方括號而已。


>>> x_squared = (item * item for item in x)
>>> x_squared
<generator object <genexpr> at 0x0000026799383660>
>>> for squared in x_squared:
	print(squared, )

	
4
9
16

注意,除方括號的變化之外,生成器表達式還不返回列表。如上所示,生成器表達式返回的是生成器對象,可用作for循環中的迭代器,這與range()函數的用途非常類似。使用生成器表達式的優點是,不會在內存中生成整個列表。因此可以生成任意大小的值序列,內存開銷也很小。

(五)語句、代碼塊和縮進

Python用語句縮進來確定流程控制結構不同代碼塊(即語句體)的邊界。一個代碼塊由一條或者多條語句組成,語句之間通常由換行符分隔。賦值語句、函數調用、print函數、佔位用的pass語句和del語句都是Python語句。代碼流程控制結構(if-elif-else、whlie和for循環)則屬於複合語句。

複合語句由一條或多條子句組成,每條子句後面跟着縮進代碼塊。複合語句可以像任何其他語句一樣出現在代碼塊中,這樣就創建了嵌套代碼塊。

如果語句之間使用分號分隔,則可以在同一行放置多條語句。

Python對縮進量沒有限制,也不會報錯。只要保持同一個代碼塊中的縮進量一致,縮進多少字符都沒有關係,推薦標準是使用4個空格。

任何由空白字符分隔的字符串都會被Python解釋器自動拼接起來。

(六)布爾值和布爾表達式

Python有一種布爾對象類型,可以被賦爲True或False。所有布爾操作表達式都返回True或False。

大多數Python對象都能用作布爾類型

  • 數字0、0.0、和0 + 0j都是False,其他數字均爲True;
  • 空字符串" "是False,其他字符串均爲True;
  • 空列表[ ]是False,其他列表均爲True;
  • 空字典{ }是False,其他字典均爲True;
  • 空集合()是False,其他集合均爲True;
  • Python的特殊值None始終爲False。

通常情況下,Python的其他數據結構同樣適用於上述規則。如果數據結構爲空或0,則在布爾上下文中將被視爲False,否則被視爲True。某些對象(如文件對象和編碼對象)對0或空元素沒有明確的定義,這些對象也不應該在布爾上下文中使用。

Python常用操作符

用普通的<、<=、>、>=等操作符,就可以進行對象之間的比較。==是判斷相等操作符,!=是判斷不等操作符。in和not in操作符用於判斷是否屬於序列(列表、元組、字符串和字典)的成員,身份操作符is和is not用於判斷判斷兩個對象是否爲同一個對象。

比較運算符

以下實例演示了Python所有比較運算符的操作:

a = 21
b = 10
c = 0
 
if ( a == b ):
   print ("1 - a 等於 b")
else:
   print ("1 - a 不等於 b")
 
if ( a != b ):
   print ("2 - a 不等於 b")
else:
   print ("2 - a 等於 b")
 
if ( a < b ):
   print ("3 - a 小於 b")
else:
   print ("3 - a 大於等於 b")
 
if ( a > b ):
   print ("4 - a 大於 b")
else:
   print ("4 - a 小於等於 b")
 
# 修改變量 a 和 b 的值
a = 5;
b = 20;
if ( a <= b ):
   print ("5 - a 小於等於 b")
else:
   print ("5 - a 大於  b")
 
if ( b >= a ):
   print ("6 - b 大於等於 a")
else:
   print ("6 - b 小於 a")

輸出結果爲:

1 - a 不等於 b
2 - a 不等於 b
3 - a 大於等於 b
4 - a 大於 b
5 - a 小於等於 b
6 - b 大於等於 a

布爾操作符

通過and、or、not操作符,可以將返回布爾值的多個表達式組合成更爲複雜的表達式。

a = 10
b = 20
 
if ( a and b ):
   print ("1 - 變量 a 和 b 都爲 true")
else:
   print ("1 - 變量 a 和 b 有一個不爲 true")
 
if ( a or b ):
   print ("2 - 變量 a 和 b 都爲 true,或其中一個變量爲 true")
else:
   print ("2 - 變量 a 和 b 都不爲 true")
 
# 修改變量 a 的值
a = 0
if ( a and b ):
   print ("3 - 變量 a 和 b 都爲 true")
else:
   print ("3 - 變量 a 和 b 有一個不爲 true")
 
if ( a or b ):
   print ("4 - 變量 a 和 b 都爲 true,或其中一個變量爲 true")
else:
   print ("4 - 變量 a 和 b 都不爲 true")
 
if not( a and b ):
   print ("5 - 變量 a 和 b 都爲 false,或其中一個變量爲 false")
else:
   print ("5 - 變量 a 和 b 都爲 true")

輸出結果爲:

1 - 變量 a 和 b 都爲 true
2 - 變量 a 和 b 都爲 true,或其中一個變量爲 true
3 - 變量 a 和 b 有一個不爲 true
4 - 變量 a 和 b 都爲 true,或其中一個變量爲 true
5 - 變量 a 和 b 都爲 false,或其中一個變量爲 false

短路求值

>>> def ReturnTrue():
	print('ReturnTrue() was called')
	return True

>>> def ReturnFalse():
	print('ReturnFalse() was called')
	return False

>>> ReturnTrue()
ReturnTrue() was called
True
>>> ReturnFalse()
ReturnFalse() was called
False
>>> ReturnFalse() or ReturnTrue()
ReturnFalse() was called
ReturnTrue() was called
True
>>> ReturnTrue() or ReturnFalse()
ReturnTrue() was called
True

優先級

優先級的規則有很多,如果不太確定,可以使用圓括號來確保Python按照要求解釋表達式。如果表達式比較複雜,無論是否必要,用圓括號可能都是比較好的做法,因爲這可以讓以後維護代碼的人確切地理解代碼地意圖。

參考:

  1. 菜鳥教程
  2. 碼雲:https://gitee.com/luhuadong/Python_Learning
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章