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

更新於 發佈於 閱讀時間約 10 分鐘

函式

隨著程式功能越來越多,所撰寫的程式碼也會越來越龐大,此時要管理複雜的程式並不是很容易的事,此時可以利用函式來控制程式的複雜度。

提醒

本章節中原本有將訊息傳送給 Twitter 平台的範例,我將其修正為使用print()顯示訊息來模擬(為了不將時間花費在申請 Twitter 帳號)。

延續上一章的咖啡豆程式

功能需求變更:使用者希望程式可以提供兩種選項,一種是可以直接看到目前咖啡豆的價格(當咖啡豆的庫存太低時,只能緊急下單進貨);另一種則是維持舊有功能,每15分鐘取得一次咖啡豆的價格,直到價錢滿意為止才下單。

  • 有兩種選項,程式必須根據使用者的選擇來執行相對應的程式碼,因此從第一章知道這必須使用 if/else 分支條件。

程式碼:

import time

price_now = input("Do you want to see the price now ?")

if(price_now == 'Y'):
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)
else:
price = 9999.0
while(price > 6.9):
time.sleep(5)
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!')

當使用者想要馬上看到價格:

raw-image

重利用而非重複

雖然上述的程式可以正確運行,不過可以看到中間有幾行程式碼一模一樣,假設客戶突然又增加了第三種、第四種報價選項,很快的程式碼將變得越來越長且可讀性越來越差,這樣的撰寫方式是不好的,因此請記得一件事:切勿重複你的程式碼!

  • 重利用(Reuse) : 當你在複製程式碼的時候,只是在重複(Duplicate) 程式碼;但是重利用指得是只有單一份程式碼,你可以在任何需要的時候存取他。
  • 函式:函式就是一種重利用的機制,隔離出一段程式碼區塊然後在需要的時候呼叫它。
  • 定義方式:
def FunctionName():
code....
code....
  • 位置:定義函式的位置很重要,必須將定義寫在你要呼叫它之前否則程式會無法辨識。
  • 回傳值:函式使用 return()命令將函式處理完的資料回傳給呼叫此函式的程式碼。

重新整理一下

import time

def get_price():
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])
return price


price_now = input("Do you want to see the price now ?")

if(price_now == 'Y'):

print(get_price())
else:
price = 9999.0
while(price > 6.9):
time.sleep(5)
price = get_price()
print(price)
print('Buy!')

可以看到上述程式碼變得簡潔且可讀性變高,這樣的程式較容易維護。

參數

  • 功能需求變更:程式需要根據使用者所做的選擇,馬上傳送價格訊息給使用者的Twitter 頁面。
  • 這時候我們定義一個函式為:send_to_twitter()
def send_to_twitter()
msg = "Coffee price is $"
print(msg)

程式碼:

import time

def get_price():
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])
return price

def send_to_twitter():
msg = "Coffee price is $"
print(msg)

price_now = input("Do you want to see the price now ?")

if(price_now == 'Y'):

send_to_twitter()
else:
price = 9999.0
while(price > 6.9):
time.sleep(5)
price = get_price()
send_to_twitter()
print('Buy!')

執行結果

raw-image
raw-image
  • 結果不管是什麼選擇,使用者收到的訊息都是一樣,但是沒有正確顯示價格訊息。看起來是因爲send_to_twitter() 函式並沒有收到價格,所以才沒有正確傳送訊息。
  • 參數:參數(Parameter) 是你送給函式的值,我們將send_to_twitter()函式修正為可以接受價格參數的函式。

程式碼:

import time

def get_price():
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])
return price

def send_to_twitter(price):
msg = "Coffee price is $"+ str(price)
print(msg)

price_now = input("Do you want to see the price now ?")

if(price_now == 'Y'):

send_to_twitter(get_price())
else:
price = 9999.0
while(price > 6.9):
time.sleep(5)
price = get_price()
send_to_twitter(price)
print('Buy!')

執行結果:

raw-image

堆疊框架

功能需求變更:使用者想要為自己的Twitter帳號設定密碼,然後在要送出訊息給Twitter帳號時先檢查一下是否有密碼,有的話才傳訊訊息。

  • 讓我們用學到的函式來增加功能,定義一個設定密碼函式為:set_password(),並且在程式最開始的時候就先呼叫此函式,好讓後續的程式可以取得此 password。

程式碼:


def set_password():
password = "C8H10N402"
set_password()
  • 不過這時候執行程式時卻出現了:NameError: name 'password' is not defined。
  • 這是因為當呼叫函式時,電腦會在堆疊框架上建立一組全新的變數,紀錄函式中所有用到的變數,而這些全新的變數被稱為本地參數(Local Variable) 。
  • 堆疊機制好處就是函式中的變數獨立運算,不影響程式其他部分。
  • 而當函式執行結束後,電腦會將此函式的堆疊框架丟棄,因此連同本地參數也都一併丟棄。
  • set_password()執行時會創造一個新的本地參數password,但是執行後就被丟棄了,因此程式其他部分是看不到這個password參數的。
















avatar-img
5會員
8內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Ivan的沙龍 的其他內容
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
作者 稻盛和夫(1932/01/30 - 2022/08/24)。 1959年創立京都陶瓷股份有限公司(現稱京瓷),1984年創立第二電電(現稱KDDI)與成立稻盛財團,並創辦「京都賞」每年表彰對人類社會進步發展的有成人士,被譽為日本「經營之聖」。 簡介 作者回顧一路走來的人生與多年來的經營
作者 柳根榕,韓國最大閱讀論壇Awesome People 創辦人暨閱讀經營顧問CEO、 韓國知名自我開發部落格「超人老師的自我開發故事」格主。 這本書在說什麼 年少時期 小時候被繼母虐待,作者在沒有愛的環境下長大,因為沒有被愛過,也就不知道該如何去愛。為了保護自己不再受到傷害
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
為什麼要學習撰寫程式? 使用別人所撰寫的軟體時,總是會受限於別人所提供的特定功能,但是當你遇到了一些工作是目前現有的軟體都幫不上忙的情況該怎麼辦? 如果你會撰寫程式,這時候就可以自己創造一個專為解決此工作的程式;換句話說,撰寫程式讓你擁有控制電腦的力量。 安裝 Python 首先必須在電腦
簡介: 這是一個關於程式設計的系列文章,或者準確的說是一系列的學習筆記,紀錄著我學習程式設計的筆記與心得。我決定從這本《深入淺出-程式設計》開始紀錄,原因是因為這本書在有限的篇幅中,僅可能的對於什麼是程式設計進行了生動的說明,內容著重於程式邏輯與現實編程中的所會遇到的實際問題,循序漸進且實際演練,
作者 稻盛和夫(1932/01/30 - 2022/08/24)。 1959年創立京都陶瓷股份有限公司(現稱京瓷),1984年創立第二電電(現稱KDDI)與成立稻盛財團,並創辦「京都賞」每年表彰對人類社會進步發展的有成人士,被譽為日本「經營之聖」。 簡介 作者回顧一路走來的人生與多年來的經營
作者 柳根榕,韓國最大閱讀論壇Awesome People 創辦人暨閱讀經營顧問CEO、 韓國知名自我開發部落格「超人老師的自我開發故事」格主。 這本書在說什麼 年少時期 小時候被繼母虐待,作者在沒有愛的環境下長大,因為沒有被愛過,也就不知道該如何去愛。為了保護自己不再受到傷害
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本文介紹了Python中的流程控制,包括if, elif, else語句,三元運算子,for和while迴圈,以及控制迴圈語句如break、continue和pass。透過範例程式碼,說明了如何使用這些語句和結構進行條件判斷,迴圈遍歷和控制程式流程。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
昨天有個種咖啡的客人A,拿著包咖啡豆跑來說 : 我來實現諾言了!! 長工滿頭五線譜~~~諾言??客人A說;上次我不是跟你說去別處買了包半磅600元的咖啡,但是覺得實在不好喝,你回我哪可不一定,說不定只是你個人感覺而已。我就帶來給你煮煮看。長 工愣了一下~~~好吧!拿出來吧! 平時不代煮外客豆,避
Thumbnail
本文詳細解說了 Python print() 函數的各種隱藏語法,包括 value、sep、end、file 和 flush。作者以清晰的範例和解說,讓從未接觸程式語言的人也能夠理解。而最後提到了訂閱房間的付費方式,並歡迎大家訂閱。文章內容較為詳細,提供了豐富的資訊。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
在人生中總是會遇到許多選擇,做了不同的選擇產生的結果也會不一樣,大多時候都是在為了要吃什麼在抉擇,小孩才做選擇大人全部都要,全部都要何嘗也不是一個選擇。 在Python程式語言中也有選擇的語法,就是If Else,如果是就做什麼,不是就做什麼,有別於其他程式語言,他不一定要有else,可以只有If
Thumbnail
邏輯運算子 它們在許多情境下都是程式語言中重要的工具,用於進行條件判斷和控制流程 在日常中總會遇到有些需要思考判斷的問題,比如要買東西,就會考慮到CP值,東西要好且要便宜,就是and的概念,如果在一些比較複雜的狀況,例如想晚餐吃什麼,就會想火鍋或燒烤都行,這就是or的概念。
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 while 語句,以及控制迴圈執行流程的語句和標籤概念。該章節目的在於讓讀者深入掌握流程控制功能,進一步提升編程技巧。
Thumbnail
本文介紹了Python中的流程控制,包括if, elif, else語句,三元運算子,for和while迴圈,以及控制迴圈語句如break、continue和pass。透過範例程式碼,說明了如何使用這些語句和結構進行條件判斷,迴圈遍歷和控制程式流程。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
昨天有個種咖啡的客人A,拿著包咖啡豆跑來說 : 我來實現諾言了!! 長工滿頭五線譜~~~諾言??客人A說;上次我不是跟你說去別處買了包半磅600元的咖啡,但是覺得實在不好喝,你回我哪可不一定,說不定只是你個人感覺而已。我就帶來給你煮煮看。長 工愣了一下~~~好吧!拿出來吧! 平時不代煮外客豆,避
Thumbnail
本文詳細解說了 Python print() 函數的各種隱藏語法,包括 value、sep、end、file 和 flush。作者以清晰的範例和解說,讓從未接觸程式語言的人也能夠理解。而最後提到了訂閱房間的付費方式,並歡迎大家訂閱。文章內容較為詳細,提供了豐富的資訊。
Thumbnail
本文介紹了Python中函式引數的*args和**kwargs用法,通過*args處理可變數量的位置引數,通過**kwargs處理可變數量的關鍵字引數。不僅介紹了相應的語法和程式範例,還解釋了它們的順序問題和建議的慣例用法。
Thumbnail
在人生中總是會遇到許多選擇,做了不同的選擇產生的結果也會不一樣,大多時候都是在為了要吃什麼在抉擇,小孩才做選擇大人全部都要,全部都要何嘗也不是一個選擇。 在Python程式語言中也有選擇的語法,就是If Else,如果是就做什麼,不是就做什麼,有別於其他程式語言,他不一定要有else,可以只有If
Thumbnail
邏輯運算子 它們在許多情境下都是程式語言中重要的工具,用於進行條件判斷和控制流程 在日常中總會遇到有些需要思考判斷的問題,比如要買東西,就會考慮到CP值,東西要好且要便宜,就是and的概念,如果在一些比較複雜的狀況,例如想晚餐吃什麼,就會想火鍋或燒烤都行,這就是or的概念。