回顧之二:迴圈、串列
Last updated: 2019/9/9
函式:range()
數列變數 = range(整數值) # 單一參數
list1 = range(5) # 注意不能用list當變數名稱
print(list(list1)) # 因為list()是內建函式
print(list1) # 印出'range(0, 5)'
print(type(list1)) # 印出 list1型別
基本語法❶
產生 0 到 (整數值 - 1) 的數列
範例
range(0, 5)
[0, 1, 2, 3, 4]
<class 'range'>
執行結果
從0開始, 共5個
注意方括弧: 代表「串列」(最重要的資料型別)
list(range物件): 可將range物件轉為「串列」
數列變數 = range(起始值, 終止值) # 二個參數的用法
list2 = range(5, 10) # 數列5,6,7,8,9
list3 = range(-3, 3) # 數列-3,-2,-1,0,1,2
list4 = range(5, 3) # 空數列, 因為起始值較大
基本語法❷
產生 「起始值」 到 (終止值 - 1) 的數列
範例
基本語法❸
數列變數 = range(起始值, 終止值, 間隔值) # 三個參數的用法
list5 = range(2, 10, 2) # 數列2,4,6,8
list6 = range(100, 90, -3) # 數列100, 97, 94, 91
範例
產生從「起始值」開始,遞增「間隔值」,直到 (終止值 - 1) 的數列
用於固定次數的迴圈
for 迴圈變數 in 數列:
程式區塊
基本語法
for, in都是保留字
迴圈變數自行取名
數列: 可用range()建立
程式區塊: 需縮排,可多行
for 迴圈變數 in range(起始值, 終止值, 間隔值):
程式區塊
終止值, 間隔值 可省略
使用range()建立數列
範例
for i in range(1000):
print('Hello')
print('這是第幾輪 %d' % i) # 印出迴圈變數值
範例3 : 計算正整數和
sum = 0
n = int(input('輸入正整數:'))
for i in range(1, n+1):
sum += i
print("1到%d的整數和是%d" % (n, sum))
輸入正整數:50
1到50的整數和是1275
執行結果
...
sum = 0
for i in range(3, 13, 3):
sum += i
...
題目:使用者輸入每件商品的價格和數量後,計算多筆商品的購買金額總和
# 設定商品數量
total_items = int(input("請輸入商品總數:"))
# 初始化總金額
total_price = 0
# 使用 for 迴圈遍歷每個商品
for i in range(total_items):
price = float(input(f"請輸入第 {i+1} 件商品的單價:"))
quantity = int(input(f"請輸入第 {i+1} 件商品的數量:"))
total_price += price * quantity
# 使用 f-string 輸出結果
print(f"所有商品的總金額為: {total_price:.2f} 元")
用於沒有固定次數的迴圈
while(條件式):
程式區塊
基本語法
沒有迴圈變數
注意[條件式]是否會一直[成立]
程式區塊: 需縮排,可多行
條件式的括弧 可省略
範例
total = n = 0
while(n < 10): # 條件式: n < 10
n += 1 # n 不會自動增加
total += n # 數值加總
print('加總:%d' % total)
無窮迴圈
範例2 : 輸入m值,找出大於m值最小n! (範例5-2-1)
m = int(input('輸入正整數:'))
total = i = 1
while(total < m):
i += 1
total *= i
print('%d階層 = %d' % (i, total))
輸入正整數:6000
8階層 = 40320
執行結果
範例3 : 猜數字!猜介於1~100的數字 (範例5-2-2)
import random # random 為亂數套件名稱
answer = random.randint(1, 100) # 1~100之間的隨機亂數
guess = 0
while guess != answer:
guess = int(input('猜介於1~100之間的數字'))
if guess > answer:
print('猜小一點')
elif guess < answer:
print('猜大一點')
else:
print('恭喜猜中答案 %d' % answer)
# 設定初始餘額
balance = 5000
# 使用 while 迴圈
while True:
print(f"目前餘額:{balance:.2f} 元")
withdraw = float(input("請輸入提款金額(輸入 0 以退出):"))
if withdraw == 0:
print("退出提款系統。")
break
elif withdraw > balance:
print("餘額不足,請重新輸入。")
else:
balance -= withdraw
print(f"已成功提款 {withdraw:.2f} 元,餘額剩餘 {balance:.2f} 元")
範例 : 模擬ATM 提款系統,使用者可以不斷輸入提款金額,直到餘額不足或選擇退出為止。
範例
height = int(input('三角形的高:'))
for i in range(1, height+1):
for j in range(1, i+1):
print('#', end = '')
print() # 換行, 外層迴圈
三角形的高:5
#
##
###
####
#####
執行結果
範例:以#字號畫出直角三角形
外圈變數i 用於改變內圈回合數
a = int(input('輸入正整數a:'))
b = int(input('輸入正整數b:'))
if (a<=0 or b<=0): # 輸入不是正整數, 結束程式
print('請輸入2個正整數')
else:
for i in range(1, a*b+1):
if(i%a==0 and i%b==0):
break
print("%d和%d的最小公倍數是:%d" % (a, b, i) )
範例1:找尋最小公倍數
# 設定數字列表
numbers = [1, 5, 8, 12, 15, 20, 25]
# 輸入想要搜尋的數字
target = int(input("請輸入您要搜尋的數字:"))
# 使用 for 迴圈遍歷列表
for number in numbers:
if number == target:
print(f"找到目標數字:{target}")
break # 找到後結束迴圈
else:
# 只有在未找到時才執行這個 else 區塊
print(f"列表中未找到數字 {target}")
範例2:遍歷串列以搜尋特定值,一旦找到目標值,就使用 break 結束迴圈。
基本語法
條件式若成立: 跳出迴圈
while迴圈也適用
範例
continue: 跳過該回合迴圈(後續回合繼續執行)
for 迴圈變數 in 數列1:
程式碼1...
if 條件式:
break
程式碼2...
迴圈後程式碼
for i in range(1,11):
if i%2==0: # 跳過偶數
continue
print(i, end=",")
# 設定數字範圍
numbers = range(1, 21)
# 初始化總和變數
even_sum = 0
# 使用 for 迴圈篩選偶數
for number in numbers:
if number % 2 != 0:
continue # 若為奇數,則跳過當前迴圈
even_sum += number
# 使用 f-string 輸出結果
print(f"1 到 20 的所有偶數總和為:{even_sum}")
範例:使用 for
迴圈遍歷範圍內的數字,並篩選出偶數來計算其總和。
輸出函式
Python 的4種資料儲存型態
內含多個項目
可修改
內含多個項目
不可修改
元組
內含多個內容相異的項目
無先後次序
內含多個key-value對
可修改
有先後次序
認識串列
scores = [1, 2, 3, 4, 5] # 建立5個元素串列
print(scores) # 印出所有元素
print(scores[3]) # 印出第4個元素
串列 (list) 宣告:
串列名稱 = [元素1, 元素2, 元素3..., 元素N]
範例
[1, 2, 3, 4, 5]
4
執行結果
範例
name_list = [23, 18, 22, 31, 18]
print(name_list[0]) # 印出第一個元素(編號0)
# 初始化一個串列
fruits = ["apple", "banana", "cherry"]
# 新增元素到串列末尾
fruits.append("orange")
print(f"新增元素後的串列: {fruits}")
# 刪除特定元素
fruits.remove("banana")
print(f"刪除元素後的串列: {fruits}")
# 插入元素到特定位置
fruits.insert(1, "blueberry")
print(f"插入元素後的串列: {fruits}")
# 修改元素
fruits[2] = "strawberry"
print(f"修改後的串列: {fruits}")
# 訪問串列中的特定元素
print(f"第一個水果是: {fruits[0]}")
初始化串列、新增、刪除、插入、修改和訪問元素。
讀取串列個別元素的方式: 串列名稱[i],i: 從0開始算起
取出部分元素:
取出從start到end-1位置的內容
其他用法:
串列名稱[start:end]
# name_list為某串列變數名稱
name_list[start:end] # 從start到n-1
name_list[:n] # 取得前n個(0~n-1)
name_list[n:] # 取得n到串列最後
name_list[-n:] # 取得串列後n個
name_list[:] # 取得所有元素(複製)
# 初始化串列
letters = ["a", "b", "c", "d", "e", "f", "g"]
# 訪問前 3 個元素
first_three = letters[:3]
print(f"前 3 個字母: {first_three}")
# 訪問從第 2 個到第 5 個元素
middle_letters = letters[1:5]
print(f"第 2 到第 5 個字母: {middle_letters}")
# 訪問最後 2 個元素
last_two = letters[-2:]
print(f"最後 2 個字母: {last_two}")
Python內建統計運算函數:適用於全是數值內容的串列
最高得分 = 31
最低得分 = 18
得分總計 = 113
執行結果
# 初始化數字串列
numbers = [3, 7, 1, 9, 4, 5]
# 找出最大值
max_value = max(numbers)
print(f"串列中的最大值: {max_value}")
# 找出最小值
min_value = min(numbers)
print(f"串列中的最小值: {min_value}")
# 計算總和
total_sum = sum(numbers)
print(f"串列中的總和: {total_sum}")
# 計算串列長度
length = len(numbers)
print(f"串列長度: {length}")
範例
# 假設這是一個購物車中的商品列表
shopping_cart = ["laptop", "mouse", "keyboard", "monitor"]
# 使用 len() 函數來檢查購物車中的商品數量
cart_size = len(shopping_cart)
# 根據商品數量提供不同的折扣
if cart_size == 0:
print("購物車是空的,請選購商品!")
elif cart_size < 3:
print(f"購物車有 {cart_size} 件商品,目前沒有折扣。")
elif cart_size <= 5:
print(f"購物車有 {cart_size} 件商品,享受 10% 的折扣!")
else:
print(f"購物車有 {cart_size} 件商品,享受 20% 的折扣!")
len()函式: 回傳串列元素個數
根據購物車的長度,程式會判斷給予不同的提示和折扣
練習:神奇8號球(維基百科)
請參考維基百科有關神奇8號球的「答案」部份,建立一個答案串列;並請撰寫一個問答程式,使用無窮迴圈,讓使用者輸入問題,當輸入的問題是-1時才結束程式,否則,不管輸入問題為何,都會從答案串列,隨機挑選一個答案回覆。
import random
# 如要隨機產生一個介於1~20的數字,可呼叫random.randInt(1,20)
# 提示
my_list = ['a', 'b', 'c'] # 如有3個元素的串列
choice = random.randint(0, len(my_list)-1) # 產生亂數: 介於0到(串列長度-1)
print(f'產生亂數:{choice}, 串列內容為{my_list[choice]}')
scores = [80, 78, 60, 83, 60]
print(scores.count(60))
print(scores.count(90))
2
0
執行結果
計數:某個元素是否出現?
count()
# 初始化一個串列,其中有重複元素
numbers = [1, 2, 2, 3, 4, 2, 5]
# 計算 2 出現的次數
count_of_two = numbers.count(2)
print(f"數字 2 出現了 {count_of_two} 次")
如何使用 count()
方法來計算某個元素在串列中出現的次數。
import random
# 初始化一個空的串列來儲存每次擲骰子的結果
dice_rolls = []
# 模擬擲骰子 100 次
for _ in range(100):
roll = random.randint(1, 6) # 隨機產生 1 到 6 之間的整數,模擬骰子
dice_rolls.append(roll) # 將點數存入串列
# 使用 count() 函數來統計點數 3 出現的次數
count_of_three = dice_rolls.count(3)
# 使用 f-string 輸出結果
print(f"在 100 次擲骰子中,點數 3 出現了 {count_of_three} 次。")
範例:模擬擲一個骰子100次,每次都將點數存入串列,擲完100次後,利用count()統計點數3出現的次數
list1 = [1,2,3,4,5,6] # 元素0~5
list1.append("新元素") # 加在串列最後
print(list1[6]) # 印出"新元素"
print(len(list1)) # list1的長度:7
新元素
7
執行結果
增加串列元素?
元素值: 加在串列最後
insert(): 加在指定位置
串列.append(元素值)
串列.insert(索引值,元素值)
list1 = [1,2,3,4,5,6] # 元素0~5
list1.insert(3, "新元素")# 加在索引值位置
print(list1[3]) # 印出"新元素"
print(len(list1)) # list1的長度: 7
新元素
7
執行結果
# 初始化一個空的顧客名單
customer_list = []
# 新增 5 位顧客的姓名
for i in range(5):
# 輸入顧客姓名
customer_name = input("輸入顧客姓名:")
# 將顧客姓名新增到串列中
customer_list.append(customer_name)
# 使用 f-string 輸出新增後的顧客名單
print(f"新增的顧客名單: {customer_list}")
範例:利用 list.append() 方法來動態新增 5 筆資料到串列中
練習:使用無窮迴圈從空串列開始,使用append()逐步增加字串串列內容(例如神奇8號球需要的答案串列),直到輸入空字串才結束建立串列的工作。當結束時,印出「串列的元素個數」,並以迴圈逐一印出串列內容。
my_list = ['想的美', '很有可能', '現在不能告訴你']
for item in my_list:
print(item)
認識字典:自訂索引值
字典
串列
自訂名稱(鍵) A~E (其他任意名稱亦可)
自動產生索引值: 0~(N-1)
字典 = {'A':1, 'B':2, 'C':3, 'D':4, 'E':5}
score = [1, 2, 3, 4, 5]
# ch9_3.py
fruits = {'西瓜':15, '香蕉':20, '水蜜桃':25}
noodles = {'牛肉麵':100, '肉絲麵':80, '陽春麵':60}
print("水蜜桃一斤 = ", fruits['水蜜桃'], "元")
print("牛肉麵一碗 = ", noodles['牛肉麵'], "元")
範例
字典建立函式dict():
價目表 = {'香蕉': 20, '蘋果': 50, '鳳梨': 80}
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
print(成績單)
print(成績單['王小明'])
範例
水蜜桃一斤 = 25 元
牛肉麵一碗 = 100 元
執行結果
dict()函式中,「鍵」若為字串不能加引號
dict()
{'王小明': 80, '李小鳳': 70, '張小華': 75}
80
執行結果
列出字典的元素?以鍵取值
字典名稱 = {鍵1: 值1, 鍵2: 值2, 鍵3: 值3..., 鍵N: 值N}
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
成績單['王小明'] = 90 # 修改
成績單['春嬌'] = 88 # 鍵不存在:新增
print(成績單)
範例
{'王小明': 90, '李小鳳': 70, '張小華': 75, '春嬌': 88}
執行結果
新增/修改元素內容
字典 (dict) 修改與新增:
# ch9_5.py
fruits = {'西瓜':15, '香蕉':20, '水蜜桃':25}
fruits['橘子'] = 18
print(fruits)
print("橘子一斤 = ", fruits['橘子'], "元")
範例
{'西瓜': 15, '香蕉': 20, '水蜜桃': 25, '橘子': 18}
橘子一斤 = 18 元
執行結果
新增內容
# 初始化一個字典來存儲員工資料
employee_dict = {
101: "Alice",
102: "Bob",
103: "Charlie"
}
# 新增一位員工到字典中
employee_dict[104] = "David" # 新增員工編號 104 和姓名 "David"
print(f"新增員工後的字典: {employee_dict}")
# 刪除一位員工
del employee_dict[102] # 刪除員工編號 102 的員工 "Bob"
print(f"刪除員工後的字典: {employee_dict}")
# 使用 pop() 方法刪除並返回刪除的值
removed_employee = employee_dict.pop(103) # 刪除員工編號 103 的員工 "Charlie"
print(f"使用 pop() 方法刪除的員工: {removed_employee}")
print(f"使用 pop() 後的字典: {employee_dict}")
# 新增多位員工
employee_dict.update({105: "Eve", 106: "Frank"}) # 新增兩位員工
print(f"新增多位員工後的字典: {employee_dict}")
範例:新增/刪除員工資料
# 初始化一個字典來存儲員工的薪資資料
employee_salaries = {
"Alice": 50000,
"Bob": 60000,
"Charlie": 55000
}
# 修改某位員工的薪資
employee_salaries["Bob"] = 65000 # 將 Bob 的薪資更新為 65000
print(f"修改 Bob 薪資後的字典: {employee_salaries}")
# 如果員工存在,則調整他們的薪資
if "Alice" in employee_salaries:
employee_salaries["Alice"] += 5000 # Alice 的薪資增加 5000
print(f"調整 Alice 薪資後的字典: {employee_salaries}")
範例:修改員工資料
# 初始化一個字典來存儲產品庫存資料
product_inventory = {
"Laptop": 50,
"Smartphone": 120,
"Tablet": 75,
"Headphones": 200
}
# 使用 len() 計算產品的總數(有多少種產品)
product_count = len(product_inventory)
# 使用 f-string 輸出結果
print(f"目前有 {product_count} 種產品在庫存列表中。")
# 如果產品數量超過某個值,提醒管理員
if product_count > 3:
print("注意:產品種類超過了 3 種,請檢查是否需要補貨。")
else:
print("產品種類數量在合理範圍內。")
取得字典元素數量:len()函數
某個鍵是否存在?
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
print('春嬌' in 成績單) # False
print('王小明' in 成績單) # True
請輸入鍵(key) = 水果
請輸入值(value) = 100
新的fruits字典內容 = {'西瓜': 15, '香蕉': 20, '水蜜桃': 25, '水果': '100'}
執行結果
'鍵' in 字典
# ch9_15.py
fruits = {'西瓜':15, '香蕉':20, '水蜜桃':25}
key = input("請輸入鍵(key) = ")
value = input("請輸入值(value) = ")
if key in fruits:
print("%s已經在字典了" % key)
else:
fruits[key] = value
print("新的fruits字典內容 = ", fruits)
取得所有鍵?
{'王小明': 80, '李小鳳': 70, '張小華': 75}
dict_keys(['王小明', '李小鳳', '張小華'])
執行結果
字典.keys()
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
print(成績單) # 鍵/值對
print(成績單.keys()) # 只取得鍵
字典無法用for迴圈直接處理
字典.keys(): 得到dict_keys型別資料
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
for item in 成績單.keys():
print('%s的成績是%d' % (item, 成績單.get(item)))
王小明的成績是80
李小鳳的成績是70
張小華的成績是75
執行結果
取得所有值?
{'王小明': 80, '李小鳳': 70, '張小華': 75}
dict_values([80, 70, 75])
執行結果
字典.values()
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
print(成績單) # 鍵/值對
print(成績單.values()) # 只取得值
字典.values(): 得到dict_values型別資料
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
values = 成績單.values() # 所有值
avg = sum(values) / len(values)
print(avg)
75.0
執行結果
字典無法用for迴圈直接處理
取得所有鍵-值組合?
{'王小明': 80, '李小鳳': 70, '張小華': 75}
dict_items([('王小明', 80), ('李小鳳', 70), ('張小華', 75)])
執行結果
字典.items()
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
print(成績單) # 鍵/值對
print(成績單.items()) # 只取得值
字典.items(): 得到dict_dict型別資料
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
for key, val in 成績單.items():
print("%s的成績是:%3d" % (key, val))
王小明的成績是: 80
李小鳳的成績是: 70
張小華的成績是: 75
執行結果
2個迴圈變數: 1st對應「鍵], 2nd對應「值」
範例:成績查詢與新增
成績單 = dict(王小明=80, 李小鳳=70, 張小華=75)
while True:
name = input('輸入學生姓名:(直接按Enter結束)')
if name == '':
break
if name in 成績單:
print('%s的成績是: %3d' % (name,成績單.get(name)))
else:
score = int(input('輸入成績:'))
成績單[name] = score
print(成績單)
及格人數 = 0
for score in 成績單.values():
if score >= 60:
及格人數 += 1
print('及格人數:%d' % 及格人數)
你正在設計手遊,遊戲裡需要一個存放玩家寶物的倉庫。字典剛好可以做為倉庫的資料結構,期中,鍵(key)為「寶物名稱」的字串,值(value)則是寶物的數量,例如:
抓寶遊戲的倉庫
{'火把': 3, '金幣': 200, '盾牌': 2, '匕首': 8}
試著完成一個程式,可以不斷新增寶物到倉庫裡
程式結束時,則印出所有寶物如下(注意名稱置左對齊、數量則置右):
火把 3
金幣 200
盾牌 2
匕首 8
承前一練習,以字典當為玩家寶物倉庫的資料結構。請將程式進一步擴充,當新增寶物結束後,進入下一個迴圈,可以不斷抓寶—每次抓寶以產生亂數串列的方式模擬,以下為例:
抓寶遊戲倉庫的延伸練習
import random
# 假設有這些種不同的寶物
所有寶物串列 = ['火把','金幣','盾牌','匕首','寶劍','斗篷','馬靴']
for i in range(5): # 此處以產生五次抓寶結果為例
# random.choices()可隨機產生k個元素的串列,元素從第一個參數的串列挑選
抓寶串列 = random.choices(所有寶物串列, k=random.randint(1,5))
print(抓寶串列)
['盾牌', '寶劍', '金幣', '金幣']
['金幣', '金幣', '盾牌']
['金幣', '寶劍']
['火把']
['盾牌', '盾牌', '匕首']
輸出結果
請完成將串列加入字典,更新寶物倉庫的數量,例如抓到下列寶物:
則字典裡的這三種寶物的數量分別多1, 1 , 2
['盾牌', '寶劍', '金幣', '金幣']
發音: Func-shun
函式: 一段很容易重複使用的程式碼
發音: Pa-rame-ter
參數: 特殊變數,用來傳遞資料進函式
def Hello(): # 定義函式
print('Hello') # 函式主體
Hello() # 呼叫函式Hello
Hello() # 可多次呼叫
def Km2Mile(distance): # 需要參數之函式
mile = distance/1.609
return mile # 函式回傳值
speed = Km2Mile(150) # 呼叫函式
print('%6.1f' % speed)
函式定義好之後,不會直接執行,可重複呼叫使用
函式可接受參數、回傳計算值