2023-10-30|閱讀時間 ‧ 約 6 分鐘

筆記:深入淺出-程式設計(四)

複習一下:

我們學習了關於撰寫程式的相關觀念

  • 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。
  • 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。
  • 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。
  • 函式(function) : 藉由函式重利用相同功能區塊的程式碼,讓程式的可讀性變高且容易維護。

目前為止我們已經能夠撰寫基本的程式邏輯來處理簡單的資料。

檔案與陣列:

在這章我們將學習如何從磁碟讀取資料並處理個資料。

  • 檔案:電腦中有兩個可以儲存資料的地方,一個就是硬碟,另一個就是記憶體。硬碟可以存的資料量遠遠大於記憶體,並且是永續性的(意即:如果把電腦電源關掉,資料還是會存在)但是缺點是在處理資料時速度慢;而資料存放在記憶體中,存取與變更的速度很快,但是是非永續性的(意即:當程式退出時記憶體的資料便會消失)。
  • 陣列:當程式需要一次處理一大筆資料時,這時候為了處理資料而為每一個資料創建獨立一個變數是沒有效益的(想像一下如果要處理的數據量有1000甚至更多呢?),並且程式碼也會因此變得複雜可讀性降低,比較好的作法就是利用陣列來處理。
  • 群集變數:陣列是一種群集變數(collection variable) 或稱為資料結構(data structure)。每個陣列可以包含多個變數,每一個變數稱為陣列元素(array element) 。

事前準備:

請先開啟文字編輯器,並且輸入以下文字後另存為 "result.txt" 檔案。

先從一場衝浪比賽的計分程式開始:

功能需求:衝浪比賽開始囉,主辦單位將每個參賽選手的成績都記錄下來,並存在"result.txt",請撰寫一個程式將最高分數找出來。

分析:得先讀取檔案"result.txt",然後將名字與分數抽離出來,最後在把最高分的分數取出來。

檔案讀取:

利用 Python 內建的函式 open() 將硬碟中的"result.txt"檔案讀取進來。

open() 函式如果讀取檔案成功,便會回傳檔案柄碼(file handle),利用 for 迴圈將檔案一行一行讀出來,最後記得用 close() 將檔案關閉。

程式碼:

result_f = open("result.txt")
for line in result_f:
print(line)
result_f.close

執行結果:

字串處理:

可以從上述的執行結果看到現在每一行字串都包含名字與分數,這兩個中間有一個空格,因此利用 Python內建的函式 split() 利用空格將字串分割開來。

程式碼:

result_f = open("result.txt")
for line in result_f:
line_split = line.split()
score = line_split[1]
print(score)
result_f.close

執行結果:

條件判斷:

最後一步了,創建一個變數名為"max_score"紀錄目前最高的分數值,每次取得分數後都跟這個值做比較,如果大於則將目前最高分更新,如果小於目前最高分則不動。

程式碼:

result_f = open("result.txt")
max_score = 0
for line in result_f:
line_split = line.split()
score = float(line_split[1])
if(score > max_score):
max_score = score
print(max_score)
result_f.close

執行結果:

可以列出前三名的分數?

功能需求變更:參賽者希望可以最高看到前三名的成績。

分析:最直覺的想法就是新增另外兩個變數來分別存放第二名和第三名的分數,可是如果等下參賽者又想要看所有的成績排名,難道就要再次修正程式然後創建多個變數分別存下分數嗎?當然不是!這時候我們得使用陣列。

創建陣列:

使用 陣列變數名稱 = [ ] 來創建陣列,接著將檔案中讀取的分數加入到陣列當中。

Python 內建的 append() 方法可以將元素加入到陣列中。

排序:

在上述程式中,我們使用 if 判斷邏輯來找出最大值,不過要如何找出第二、第三名的分數呢?利用排序把陣列中的資料從大排到小,即可得出第二名與第三名的分數。使用Python 內建的 sort()可以將陣列中的資料從排到大,reverse() 則可以將陣列的排序反過來。

程式碼:

result_f = open("result.txt")
scores = []

for line in result_f:
line_split = line.split()
score = float(line_split[1])
scores.append(score)
scores.sort()
scores.reverse()

print(scores[0])
print(scores[1])
print(scores[2])
result_f.close

執行結果:








分享至
成為作者繼續創作的動力吧!
大家好 我是Ivan。我喜歡閱讀與學習新事物,目前會先以所閱讀的書籍做心得分享~
© 2024 vocus All rights reserved.