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

閱讀時間約 1 分鐘

前言


在之前 從冷笑話 學python 基本輸出 print()已經學會如何用python來輸出訊息,

從閏年判斷 學 Python 的 if ... else ... 語法

學會如何用進行流程控制和邏輯判斷。


接著,在上次的BMI(身體質量指標)計算教學裡,

學會如何用python來接收使用者輸入的訊息,並且做一些簡單的四則運算。


今天,在這次的BMI(身體質量指標)計算的續集裡,將學會funciton的基本觀念與實作,
常用的功能封裝成可重複利用的元件: function


觀念

function在數學上的觀念上是y = f(x) ,
給定輸入x,遵循固定的計算公式 或者 運算規則,計算出結果y。


function在程式領域的觀念也是類似的,

output = function( input )

給定輸入x遵循固定的計算式 或者 運算、判斷邏輯,計算出結果輸出y

raw-image


白話地說,就是把一個特定常用的功能,封裝起來,變成可以重複利用的元件


語法

口語的表達

定義一個含有計算規則的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越大時越準確


raw-image


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


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

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

78會員
413內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
在資料結構與演算法裡, 最簡單的線性資料結構除了array之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list
在這次的BMI(身體質量指標)計算教學裡, 將學會如何用python來接收使用者輸入的訊息,並且做一些簡單的四則運算。
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
在程式語言裡,最基本的第一堂課通常就是最簡單也最直接的輸入和輸出, 今天,會從大家耳熟能詳的"Hello Wolrd"這個經典範例開始介紹 Python的基本的輸出print語法,最後以冷笑話的範例作為結尾的Demo。 從電腦的視角來看,什麼叫做Output輸出?
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
在資料結構與演算法裡, 最簡單的線性資料結構除了array之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list
在這次的BMI(身體質量指標)計算教學裡, 將學會如何用python來接收使用者輸入的訊息,並且做一些簡單的四則運算。
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
在程式語言裡,最基本的第一堂課通常就是最簡單也最直接的輸入和輸出, 今天,會從大家耳熟能詳的"Hello Wolrd"這個經典範例開始介紹 Python的基本的輸出print語法,最後以冷笑話的範例作為結尾的Demo。 從電腦的視角來看,什麼叫做Output輸出?
你可能也想看
Thumbnail
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
【運科竹愛訓練 : 👉快速提升身心健康的新方法:正念高強度間歇訓練👈 🏃‍♂️‍➡️+🧘‍♂️ 】 在當今快節奏的生活中,壓力和時間管理成為了普遍的挑戰。如何有效地維持身心健康已成為人們熱議的話題。最新研究顯示,將高強度間歇訓練結合正念......
Thumbnail
三月童里為讀者呈現風格迥異卻又同等精彩的兩檔台灣原創繪本展覽--- 大牆面展出「《森林裡倒下了一棵樹》林廉恩繪本原畫展」;小木屋則是「《跳舞就是做很多動作》吳睿哲繪本展」。不同於廉恩展覽區域滿滿的繪畫原稿和手稿,睿哲的展覽中,是隻煢煢獨立的紙偶,然而這樣的紙偶,卻迸發出不同於繪畫的故事能量與韻律感。
Thumbnail
趁著春節連假開始前,童里趕緊將新進書全數上架。除了必不可少的「法國繪本」,本次也進了一些「葡萄牙繪本」,以及眾多讀者翹首以盼的「書籍藝術家 Suzy Lee 獨立出版品」,讓各位讀者在假期間也能保有選書樂趣☺️ 而連假過後,童里也安排好了各式精采活動幫心靈充充電,迎接新的一年🧨🧨🧨
Thumbnail
你心中希望這件事能這樣進行,能嗎? 想知道答案? 請再次在心中,用力地想著這個「希望」, 然後, 。 。。 。。。 。。。。。 。。。。。。 《解答之書》想跟你說的是:
Thumbnail
「八仙山」是日本名字,因為八仙山有「八千」日尺高,取其諧音「八仙」命名。1915-1963年長達48年的林業時光,留下了滿山整齊的人造林與索道頭、神社和國小遺址,訴說著林業的故事。(取自 農業部林業及自然保育署) 平日門票100元,假日150元。 10:10從停車場出發
Thumbnail
今天,我終於完成了20歲以前的最後一場招募活動,在壓力完全解除的週五晚上10點,終究還是忍不住淚水,把壓抑已久的情緒全部爆發出來
Thumbnail
202302 要死不活的二月, 加州在今年2月, 突然下大雨, 山上還下雪, 我的身體狀況又變不好, 再度想起老了絕對要往熱帶國家去定居。 在這個充滿winter blue心情下, 看現陳彥博超馬的新聞真的是很厲志, 馬上把自己睡眠時間調整好, 就算沒跑步, 拉拉筋也是好的, 整個二月只跑了20公里
Thumbnail
2023開始跑 統計一下2022年, 總共跑了377.5公里。 跑最多是八月, 跑了67.3公里, 難怪覺得自己變黑很多, 跑最少就是12月, 只跑了12公里, 剩下時間都在家感冒😷, 平均每每月跑31.5公里。 2023年, 目標十分簡單, 2023年年底要和寶寶一起跑十公里, 所以現在冷得要命
Thumbnail
0103 4.8K 11.47/Km 2022年,第一天練跑,氣溫11度,風又大,帽子,手套外套全附武裝。 0105 3.8K 11.39/km 今天氣溫升高到16度,我反而跑不太動。美國有一百二十五萬人感染omicron,看來最近單獨跑步是最安心的活動。 0109 3.1K 11.05/Km
Thumbnail
2020新冠年, 整個年都在美國家蹲, 身體越來越差, 看老公越來越不順眼, 看寶寶越來越心累, 感覺這個婚姻可能也得了新冠肺炎沒解藥救。 死馬當活馬醫, 面對二位體質體力和我天差地遠的家庭成員, 寶寶身體好到常常只包尿布, 沒穿衣服, 四處奔跑。 老公在還沒認識我之前業餘興趣是, 喝到一點冷飲,
Thumbnail
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
【運科竹愛訓練 : 👉快速提升身心健康的新方法:正念高強度間歇訓練👈 🏃‍♂️‍➡️+🧘‍♂️ 】 在當今快節奏的生活中,壓力和時間管理成為了普遍的挑戰。如何有效地維持身心健康已成為人們熱議的話題。最新研究顯示,將高強度間歇訓練結合正念......
Thumbnail
三月童里為讀者呈現風格迥異卻又同等精彩的兩檔台灣原創繪本展覽--- 大牆面展出「《森林裡倒下了一棵樹》林廉恩繪本原畫展」;小木屋則是「《跳舞就是做很多動作》吳睿哲繪本展」。不同於廉恩展覽區域滿滿的繪畫原稿和手稿,睿哲的展覽中,是隻煢煢獨立的紙偶,然而這樣的紙偶,卻迸發出不同於繪畫的故事能量與韻律感。
Thumbnail
趁著春節連假開始前,童里趕緊將新進書全數上架。除了必不可少的「法國繪本」,本次也進了一些「葡萄牙繪本」,以及眾多讀者翹首以盼的「書籍藝術家 Suzy Lee 獨立出版品」,讓各位讀者在假期間也能保有選書樂趣☺️ 而連假過後,童里也安排好了各式精采活動幫心靈充充電,迎接新的一年🧨🧨🧨
Thumbnail
你心中希望這件事能這樣進行,能嗎? 想知道答案? 請再次在心中,用力地想著這個「希望」, 然後, 。 。。 。。。 。。。。。 。。。。。。 《解答之書》想跟你說的是:
Thumbnail
「八仙山」是日本名字,因為八仙山有「八千」日尺高,取其諧音「八仙」命名。1915-1963年長達48年的林業時光,留下了滿山整齊的人造林與索道頭、神社和國小遺址,訴說著林業的故事。(取自 農業部林業及自然保育署) 平日門票100元,假日150元。 10:10從停車場出發
Thumbnail
今天,我終於完成了20歲以前的最後一場招募活動,在壓力完全解除的週五晚上10點,終究還是忍不住淚水,把壓抑已久的情緒全部爆發出來
Thumbnail
202302 要死不活的二月, 加州在今年2月, 突然下大雨, 山上還下雪, 我的身體狀況又變不好, 再度想起老了絕對要往熱帶國家去定居。 在這個充滿winter blue心情下, 看現陳彥博超馬的新聞真的是很厲志, 馬上把自己睡眠時間調整好, 就算沒跑步, 拉拉筋也是好的, 整個二月只跑了20公里
Thumbnail
2023開始跑 統計一下2022年, 總共跑了377.5公里。 跑最多是八月, 跑了67.3公里, 難怪覺得自己變黑很多, 跑最少就是12月, 只跑了12公里, 剩下時間都在家感冒😷, 平均每每月跑31.5公里。 2023年, 目標十分簡單, 2023年年底要和寶寶一起跑十公里, 所以現在冷得要命
Thumbnail
0103 4.8K 11.47/Km 2022年,第一天練跑,氣溫11度,風又大,帽子,手套外套全附武裝。 0105 3.8K 11.39/km 今天氣溫升高到16度,我反而跑不太動。美國有一百二十五萬人感染omicron,看來最近單獨跑步是最安心的活動。 0109 3.1K 11.05/Km
Thumbnail
2020新冠年, 整個年都在美國家蹲, 身體越來越差, 看老公越來越不順眼, 看寶寶越來越心累, 感覺這個婚姻可能也得了新冠肺炎沒解藥救。 死馬當活馬醫, 面對二位體質體力和我天差地遠的家庭成員, 寶寶身體好到常常只包尿布, 沒穿衣服, 四處奔跑。 老公在還沒認識我之前業餘興趣是, 喝到一點冷飲,