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

更新 發佈閱讀 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
Ivan的沙龍
5會員
8內容數
Ivan的沙龍的其他內容
2023/11/08
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
2023/11/08
奇怪,名字呢? 在上一章中,我們成功的將"result.txt"檔案讀進來,並且取得了前三名的分數,但是仔細想想,這個程式卻沒有輸出前三名相對應的人名,這樣要怎麼頒獎給獲勝的人呢? 功能需求變更:請將程式修改成可以一同輸出前三名的名字與其分數 分析:按照目前所學,我們可以再多創建一個陣列用來存
Thumbnail
2023/10/30
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
2023/10/30
複習一下: 我們學習了關於撰寫程式的相關觀念 條件分支(if/else) : 藉由條件分支讓程式執行相對應的功能。 迴圈(while loop ) :程式利用迴圈反覆執行某個區塊的程式碼。 字串處理 (string) : 每個程式都在處理資料,而字串是一種非常重要且常用的資料。 函式(fu
Thumbnail
2023/10/14
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
Thumbnail
2023/10/14
字串處理 每個程式都是在處理資料,就拿上一章的猜數字遊戲來說,程式處理的資料就是從使用者輸入的數值與亂數產生器所產生的數值做比較,而這章節主要著重於字串這個資料型態的說明。 字串就是一連串的字元。 字串的第一個字為起始位置(Start),從 0 開始。 字串其他位置的字元與起始字元的距離則
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
Thumbnail
本章節帶領讀者了解 Kotlin 的流程控制語法,包括條件判斷、當做三元運算子使用的 if 表達式、用來替代 switch 語句的 when 語句、用於迴圈運作的 for 和 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迴圈,以及控制迴圈語句如break、continue和pass。透過範例程式碼,說明了如何使用這些語句和結構進行條件判斷,迴圈遍歷和控制程式流程。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
昨天有個種咖啡的客人A,拿著包咖啡豆跑來說 : 我來實現諾言了!! 長工滿頭五線譜~~~諾言??客人A說;上次我不是跟你說去別處買了包半磅600元的咖啡,但是覺得實在不好喝,你回我哪可不一定,說不定只是你個人感覺而已。我就帶來給你煮煮看。長 工愣了一下~~~好吧!拿出來吧! 平時不代煮外客豆,避
Thumbnail
昨天有個種咖啡的客人A,拿著包咖啡豆跑來說 : 我來實現諾言了!! 長工滿頭五線譜~~~諾言??客人A說;上次我不是跟你說去別處買了包半磅600元的咖啡,但是覺得實在不好喝,你回我哪可不一定,說不定只是你個人感覺而已。我就帶來給你煮煮看。長 工愣了一下~~~好吧!拿出來吧! 平時不代煮外客豆,避
Thumbnail
本文詳細解說了 Python print() 函數的各種隱藏語法,包括 value、sep、end、file 和 flush。作者以清晰的範例和解說,讓從未接觸程式語言的人也能夠理解。而最後提到了訂閱房間的付費方式,並歡迎大家訂閱。文章內容較為詳細,提供了豐富的資訊。
Thumbnail
本文詳細解說了 Python print() 函數的各種隱藏語法,包括 value、sep、end、file 和 flush。作者以清晰的範例和解說,讓從未接觸程式語言的人也能夠理解。而最後提到了訂閱房間的付費方式,並歡迎大家訂閱。文章內容較為詳細,提供了豐富的資訊。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News