30天學會 Python: Day 7-無限輪迴
range(start=0, stop, step=1)
用來產生 整數等差數列 的函式,常和今天要講的 for
憶起使用
有三個參數,start
表示數列的第一項(預設為0),數列最後一項不能超過 stop
,step
代表數列的公差(預設為1)
因為 start
, step
有預設值所以 range()
只要有一個引數 stop
就能使用
要顯示 range()
產生的內容,可以先存進一個串列(或其他容器)中
l=list(range(5))
print(l)
因為 stop
是數列的上限(不能超過),所以不會包含5
有兩個引數時,第一個引數代表數列的開始
l=list(range(2, 5))
print(l)
有三個引數時,第一個引數是開始,第三個引數是公差
l=list(range(0, 5, 2))
print(l)
l=list(range(1, 10, 3))
print(l)
數列可以是倒數
l=list(range(0, -10, -1))
print(l)
迴圈
用來表示重複執行的指令,有 while
和 for
兩種
while
語法類似 if
,差別在 if
只會執行一次,while
會重複執行,直到條件不成立則跳過
while <條件>:
<執行的內容>
⋮
<執行的內容>
所以 while
執行的順序是: 判斷(成立)→執行內容→判斷(成立)→執行內容→...→判斷(不成立)→結束迴圈
下面例子中,只有 x<3
時才會執行迴圈中的內容,每次執行 x
都會遞增1,所以會在視窗上顯示0~2
因為最後一行的 print()
不在迴圈中,所以不論如何都會被執行
x=0
while x<3:
print(x)
x=x+1
print('end')
透過迴圈列出串列中所有的元
i=0
data=[4, 5, 3, 7, 10, 43]
while i!=len(data):
print(data[i])
透過迴圈找到 n
以內所有2的次方
m=1
n=int(input())
while m<n:
print(m)
m=m*2
for
for
的語法是:
for <var> in <sequence>:
<執行的內容>
⋮
<執行的內容>
<var>
是一個自訂的名稱,可以像變數一樣在迴圈的內容中使用(但值不可變),<sequence>
是容器、range()
等帶有多個數值的資料
for
的作用是讓 <var>
在迴圈執行第 n 次的時候,變成 <sequence>
的第 n 項
所以透過 for
可以從一個容器中的第一項開始,依序看到最後一項
data = [4, 5, 3, 7, 10, 43]
for i in data:
print(i)
i
在第一次執行時為 data
的第一項(4),第二次執行時為 data
的第二項(5)...第六次執行時為 data
的第六項(43),因為總共只有六項,所以迴圈結束
但指派 <var>
不會更改 <sequence>
的內容
data = [4, 5, 3, 7, 10, 43]
for i in data:
i=10
print(i)
print(data)
雖然每次迴圈都把 i
指派為10,但實際上 data
的內容沒有改變
和 range()
結合可以列出等差數列
for i in range(5):
print(i)
也可以透過 range()
產生從0開始的數列,再透過這個數列取得容器中的值
data = [4, 5, 3, 7, 10, 43]
for i in range(len(data)):
print(data[i])
這個例子中,data
的長度是 6
,所以len(data)
的結果是6
range(len(data))
等同 range(6)
,會產生0, 1, 2, 3, 4, 5共6個數字
所以 data[i]
在第一次執行時等同 data[0]
,第二次等同 data[1]
...第六次等同 data[5]
如果資料是字典(Dict),可以用 keys()
取得字典中的所有鍵,再透過鍵取得值
student={
'name': 'Jay',
'age': 18,
'single': True
}
for key in student.keys():
print(student[key])
用 range()
vs 不用 range()
如果迴圈執行的內容只用到資料的 值,且不需要知道目前的元是第幾個,那就可以不用 range()
列出 data
中每個元的平方,兩種方式都可以
data = [4, 5, 3, 7, 10, 43]
for num in data:
print(num**2)
data = [4, 5, 3, 7, 10, 43]
for i in range(len(data)):
print(data[i]**2)
將 l1
的元乘上2,再將計算的結果存到 另一個 串列中
l1 = [4, 5, 3, 7, 10, 43]
l2 = []
for num in data:
l2.append(num*2)
print(l1)
print(l2)
如果迴圈執行的內容需要知道目前的數值是第幾項,就必須用 range()
如果要把計算的結果存到 原本的 串列中,就必須知道現在計算的資料在串列中的位置
l1 = [4, 5, 3, 7, 10, 43]
for i in range(len(data)):
data[i]=data[i]*2
print(l1)
或是會用到其他項的資料的時候也必須用 range()
下面例子中,l2
的第 n 項是 l1
的第 n 和 n+1 項的和
range()
的引數是 len(l1)-1
,因為如果是 len(l1)
的話最後一次的 i
會變成5,l1[i+1]
(等同l1[6]
)不存在
l1 = [4, 5, 3, 7, 10, 43]
l2 = []
for i in range(len(l1)-1):
l2.append(l1[i]+l1[i+1])
print(l1)
print(l2)