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

更新於 2024/10/13閱讀時間約 7 分鐘

字串處理

每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。

  • 字串就是一連串的字元。
  • 字串的第一個字為起始位置(Start),從 0 開始。
  • 字串其他位置的字元與起始字元的距離則稱為偏移值(Offset)或是索引(Index)。
  • 舉個例子來說,text = "ABC" 這個字串,A 就是字串的開始,其偏移值為 0(Index = 0); B 則是偏移值 1(Index = 1);C 則是偏移值 2 ( Index = 2)。

提醒

這本書出版年份較早(事實上現在已經絕版),因此如果試著輸入書中所寫的網站位置("http://beans-r-us.appspot.com/prices.html")會發現網頁已不存在。因此接下來的內容我會將原本要從 URL 取得咖啡豆價格的 html 字串修改為從本地端創造一個 html 檔案(內容我儘量與書中一致),並使用 Python 匯入程式來模擬書中範例。

開啟文字編輯器然後輸入以下 html 內容後另存為.html 檔案。

<html><head><title>Welcome to the Beans'R'Us Pricing Page</title>
<link rel="stylesheet" type = "text/css" href = "beansrus.css"/>
</head><body>
<h2>Welcome to the Beans 'R'Us Pricing Page</h2>
<p>Current price of coffee beans = <strong>$5.49</strong></p>
<p>Price valid for 15 minutes from 19:42 on Wednesday 27/05/2009.</p>
</body>
</html>

使用瀏覽器開啟這個 html 檔案就會看到以下網站內容:

raw-image

現在一切就緒可以開始撰寫程式碼

先從購買咖啡豆的程式開始

  • 功能需求:請撰寫一個程式可以在指定 html 檔案上擷取出目前咖啡豆的價格。
  • 請在程式最前面先加入以下程式碼。

程式碼:

fileName = "/Coffee.html" 
file = open(fileName,'r')
text = file.read()
print(text)

其中 Coffee.html 檔案請放在指定的資料夾位置。

這時候如果執行程式碼就會截取內容如下:

raw-image
  • text 是一個很大的字串,我們要做的就是在這個字串中取得 5.49 這個子字串。
  • 在 Python 中利用索引值來取得子字串 Text [Index1: Index2 ],意思是從 Index1 開始擷取子字串到 Index2,但不包含 Index2 這個字元。

程式碼:

fileName = "/Coffee.html" 
file = open(fileName,'r')
text = file.read()
price = text[238:242]
print(price)

價格資訊是動態的

  • 功能需求變更:如果網頁內容是動態的,那程式該如何修正才會一樣取得價格資訊呢?例如因為過新年,所以網頁多了"Happy New Year!" 如下圖:
raw-image
  • 觀察一下 html 內容發現,價格資訊總是在 >$ 之後,因此得先搜尋 >$ 字串的位置後,再往後取得價格資料。

程式碼:

fileName = "/Coffee.html" 
file = open(fileName,'r')
text = file.read()
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = text[start_of_price:end_of_price]
print(price)

在指定價格時買入

  • 功能需求變更:使用者希望取得好價錢的時候(價格低於某個值)才買入,否則就不購買
  • 程式需要一直取得價格資訊,並且判斷是否低於某個價格,回想一下這個功能在上一章的猜數字遊戲中實作過,必須使用 While 迴圈。
  • 請注意:因為我們是用本地端 html 來模擬網站資訊,因此如果在 html 中的價格大於 6.9,就會造成程式無法跳離迴圈導致程式掛掉。

程式碼:

price = 9999.0

while(price > 6.9):
fileName = "/Coffee.html"
file = open(fileName,'r')
text = file.read()
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = float(text[start_of_price:end_of_price])

print('Buy!')

定時詢問價格

  • 功能需求變更:剛剛的程式可以正確執行,但是如果使用者不需要一直詢問價格,而是每個 15 分鐘才詢問一下價格呢?
  • 可以使用 Python 內建的 time 函式庫。
  • time.sleep(900) 表示暫停 900s (也就是15分鐘)後再執行。

程式碼:

import time

price = 9999.0

while(price > 6.9):
time.sleep(900)
fileName = "/Coffee.html"
file = open(fileName,'r')
text = file.read()
where = text.find('>$')
start_of_price = where + 2
end_of_price = start_of_price + 4
price = float(text[start_of_price:end_of_price])
print(price)

print('Buy!')
    avatar-img
    5會員
    8內容數
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    Ivan的沙龍 的其他內容
    為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
    簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
    作者 稻盛和夫(1932/01/30 - 2022/08/24)。 1959年創立京都陶瓷股份有限公司(現稱京瓷),1984年創立第二電電(現稱KDDI)與成立稻盛財團,並創辦「京都賞」每年表彰對人類社會進步發展的有成人士,被譽為日本「經營之聖」。 簡介 作者回顧一路走來的人生與多年來的經營
    作者 柳根榕,韓國最大閱讀論壇Awesome People 創辦人暨閱讀經營顧問CEO、 韓國知名自我開發部落格「超人老師的自我開發故事」格主。 這本書在說什麼 年少時期 小時候被繼母虐待,作者在沒有愛的環境下長大,因為沒有被愛過,也就不知道該如何去愛。為了保護自己不再受到傷害
    為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
    簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
    作者 稻盛和夫(1932/01/30 - 2022/08/24)。 1959年創立京都陶瓷股份有限公司(現稱京瓷),1984年創立第二電電(現稱KDDI)與成立稻盛財團,並創辦「京都賞」每年表彰對人類社會進步發展的有成人士,被譽為日本「經營之聖」。 簡介 作者回顧一路走來的人生與多年來的經營
    作者 柳根榕,韓國最大閱讀論壇Awesome People 創辦人暨閱讀經營顧問CEO、 韓國知名自我開發部落格「超人老師的自我開發故事」格主。 這本書在說什麼 年少時期 小時候被繼母虐待,作者在沒有愛的環境下長大,因為沒有被愛過,也就不知道該如何去愛。為了保護自己不再受到傷害
    你可能也想看
    Google News 追蹤
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    本篇分析如何與影響力人士建立深厚的信任。從心理學角度出發,說明共同目標的建立如何能促進人與人之間的關係。透過實例分析,文章闡述影響力的三大基石,並強調社群意識在建立人際關係中的關鍵性,為讀者提供實用的建議和行動路徑,以便更好地融入各種社群與人際互動,提升個人或品牌的影響力。
    Thumbnail
    本書討論了深度工作與淺薄工作的區分,以及如何減少淺薄工作的時間比例,提高深度工作效率所需的紀律,以及其他時間區段的安排建議。
    Thumbnail
    奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
    Thumbnail
    複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
    Thumbnail
    函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
    Thumbnail
    隨著時間的推移,我們的筆記方法可能會改變。 不論是筆記的內容還是方法,都需要隨著學習的深入而進行調整。 持續的反思和嘗試是筆記進步的關鍵。 ▋我們的筆記方法為何會隨著時間而改變? 因為你寫筆記的目的也會換。
    Thumbnail
    對於筆記,有時我們會引用他人的段落,有時則用自己的話寫。 使用他人的句子可以作為學習的起點,但最終還是應該進行原創的寫作。 ▋你應該如何平衡引用和原創? 我的原則是,每引用一次,就原創五句話。 這五句話,其實可以用131寫作節奏來寫
    Thumbnail
    隨著筆記卡片的增加,某些軟體可能面臨效能問題。 例如,Obsidian軟體可能在卡片過多時讀取變慢。 但這些技術上的問題不應成為制約我們學習的障礙。
    Thumbnail
    學術論文的段落比網路文章更為複雜。 利用筆記卡片的方式來解析學術論文能夠提煉出更具價值的知識。 此外,卡片化的學習方法可能對學術研究特別有用。
    Thumbnail
    每篇文章的段落都圍繞著特定的話題。 一個好的段落會圍繞著中心話題,且各句子間有很強的相關性。 通過拆解與分析段落,我們可以更深入地了解其核心意義。
    Thumbnail
    *合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
    Thumbnail
    徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
    Thumbnail
    本篇分析如何與影響力人士建立深厚的信任。從心理學角度出發,說明共同目標的建立如何能促進人與人之間的關係。透過實例分析,文章闡述影響力的三大基石,並強調社群意識在建立人際關係中的關鍵性,為讀者提供實用的建議和行動路徑,以便更好地融入各種社群與人際互動,提升個人或品牌的影響力。
    Thumbnail
    本書討論了深度工作與淺薄工作的區分,以及如何減少淺薄工作的時間比例,提高深度工作效率所需的紀律,以及其他時間區段的安排建議。
    Thumbnail
    奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
    Thumbnail
    複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
    Thumbnail
    函式 隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。 提醒 本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。
    Thumbnail
    隨著時間的推移,我們的筆記方法可能會改變。 不論是筆記的內容還是方法,都需要隨著學習的深入而進行調整。 持續的反思和嘗試是筆記進步的關鍵。 ▋我們的筆記方法為何會隨著時間而改變? 因為你寫筆記的目的也會換。
    Thumbnail
    對於筆記,有時我們會引用他人的段落,有時則用自己的話寫。 使用他人的句子可以作為學習的起點,但最終還是應該進行原創的寫作。 ▋你應該如何平衡引用和原創? 我的原則是,每引用一次,就原創五句話。 這五句話,其實可以用131寫作節奏來寫
    Thumbnail
    隨著筆記卡片的增加,某些軟體可能面臨效能問題。 例如,Obsidian軟體可能在卡片過多時讀取變慢。 但這些技術上的問題不應成為制約我們學習的障礙。
    Thumbnail
    學術論文的段落比網路文章更為複雜。 利用筆記卡片的方式來解析學術論文能夠提煉出更具價值的知識。 此外,卡片化的學習方法可能對學術研究特別有用。
    Thumbnail
    每篇文章的段落都圍繞著特定的話題。 一個好的段落會圍繞著中心話題,且各句子間有很強的相關性。 通過拆解與分析段落,我們可以更深入地了解其核心意義。