在之前 從冷笑話 學python 基本輸出 print()已經學會如何用python來輸出訊息,
在 從閏年判斷 學 Python 的 if ... else ... 語法,
學會如何用進行流程控制和邏輯判斷。
接著,在上次的BMI(身體質量指標)計算教學裡,
學會如何用python來接收使用者輸入的訊息,並且做一些簡單的四則運算。
今天,在這次的BMI(身體質量指標)計算的續集裡,將學會funciton的基本觀念與實作,
把常用的功能封裝成可重複利用的元件: function。
function在數學上的觀念上是y = f(x) ,
給定輸入x,遵循固定的計算公式 或者 運算規則,計算出結果y。
function在程式領域的觀念也是類似的,
output = function( input )
給定輸入x,遵循固定的計算式 或者 運算、判斷邏輯,計算出結果輸出y。
白話地說,就是把一個特定常用的功能,封裝起來,變成可以重複利用的元件。
定義一個含有計算規則的function,名字叫做f,輸入是x,輸出是y
def f(x):
... 此處實現真正的計算規則...
return y
# 外面要呼叫function時,就用名字去呼叫,()內傳入輸入參數。
result = f(x)
承接上次同樣的範例,我們可以發現打招呼的邏輯與語句其實是有規則的,
可以把打招呼的功能包裝成greeting function。
name = input("What is your name? ")
print(f"Hi, {name}. Nice to meet you.")
定義一個greeting function
對應的python程式碼如下
def greeting(name):
message = f"Hi, {name}. Nice to meet you."
return message
完整的測試python程式碼如下
def greeting(name):
message = f"Hi, {name}. Nice to meet you."
return message
name = input("What is your name? ")
print( greeting(name) )
輸入:
Tom
輸出結果:
What is your name? Tom
Hi, Tom. Nice to meet you.
之後,如果要產生好幾次打招呼的訊息,只要呼叫greeting(name)即可。
就算要修改打招呼的內容或格式,也只要修改greeting(name)就可以即時更新,作用在整份專案上。
e = 自然底數 = 自然常數 近似於 (1 + 1/n)的n次方 = (1 + 1/n)^n, n越大時越準確
可以發現n不管是多大的正整數,
e近似值的計算公式都是相同的,計算邏輯也是雷同的。
我們可以把計算(1 + 1/n)^n的過程封裝成一個近似值計算的function,隨著n值的不同,返回精確度不同的近似值。
定義一個近似值計算的function calc_e(n)
def calc_e(n):
approx_e = (1 + 1/n) ** n
return approx_e
接著,再定義一個近似值計算的function check_precision,
方便觀察近似值的準確度到小數點下第幾位。
def check_precision(val, target, decimal_place):
return abs( int(val * 10**decimal_place) - int(target * 10**decimal_place) ) == 0
完整的測試python程式碼如下
import math
def calc_e(n):
approx_e = (1 + 1/n) ** n
return approx_e
def check_precision(val, target, decimal_place):
return abs( int(val * 10**decimal_place) - int(target * 10**decimal_place) ) == 0
places = {1: False, 2: False, 3:False}
print(f"e = {math.e} \n")
for n in range(1,5001):
estimated_e = calc_e(n)
for place in range(1,4):
if check_precision(estimated_e, math.e, place) and not places[place]:
print(f"approximated to {place} decimal place(s) at n = {n}")
print(f"e ~ { estimated_e } \n")
places[place] = True
輸出結果:
e = 2.718281828459045
approximated to 1 decimal place(s) at n = 74
e ~ 2.7001396788468326
approximated to 2 decimal place(s) at n = 164
e ~ 2.710040437932739
approximated to 3 decimal place(s) at n = 4822
e ~ 2.718000019542224
BMI = 體重(kg) / [ 身高(m) 的平方 ]
不論是誰,BMI的計算公式和提示訊息都是相同的。
我們可以把BMI的計算和訊息顯示封裝成function bmi_calc(weight, height)
在螢幕上顯示提示訊息,請使用者從鍵盤輸入體重和身高。
接著,在螢幕上顯示BMI和相對應的健康提示訊息。
一直反覆進行,直到使用者輸入-1離開程式。
def bmi_calc(weight, height):
# 計算BMI
bmi = weight / (height ** 2)
# 顯示結果
print(f"您的BMI值為:{bmi}")
# 判斷BMI範圍
if bmi < 18.5:
print("體重過輕")
elif 18.5 <= bmi < 25:
print("體重正常")
elif 25 <= bmi < 30:
print("體重過重")
else:
print("肥胖")
return
while True:
print("\n假如要離開程式,請輸入-1")
# 輸入體重和身高
weight = input("請輸入體重(kg):")
# 字串轉成浮點數
weight = float(weight)
if weight == -1:
break
height = input("請輸入身高(cm):")
# 字串轉成浮點數
height = float(height)
if height == -1:
break
# 公分轉換成公尺
height = height / 100
# 計算bmi
bmi_calc(weight, height)
測試範例:
輸入 與 輸出結果
假如要離開程式,請輸入-1
請輸入體重(kg):50
請輸入身高(cm):170
您的BMI值為:17.301038062283737
體重過輕
假如要離開程式,請輸入-1
請輸入體重(kg):70
請輸入身高(cm):180
您的BMI值為:21.604938271604937
體重正常
假如要離開程式,請輸入-1
請輸入體重(kg):-1
還有其他幾種不同的輸出結果,讀者可以試著輸入不同數值玩玩看。
function就相當於把一個常用的功能進行封裝,變成一個可以重複利用的小元件。
之後要使用這個功能就去call function即可。
之後要修改,也只要去修改對應的function定義,就可以套用到整份專案上。
讀者可以試著從生活中的範例開始練習,先定義出明確的輸入與計算規則,
接著寫幾個小程式測試一下是否與預期中的執行結果相符合。