1. 程式人生 > 其它 >python王者歸來—學習筆記(8)

python王者歸來—學習筆記(8)

第七章 迴圈語句(for迴圈、range()函式、range在快速生成列表的應用)

一、for迴圈可以讓程式將整個物件內的元素遍歷(也可以稱迭代),基本語法格式如下:

for var in 可迭代物件:
    程式程式碼區塊

可迭代物件(iterable object)可以是列表、元組、字典、集合或range( ),上述語法可以解釋為將可迭代物件的元素當作var,重複執行,直到每個元素皆被執行一次,整個迴圈才會停止。設計上述程式程式碼時,必須要留意縮排的問題,可以參考if語句縮排,即for語句內程式程式碼要同時縮排對齊:

players = ['curry', 'james', 'durant', 'owen']
for player in players:
    print(player.title() + ", it was a great game.")
    print("我迫不及待想看下一場比賽," + player.title())

for迴圈可以應用在區間列表上(即列表切片):

players = ['curry', 'james', 'durant', 'owen']
print("列印前3位球員:")
for player in players[:3]:
    print(player)
print("列印後3位球員:")
for player in players[-3:]:
    print(player)

Python沒有提供刪除整個列表元素的方法,不過我們可以使用for迴圈完成此工作:

fruits = ['蘋果', '香蕉', '西瓜', '葡萄', '柚子']
print("目前水果列表:", fruits)

for fruit in fruits[:]:
    fruits.remove(fruit)
    print("刪除 %s" % fruit)
    print("目前水果列表:", fruits)

這裡for語句中可迭代物件必須用fruits[:],是原來列表物件fruits的深拷貝,不能直接用列表物件fruits,否則會導致迭代遍歷不完整,只能刪除一部分列表元素。

二、Python可以使用range( )函式產生一個等差序列,我們又稱這等差序列為可迭代物件(iterable object),也可以稱是range物件。由於range( )是產生等差序列,我們可以直接使用,將此等差序列當作迴圈的計數器。在前面我們使用”for var in 可迭代物件”當作迴圈,這時會使用可迭代物件元素當作迴圈指標,如果是要迭代物件內的元素,這是好方法,但是如果只是要執行普通的迴圈迭代,由於可迭代物件佔用記憶體空間,所以這類迴圈需要佔用較多系統資源。這時我們應該直接使用range( )物件,這類迭代只有迭代時的計數指標需要記憶體,所以可以節省記憶體空間。range( )的用法與列表的切片(slice)類似:range(start, stop, step)。上述stop是唯一必須的值,等差序列是產生stop的前一個值。例如:如果省略start,所產生等差序列範圍是從0至stop-1。step的預設是1,所以預設等差序列是遞增1。如果將step設為2,等差序列是遞增2。如果將step設為-1,則是產生遞減的等差序列。start或end可以是負整數,如果終止值小於起始值(遞增序列)或者終止值大於起始值(遞減序列)則產生空序列或稱空range物件。

程式設計時應用range( ),可以產生程式精簡的效果:

#一般程式設計寫法
n = int(input("請輸入一個整數: "))
total = 0
for i in range(1, n+1):
    total += i
print("總和為:", total)

#精簡程式設計寫法
n = int(input("請輸入一個整數: "))
total = sum(range(n+1))
print("從1到%d總和為:" % n, total)

三、我們可以採用一種精簡的方式來快速生成新列表,語法格式為: 新列表 = [表示式 for 專案 in 可迭代物件]。上述語法觀念是,將每個可迭代物件套入表示式,每次產生一個列表元素。此外,還可以在該語法中加入if條件判斷,語法格式為:新列表 = [表示式 for 專案 in 可迭代物件 if 表示式]。

'''
建立一個整數平方的列表,為了避免數值太大,
若是輸入值大於10,此大於10的數值將被設為10。
'''
#一般程式設計寫法
n = int(input("請輸入一個整數: "))
if n > 10: n = 10
squares = []
for i in range(1, n+1):
    squares.append(i ** 2)
print(squares)

#精簡程式設計寫法
n = int(input("請輸入一個整數: "))
if n > 10: n = 10
squares = [i **2 for i in range(1, n+1)]
print(squares)
#生成1,3,...9的奇數列表
oddlist = [num for num in range(1, 10) if num % 2 == 1]
print(oddlist)
'''
勾股定理,基本觀念是直角三角形兩邊長的平方和等於斜邊的平方,如下:
a^2 + b^2 = c^2
這個程式會生成0~19間符合定義的a、b、c列表值。
'''
x = [(a,b,c) for a in range(1, 20) for b in range(a, 20) for c in range(b, 20)
     if a**2 + b**2 == c**2]
print(x)
colors = ["Red", "Green", "Blue"]
shapes = ["Circle", "Square"]
result = [[color, shape] for color in colors for shape in shapes]
print(result)

#list unpacking,從每個巢狀列表中拉出color和shape的列表元素值
for color, shape in result:
    print(color, shape)

四、一個迴圈內有另一個迴圈,我們稱這是巢狀迴圈。如果外迴圈要執行n次,內迴圈要執行m次,則整個迴圈執行的次數是n*m次,設計這類迴圈時要特別注意下列事項:

● 外層迴圈的索引值與內層迴圈的索引值必須不同。

● 程式程式碼的內縮一定要小心。

#列印9*9乘法表
for i in range(1, 10):
    for j in range(1, 10):
        if (j <= i):
            print("%d*%d=%-3d" % (i, j, i*j), end=" ")
    print() #換行輸出

在設計for迴圈時,如果期待某些條件發生時可以離開迴圈,可以在迴圈內執行break指令,即可立即離開迴圈,這個指令通常是和if語句配合使用:

for 變數 in 物件:
    程式程式碼塊1
    if 條件表示式:      #判斷條件表示式
        程式程式碼塊2
        break          #如果條件表示式為True則離開迴圈
程式程式碼塊3 

在設計for迴圈時,如果期待某些條件發生時可以不往下執行迴圈內容而繼續執行下一次迴圈,此時可以用continue指令,這個指令通常是和if語句配合使用:

for 變數 in 物件:
    程式程式碼塊1
    if 條件表示式:      #判斷條件表示式
        程式程式碼塊2
        continue       #如果條件表示式為True則不執行for迴圈中的程式程式碼塊3
    程式程式碼塊3 
#列出所有身高是200(含)公分以上的球員資料
players = [['james', 202],
           ['curry', 193],
           ['durant', 205],
           ['david', 211],
           ['jordan', 198]]

for player in players:
    if player[1] < 200:
        continue
    print(player)


for player, height in players:
    if height < 200:
        continue
    print(player, height)

在設計for迴圈時,如果期待所有的if條件是False時,在最後一次迴圈後,可以執行特定程式區塊指令,可使用這個for...else迴圈,這個指令通常是和if和break語句配合使用。

for 變數 in 物件:
    程式程式碼塊1
    if 條件表示式:      #判斷條件表示式
        程式程式碼塊2
        break          #如果條件表示式為True則離開迴圈
    程式程式碼塊3 
else:
    程式程式碼塊4         #最後一次迴圈條件表示式是False時執行該程式程式碼塊
'''
測試某一個數字n是否是質數,質數的條件是:
● 2是質數。
● n不可被2至n-1的數字整除。
'''
num = int(input("請輸入大於1的整數做質數測試:"))
if num == 2:
    print("%d是質數" % num)
else:
    for n in range(2, num):
        if num % n == 0:
            print("%d不是質數" % num)
            break
    else:  #最後一次迴圈if條件仍然為False時執行
        print("%d是質數" % num)