2024-08-25|閱讀時間 ‧ 約 11 分鐘

🏃‍♀️從 BMI計算 學python function 函式觀念與實作

前言


在之前 從冷笑話 學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

對應的python語法

def f(x):

... 此處實現真正的計算規則...
return y


# 外面要呼叫function時,就用名字去呼叫,()內傳入輸入參數。
result = f(x)

範例1: 經典的問候


承接上次同樣的範例,我們可以發現打招呼的邏輯與語句其實是有規則的
可以把打招呼的功能包裝成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)就可以即時更新,作用在整份專案上


範例2: e的近似值估計


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

DEMO: BMI計算機


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定義,就可以套用到整份專案上


讀者可以試著從生活中的範例開始練習,先定義出明確的輸入與計算規則,

接著寫幾個小程式測試一下是否與預期中的執行結果相符合。

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.