昨天你學會了如何把東西放進list對吧!
今天我們來認識放數字的「自動排隊機」:
range()
這一篇只講
range()
(以及它如何搭配 list / if / elif 使用),
暫時還不會進入 for 迴圈。你可以把它當成為日後迴圈打基礎的暖身篇:
理解數字序列如何被產生、索引、檢查與運算, 未來要丟進迴圈時就能超順手。
range()
可以很省記憶體地表示一段連續(或等差)數字序列;它不是立刻產生全部數字,而是「懶惰地」描述這條序列。list(range(...))
。range()
的參數必須是整數(int
),且 step 不能為 0(會丟 ValueError
)。range()
也能跟 list
、if/elif/else
、索引搭配出很多實用的範例。range()
?想像你要產生 0 到 9999999 這樣一大串數字,
如果每個數字都一次性放到記憶體裡,那記憶體會很快被吃光。
range()
的巧妙之處是:它只存「產生規則」
(起點、終點、不包含終點、步長),不會馬上把所有數字放到記憶體。
這對大量數字的處理非常節省資源,也更接近「工廠流水線」的概念──你只描述如何排隊,等需要時再按規則取出。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]
這就是它的精妙之處:省記憶體、省時間,但一樣能生成你要的數字序列。
range()
到底是什麼?range() 函式在 Python 中是一個非常常用的內建函式,
它用來生成一個包含一系列數字的有序序列。
這個序列常常被用於在 for迴圈 中作為迭代的對象。
(明天就會介紹到這部分!)
簡單來說,range()
就像是一個「數字生產線」。
你只要告訴它起點、終點和步伐,它就會幫你把整隊數字排好。
它的基本格式是:
range(start, stop, step)
用法 | 範例 | 輸出結果 |
---|---|---|
只給 stop | range(5) |
0, 1, 2, 3, 4 |
給 start 與 stop | range(2, 6) |
2, 3, 4, 5 |
給 start, stop, step | range(1, 10, 2) |
1, 3, 5, 7, 9 |
💡range(整數):建立一個由0到整數-1的範圍物件
‼️小提醒:(這邊已經幫初學者踩雷過了!這邊真的會很常忘記!)
step
可以是負數,這樣數字會往後倒退!list()
來看結果range()
本身不會直接生成一個「完整的串列」,而是一個「可迭代物件」。
如果想一次看清楚裡面的數字,可以用 list()
包裝:
(轉換成 list 後,你就能使用所有 list 的操作(索引、切片、len、sum 等等))
print(list(range(5))) # [0, 1, 2, 3, 4]
print(list(range(2, 6))) # [2, 3, 4, 5]
print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9]
print(list(range(10, 0, -2))) # [10, 8, 6, 4, 2]
以range(10)來舉例的話,就是建立一個從0到10-1的範圍物件!
所以要注意,最後一個元素是9呦!!
這邊我會先結合前幾天教過的語法,
然後這邊先不會用到for-loop
(怕有些大佬會覺得接下來的範例會顯得有點生硬,範例的部分只是先讓初學者們一步一步踏實的把先前學過的語法結合起來!)
even_numbers = list(range(0, 21, 2)) # 0,2,4,...,20
print("偶數清單:", even_numbers)
test = int(input("請輸入想尋找的數字:"))
# 用 if 檢查
if test in even_numbers:
print(test," 在清單中")
else:
print(test," 不在清單中")
說明:range(0,21,2) 產生 0 到 20(包含 20)的偶數序列,
list() 把它轉成可檢視的清單;in 做成員判斷。
scores = list(range(55, 101, 15)) # [55,70,85,100]
print("模擬成績:", scores)
# 想看第二個成績(索引 1)
s = scores[1] # 70
if s >= 90:
grade = "A"
elif s >= 80:
grade = "B"
elif s >= 70:
grade = "C"
else:
grade = "D"
print("成績", s, "等級:", grade)
1.range()
的參數必須是整數(int
) ,傳入浮點數會拋TypeError。
2.step
不能為 0(很重要!)
`range(0, 10, 0)` 會丟 `ValueError`:`range() arg 3 must not be zero`。
3.range()
本身是「可索引」的
你可以直接 r = range(0, 10)
然後 r[3]
→ 3(不必轉成 list 才能索引)。
但若你要 slice(切片)或用 list 的方法,最保險做法是先 list(r)
。
4.in
在 range 上的效率
x in range(start, stop, step)
的檢查是高效的(不需要把整個序列展開),
Python 會基於數學關係檢查是否屬於該等差序列(例如是否落在範圍內且 (x - start) % step == 0)。
5.len(range(...)) 可以取得元素數量
len(range(0, 10, 2))
→ 5(0,2,4,6,8)。
6.負向 step
range(10, 0, -2)
會產生 10,8,6,4,2。
注意 start 必須大於 stop 才會有元素(否則為空)。
7.空的 range
range(5, 5)
是空序列;list(range(5,5))
→ []
。
8.記憶體效率
range(0, 10**9)
並不會分配 10 億個整數到記憶體,
這點讓它能在大數量操作時非常有用!
(當然實際遍歷會花時間,但記憶體佔用不會暴增)。
1.直接求和(快速檢查序列總和):
total = sum(range(1, 101)) # 1+2+...+100
print(total) # 5050
2.取最大 / 最小:
r = range(2, 20, 3)
print(min(r), max(r)) # 2 17
今天我們認識了 range()
,這個看似簡單卻威力強大的工具。
它的核心觀念是產生一連串的數字序列,而這樣的數字序列,
正是程式中最常被使用的模式之一。
💡回顧一下,我們今天學到:
1.range()
可以產生連續數字,從 0 開始到指定數字(但不包含終點)
list(range(5)) # [0, 1, 2, 3, 4]
2.它可以指定「起點、終點、間隔」:
list(range(2, 10, 2)) # [2, 4, 6, 8]
3.range() 搭配 list() 轉換,就能和我們昨天學到的「串列」結合,成為一個真正的數字倉庫。
明天,我們將正式進入 for 迴圈 的世界!
為什麼要學 for 迴圈?
因為程式語言的靈魂之一就是 重複運算。
很多時候,我們需要針對一個「序列」(像是字串、串列、甚至是今天學到的 range()
)裡的每一個元素,
逐一進行操作。
而這件事,用 if
判斷雖然做得到,但寫起來不僅麻煩,還很不優雅。
這時候,for
迴圈就派上用場了!
舉個例子:
今天如果我要印出 1 到 5 的數字,你可能會這樣寫:
print(1)
print(2)
print(3)
print(4)
print(5)
但是明天你會看到,利用 for + range(),這件事可以變得又簡單又漂亮:
(這邊偷偷暴雷一下~)
for i in range(1, 6):
print(i)
今天這邊主要是先介紹range()的入門以及與先前教過的語法進行結合。
明天會從 **for迴圈與range()**的搭配開始介紹起~
可以期待一下!當我們的語法庫越來越多的時候,代表可以做的事情即將越來越有趣!
辛苦啦!今天的內容也蠻豐富的!(不過內容只會越來越精彩)
希望讀者可以一起練習我每天出的範例,
打程式跟算數學一樣!都是要自己親手動手算算看打打看,才會知道哪裡不懂~
如果有疑惑的地方,也歡迎底下留言!
那麼我們就明天見囉!