P04 Practice01: for loop#
Q1. Sum-up values in a list#
在數據處理和分析中,計算一組數據(或列表)中所有數值的總和是一個常見的操作。這個練習題要求使用Python程式碼來計算一個列表中所有數值的總和。
程式碼要求:
定義一個列表,其中包含一組數值(整數或浮點數)。
使用迴圈(例如
for
迴圈)來遍歷列表中的每一個數值。在迴圈中,將每一個數值加到一個累計變數(例如
sum
)上。在迴圈結束後,輸出或返回這個累計變數的值,即列表中所有數值的總和。
題目目的:
練習使用迴圈來遍歷列表。
練習使用累計變數來計算總和。
理解如何使用基本的Python語法來解決實際問題。
提示:
注意初始化累計變數(通常為0)。
注意如何在迴圈中更新累計變數的值。
alist = [1, 3, 4, 2, 5, 2, 4, 1, 1, 3, 5, 2, 4, 1]
# Your code here
Q1.1 使用sum()
函數#
試著用sum()
函數來解決這個問題。
# Your code here
Q1.2 加總在一個Dictionary中的所有value#
如果你的資料在一個Dictionary中,你要想辦法將所有key所對應到的value加總起來。
grades = {'albert': 33, 'bob': 44, 'carlos': 100, 'david': 90, 'ellen': 100}
# Your code here
Q1.3 加總全台北市Youbike的腳踏車總數#
計算讀到的資料中,目前共有多少個ubike停駐位、又有多少ubike目前正停駐在車格上
import requests
import json
response = requests.get('https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json')
print(type(response)) # <class 'requests.models.Response'>
print(type(response.text)) # <class 'str'>
bike_data = json.loads(response.text)
<class 'requests.models.Response'>
<class 'str'>
# Your code here
Q2. For-loop#
Q2.1. Printing a tree#
使用Python程式語言撰寫一個程式,印出如下所示的樹形圖案:
練習目的:
這個練習的目的是讓學生熟悉使用迴圈控制結構,特別是
for
迴圈,來生成特定模式的輸出。同時,這個練習也有助於學生理解如何控制行數和印出的星號數目。
提示:
您可以使用嵌套的
for
迴圈來處理這個任務,一個迴圈用於控制行數,另一個用於印出星號。在第一行,只印出一個星號。
在每一行,星號的數目比上一行多一個。
您可以使用
print
函數來印出星號,並使用end=""
來避免換行,使星號在同一行上印出。
*
**
***
****
# Your code here
Q2.2 Print a tree like#
說明:
首先,在第一行印出一個星號,並在星號前面添加4個空格,使星號位於行中央。
在第二行,印出三個星號,並在星號前面添加3個空格,以實現對齊效果。
以此類推,每一行印出的星號數目比上一行多兩個,同時在開頭添加更多的空格,以實現樹形效果。
*
***
*****
*******
*********
# Your code here
Q3. Fibonacci Number#
費氏數列是一個數學中非常著名的數列。在這個數列中,第一項是0,第二項是1,從第三項開始,每一項都是前兩項的和。本次練習的目的是使用 for-loop 來生成費氏數列,並找出第10項的值。
提示:
初始化兩個變數,一個用於儲存當前項(初始值為0),另一個用於儲存前一項(初始值為1)。
f(1) = 0
f(2) = 1
使用 for-loop 從第3項開始,計算到第10項。
在每次迴圈中,將當前項和前一項相加以得到新的當前項,然後更新前一項的值。f(n+1) = f(n) + f(n-1)
要求:
使用 for-loop 來計算費氏數列。
計算並輸出第10項的值。
將你的輸出格式化為以下模樣:
1 0
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
a = 0 # f(1)
b = 1 # f(2)
n = 10
# Your code here
Q4. Finding Prime Number#
請使用 for-loop
寫一個 Python 程式,用來判斷輸入的整數(n)是否為一個質數。
程式需求:
使用者輸入一個正整數,例如:
n=29
使用
for-loop
從2
到n-1
,檢查n
是否有其他數字可以整除。如果
n
可以被其他數字整除,則輸出n
不是質數。如果
n
不能被任何數字(除了 1 和自己)整除,則輸出n
是質數。
輸出範例:
29 是一個質數。
提示:
用
for-loop
從 2 迭代到n-1
,用if
判斷n
是否能被當前的數字整除。若能,則立即跳出迴圈,並判斷
n
不是質數。若迴圈完成,則
n
是質數。
加分:
其實不用跑到
n-1
就可以知道他是不是質數了,請嘗試使用不同的方法來優化你的程式,例如提前結束迴圈等。問ChatGPT有沒有更好的寫法?有沒有自訂函數的寫法?有沒有更好的演算法?
n = 29
# Your code here
Q5. Generating Pi#
格雷戈里(Gregory)和萊布尼茲(Leibniz)發現了一個用於計算π(圓周率)的無窮級數公式。這個公式可以用來逼近π的值,並且是數學中一個非常重要的發現(https://mathworld.wolfram.com/PiFormulas.html)。這個公式的形式如下:
Gregory and Leibniz found Pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9…
在這個練習中,我們將使用 for-loop 來計算這個公式的前100項,並且計算出π的近似值。
要求:
使用程式碼來實現這個無窮級數。
計算並輸出逼近π的值。
考慮如何提高計算的精確度。
提示:
初始化一個變數來儲存逼近π的值(初始值為1,因為第一項是1)。
使用迴圈(例如 for-loop 或 while-loop)來計算後續的項。
注意正負號的變化。
考慮如何確定迴圈的終止條件,以達到所需的精確度。
# Your code here
Q6. Assign continue values into equal length brackets#
之前在做Counting時,每個項目是離散的,但今天我如果要把成績的百分制等分均分至數個區間後(0-10, 10-20, …, 90-100, 100),分別計算每個區間有多少人要怎麼做?
Q6.1 by matplotlib
’s hist()
function#
一個有趣的視覺化做法是利用matplotlib
的hist()
函式,可以將資料分成數個區間,並計算每個區間的頻率,然後畫出長條圖。
grades = [17, 65, 5, 74, 93, 1, 94, 16, 80, 95, 32, 78, 17, 70, 22, 43, 95, 67, 3, 30, 40, 51, 96, 17, 13, 21, 4, 47, 19, 44, 59, 6, 0, 83, 40, 89, 39, 57, 99, 35, 81, 31, 89, 63, 80, 85, 36, 60, 17, 68, 62, 36, 3, 28, 8, 38, 83, 73, 67, 2]
%matplotlib inline
import matplotlib.pyplot as plt
plt.hist(grades, 10, facecolor='green', alpha=0.5)
(array([9., 7., 3., 8., 5., 3., 7., 4., 8., 6.]),
array([ 0. , 9.9, 19.8, 29.7, 39.6, 49.5, 59.4, 69.3, 79.2, 89.1, 99. ]),
<BarContainer object of 10 artists>)

Q6.2 Counting then plotting by bar()
#
在這個新版本的Python程式中,我們用了一個名為glist
的列表來儲存每10分一個區段(也就是每個”bracket”)的學生數量。這個列表初始為11個0(從0到100分,共11個區段)。我們還使用了matplotlib
來視覺化這些數據。
構想
使用列表: 利用列表
glist
的索引值來表示分數的區段(0-9, 10-19, …, 90-99, 100)是非常巧妙的。這避免了使用多個if-else
語句來判斷分數落在哪一個區段。整數索引: 通過
int(g/10)
,我們可以把任何分數直接映射到相應的區段。例如,分數72(72/10=7.2)會被映射到glist[7]
。數據視覺化: 使用
matplotlib
的bar
函數,我們可以直觀地看到不同區段的學生數量。
提示
列表初始化: 確保
glist
有足夠的元素(在這裡是11個)來代表所有可能的分數區段。資料驗證: 確保所有學生成績都在0到100之間,這樣
int(g/10)
不會超出glist
的索引範圍。視覺化選項: 在
plt.bar()
函數中,width=10
表示每個柱子的寬度為10。你可以調整這個數值以達到不同的視覺效果。
grades = [60, 65, 62, 65, 62, 73, 78, 90, 100, 99, 67, 73]
glist = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
%matplotlib inline
import matplotlib.pyplot as plt
print(len(glist))
for g in grades:
glist[int(g/10)] += 1
print(list(range(0, 101, 10)))
print(glist)
plt.bar(list(range(0, 101, 10)), glist, width=10)
11
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
[0, 0, 0, 0, 0, 0, 6, 3, 0, 2, 1]
<BarContainer object of 11 artists>
