iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Software Development

0基礎也看得懂的程式設計-30天學會 Python系列 第 8

30天學會 Python: Day 7-無限輪迴

range(start=0, stop, step=1)

用來產生 整數等差數列 的函式,常和今天要講的 for 憶起使用
有三個參數,start 表示數列的第一項(預設為0),數列最後一項不能超過 stopstep 代表數列的公差(預設為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)

迴圈

用來表示重複執行的指令,有 whilefor 兩種

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)


上一篇
30天學會 Python: Day 6- 你的加法不是你的加法
下一篇
30天學會Python: Day 8-維度展開 二維容器
系列文
0基礎也看得懂的程式設計-30天學會 Python30

尚未有邦友留言

立即登入留言