P04 Practice01: for loop#

Q1. Sum-up values in a list#

在數據處理和分析中,計算一組數據(或列表)中所有數值的總和是一個常見的操作。這個練習題要求使用Python程式碼來計算一個列表中所有數值的總和。

程式碼要求:

  1. 定義一個列表,其中包含一組數值(整數或浮點數)。

  2. 使用迴圈(例如 for 迴圈)來遍歷列表中的每一個數值。

  3. 在迴圈中,將每一個數值加到一個累計變數(例如 sum)上。

  4. 在迴圈結束後,輸出或返回這個累計變數的值,即列表中所有數值的總和。

題目目的:

  1. 練習使用迴圈來遍歷列表。

  2. 練習使用累計變數來計算總和。

  3. 理解如何使用基本的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迴圈,來生成特定模式的輸出。同時,這個練習也有助於學生理解如何控制行數和印出的星號數目。

提示:

  1. 您可以使用嵌套的for迴圈來處理這個任務,一個迴圈用於控制行數,另一個用於印出星號。

  2. 在第一行,只印出一個星號。

  3. 在每一行,星號的數目比上一行多一個。

  4. 您可以使用print函數來印出星號,並使用end=""來避免換行,使星號在同一行上印出。


*
**
***
****
# Your code here

Q2.2 Print a tree like#

說明:

  • 首先,在第一行印出一個星號,並在星號前面添加4個空格,使星號位於行中央。

  • 在第二行,印出三個星號,並在星號前面添加3個空格,以實現對齊效果。

  • 以此類推,每一行印出的星號數目比上一行多兩個,同時在開頭添加更多的空格,以實現樹形效果。

     *
    ***
   *****
  *******
 *********
# Your code here

Q3. Fibonacci Number#

費氏數列是一個數學中非常著名的數列。在這個數列中,第一項是0,第二項是1,從第三項開始,每一項都是前兩項的和。本次練習的目的是使用 for-loop 來生成費氏數列,並找出第10項的值。

提示:

  1. 初始化兩個變數,一個用於儲存當前項(初始值為0),另一個用於儲存前一項(初始值為1)。

    1. f(1) = 0

    2. f(2) = 1

  2. 使用 for-loop 從第3項開始,計算到第10項。

  3. 在每次迴圈中,將當前項和前一項相加以得到新的當前項,然後更新前一項的值。f(n+1) = f(n) + f(n-1)

要求:

  1. 使用 for-loop 來計算費氏數列。

  2. 計算並輸出第10項的值。

  3. 將你的輸出格式化為以下模樣:

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)是否為一個質數。

程式需求:

  1. 使用者輸入一個正整數,例如:n=29

  2. 使用 for-loop2n-1,檢查n是否有其他數字可以整除。

  3. 如果n可以被其他數字整除,則輸出n不是質數。

  4. 如果n不能被任何數字(除了 1 和自己)整除,則輸出n是質數。

輸出範例:

29 是一個質數。

提示:

  1. for-loop 從 2 迭代到n-1,用 if 判斷n是否能被當前的數字整除。

  2. 若能,則立即跳出迴圈,並判斷n不是質數。

  3. 若迴圈完成,則n是質數。

加分:

  1. 其實不用跑到n-1就可以知道他是不是質數了,請嘗試使用不同的方法來優化你的程式,例如提前結束迴圈等。

  2. 問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. 使用程式碼來實現這個無窮級數。

  2. 計算並輸出逼近π的值。

  3. 考慮如何提高計算的精確度。

提示:

  1. 初始化一個變數來儲存逼近π的值(初始值為1,因為第一項是1)。

  2. 使用迴圈(例如 for-loop 或 while-loop)來計算後續的項。

  3. 注意正負號的變化。

  4. 考慮如何確定迴圈的終止條件,以達到所需的精確度。

# 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#

一個有趣的視覺化做法是利用matplotlibhist()函式,可以將資料分成數個區間,並計算每個區間的頻率,然後畫出長條圖。

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>)
../_images/502a702582b79ed01a91315272db53ba66ee16b1cfbab943bf644897fc1e6ee4.png

Q6.2 Counting then plotting by bar()#

在這個新版本的Python程式中,我們用了一個名為glist的列表來儲存每10分一個區段(也就是每個”bracket”)的學生數量。這個列表初始為11個0(從0到100分,共11個區段)。我們還使用了matplotlib來視覺化這些數據。

構想

  1. 使用列表: 利用列表glist的索引值來表示分數的區段(0-9, 10-19, …, 90-99, 100)是非常巧妙的。這避免了使用多個if-else語句來判斷分數落在哪一個區段。

  2. 整數索引: 通過int(g/10),我們可以把任何分數直接映射到相應的區段。例如,分數72(72/10=7.2)會被映射到glist[7]

  3. 數據視覺化: 使用matplotlibbar函數,我們可以直觀地看到不同區段的學生數量。

提示

  1. 列表初始化: 確保glist有足夠的元素(在這裡是11個)來代表所有可能的分數區段。

  2. 資料驗證: 確保所有學生成績都在0到100之間,這樣int(g/10)不會超出glist的索引範圍。

  3. 視覺化選項: 在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>
../_images/3d2ed8d3e6c320adf682a705dc1d44e3b19c7323c67d864762bdfcace151f7e8.png