如果你想要循序取出某個序列,例如串列,則可以使用for陳述句,例如,將使用者提供的命令列引數逐一取出:
import sys
for arg in sys.argv:
print(arg)
一個執行的範例如下:
> python demo.py justin momor
demo.py
justin
momor
demo.py
justin
momor
實際上,只要是具有__iter__()方法的物件,都可以使用for陳述句來迭代,__iter__()方法應該傳回一個迭代器(Iterator),該迭代器具有__next__()方法,每次迭代時就會傳回下一個物件,而沒有下一個元素時,則會引發StopIteration例外。可以使用iter()方法嘗試從物件上取得迭代物件。例如:
>>> iterator = [1, 2, 3].__iter__()
>>> iterator.__next__()
1
>>> iterator.__next__()
2
>>> iterator.__next__()
3
>>> iterator.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> iterator = iter([1, 2, 3])
>>> iterator.__next__()
1
>>> iterator.__next__()
2
>>> iterator.__next__()
3
>>> iterator.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> iterator.__next__()
1
>>> iterator.__next__()
2
>>> iterator.__next__()
3
>>> iterator.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> iterator = iter([1, 2, 3])
>>> iterator.__next__()
1
>>> iterator.__next__()
2
>>> iterator.__next__()
3
>>> iterator.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
對於具有__iter__()所傳回的迭代器,你也可以直接使用next()取得下一個元素,而不用直接呼叫__next__()方法。
所以你可以使用for迭代字串、串列、集合、字典或Tuple等,只要物件上具有__iter__()方法。除了逐元素來進行迭代外,還可以結合指定運算的特性。例如:
>>> for (a, b) in [(1, 2), (10, 20), (100, 200)]:
... print(a, b)
...
1 2
10 20
100 200
>>> for (key, value) in {'admin' : 'Justin', 'user' : 'momor'}.items():
... print(key, value)
...
admin Justin
user momor
>>>
... print(a, b)
...
1 2
10 20
100 200
>>> for (key, value) in {'admin' : 'Justin', 'user' : 'momor'}.items():
... print(key, value)
...
admin Justin
user momor
>>>
如果你有指定範圍或索引的需求,則可以使用range()類別產生一個range物件,由它來迭代出所指定的數字範圍,而你再利用這些數字作為索引:
>>> for index in range(2, 5):
... print(index)
...
2
3
4
>>> for index in range(5):
... print(index)
...
0
1
2
3
4
>>> for index in range(0, len('Justin'), 2):
... print('Justin'[index])
...
J
s
i
>>>
... print(index)
...
2
3
4
>>> for index in range(5):
... print(index)
...
0
1
2
3
4
>>> for index in range(0, len('Justin'), 2):
... print('Justin'[index])
...
J
s
i
>>>
如上所看到的,range類別可以指定起始、結結與步進值:
range([start,] stop[, step]) -> range object
for陳述可以搭配一個可選的else陳述,當for迴圈中沒有遇到任何break陳述而離開迴圈時,就會執行else區塊。例如以下判斷輸入數字是否為質數:
number = int(input('輸入數字:'))
half = number // 2
for num in range(2, half + 1):
if (number % num) == 0:
print(number, '不是質數')
break
else:
print(number, '是質數')
一個執行的範例如下:
輸入數字:13
13 是質數
13 是質數
break陳述可以讓你離開迴圈,而continue則可以讓你跳過該次迭代continue後的程式碼,直接作下一次迭代。例如以下僅顯示小寫英文字母:
text = input('輸入英文字母:')
for letter in text:
if letter.isupper():
continue
print(letter, end='')
一個執行範例如下:
輸入英文字母:This is Justin's speaking!
his is ustin's speaking!
his is ustin's speaking!
while迴圈根據所指定的條件式來判斷是否執行迴圈本體,例如以下是個求最大公因數的程式:
print('輸入兩個數字...')
m = int(input('number 1: '))
n = int(input('number 2: '))
while n != 0:
r = m % n
m = n
n = r
print("GCD:", m)
Python中沒有其它語言的do while語句,所以必須使用判斷式及break來達成。例如判斷輸入為奇數或偶數,直到使用者回答No為止:
while True:
number = int(input('輸入數字:'))
print('輸入數為', '奇數' if number % 2 else '偶數')
if(input('繼續?(Yes/No)') == 'No'):
break
while陳述同樣可以搭配else陳述,同樣地,在迴圈中沒有遇到break的話,則else區塊會被執行,由於while一開始就會測試是否執行迴圈,所以若迴圈本體完全沒有執行(當然也就不會遇到break),一樣也會執行else區塊。