不間斷 Python 挑戰 Day 20 - 專題:我如何真確理解...類別?

更新於 2022/07/13閱讀時間約 13 分鐘
全球公衛教授和公共教育家漢斯.羅斯林(Hans Rosling)在其著名的暢銷書「真確」中,提出了13個關於全球貧富、人口、出生/死亡率、教育、公衛等的「留意認知落差測驗」,回答的人不乏受過良好教育的專業人士,結果顯示,受測者在前12題平均只答對2題,遠不如隨機亂選的黑猩猩(如果黑猩猩會答題的話)。作者指出,這樣的結果來自於人類的誇大直覺與偏誤認知,並舉出十個扭曲認知的直覺是如何造成我們誤解身處的世界。
這篇文章並沒有要繼續深入本書的精華,但這本書絕對是連微軟共同創辦人比爾.蓋茲(Bill Gates)都掛保證的好書。這篇的靈感來自於這13道題,事實上,作者所創立的Gapminder基金會就把這一系列的問題放在網路上,提供一般的民眾接受測試,而本篇的目的在於使用到目前為止所學習的概念,實作一個Python版本的測驗程式。

程式架構

資料整理

我們取「真確」書中13道題的其中12道(排除一個圖表題),使用字典建成12個問題與答案形成的鍵值對。
fact_data = [
  {"question": "現今全世界的低所得國家裡,多少女孩會讀完小學?"
          "(A)20%(B)40%(C)60%", "answer": "C"},
  {"question": "世界上的多數人是生活在哪裡?"
          "(A)低所得國家(B)中所得國家(C)高所得國家", "answer": "B"},
  {"question": "在過去20年,全球赤貧人口占總人口的比例是⋯⋯"
          "(A)幾乎翻倍(B)大致不變(C)幾乎減半", "answer": "C"},
  {"question": "現今全球的平均壽命是多少?"
          "(A)50歲(B)60歲(C)70歲", "answer": "C"},
  {"question": "現今全球有20億個兒童,年齡介於0到15歲之間。根據聯合國的估算,到了2100年全球會有多少個兒童?"
          "(A)40億(B)30億(C)20億", "answer": "C"},
  {"question": "根據聯合國的估算,到了2100年全球會再增加40億人,而主要原因是什麼?"
          "(A)兒童人口增加(不到15歲)(B)成年人口增加(15歲到74歲)(C)老年人口增加(75歲以上)", "answer": "B"},
  {"question": "過去100年間,全球死於天災的人數是如何變化?"
          "(A)幾乎翻倍(B)大致不變(C)幾乎減半", "answer": "C"},
  {"question": "現今全球多少2歲兒童有接種疫苗?"
          "(A)20%(B)50%(C)80%", "answer": "C"},
  {"question": "全球30歲的男性平均接受過10年的學校教育,而同齡的女性平均接受過幾年的學校教育?"
          "(A)9年(B)6年(C)3年", "answer": "A"},
  {"question": "1996年,老虎、熊貓和黑犀牛都列為瀕危動物。現在這3種動物裡,哪幾種面臨更迫切的危機?"
          "(A)2種(B)1種(C)0種", "answer": "C"},
  {"question": "全球多少人口享有電力?"
          "(A)20%(B)50%(C)80%", "answer": "C"},
  {"question": "全球氣象專家認為接下來一百年裡平均氣溫會⋯⋯"
          "(A)更暖(B)一樣(C)更冷", "answer": "A"}
]

建立測驗庫類別

建立一個測驗庫類別CreateTestPool,使每一個問題與答案的配對都能生成一個獨立的物件,這個物件包含兩個屬性,即為問題(self.question)與答案(self.answer)。接著,我們把這些獨立的物件放入一個串列(test_pool)中,以方便取用。
class CreateTestPool:
  def __init__(self, question, answer):
    self.question = question
    self.answer = answer
test_pool = []
for fact in fact_data:
  fact_obj = CreateTestPool(fact["question"], fact["answer"])
  test_pool.append(fact_obj)

建立測驗產生器類別

測驗產生器類別(TestGenerator)的目的在於接受測驗庫類別所生成的物件串列,並與使用者互動完成測驗與計分。因此,這個類別包含了以下屬性:
  • 題庫的物件串列(self.question_list)
  • 使用者得分(self.score)
  • 使用者當下測驗的題號(self.question_number)
為了完成這個測驗,我們需要有以下的操作(方法):
  • 查詢是否後面還有題目(is_last_questions(self))
  • 產生下一道題目(generate_next_question(self))
  • 檢查答案(check_answer(self, user_answer, correct_answer))
  • 查詢分數(get_score(self))
class TestGenerator:
  def __init__(self, question_list):
    self.score = 0
    self.question_number = 0
    self.question_list = question_list
  def is_last_questions(self):
    return self.question_number < len(self.question_list)
  def generate_next_question(self):
    current_question = self.question_list[self.question_number]
    self.question_number += 1
    user_answer = input(f"Q{self.question_number}: {current_question.question} (A/B/C)?: ")
    self.check_answer(user_answer, current_question.answer)
  def check_answer(self, user_answer, correct_answer):
    if user_answer.lower() == correct_answer.lower():
      self.score += 1
      print("\t 答案正確!")
    else:
      print("\t 答案錯誤!")
    print(f"\t 正確答案是 {correct_answer}.")
    print(f"\t 你的分數: {self.score}/{self.question_number}.")
  
  def get_score(self):
    return self.score

測驗主程式

建立一個測驗產生器類別的物件,並在while迴圈內查詢是否已完成測驗,以決定是否繼續呈現下一個題目或是計算總分。
fact_test = TestGenerator(test_pool)
while fact_test.is_last_questions():
  fact_test.generate_next_question()
# comments
print(f"你的總分: {fact_test.score}/{fact_test.question_number}.")
if fact_test.get_score() > 4:
  print("恭喜你答得比黑猩猩好!")
elif fact_test.get_score() == 4:
  print("黑猩猩4ni?")
else:
  print("趕快買本書來看吧!")
在此專題中,我們把測驗產生器包裝成一個類別,它不需要知道測驗的內容,只需要提供正確的測驗庫,它便可呈現整個測驗的過程給使用者;此外,我們也把建立測驗庫的功能包裝成一個類別,只需要專注於測驗資料的內容與格式,便可以輕鬆更新題庫。

測驗畫面

以下是程式執行與答題的畫面:
Q1: 現今全世界的低所得國家裡,多少女孩會讀完小學?(A)20%(B)40%(C)60% (A/B/C)?: C
	 答案正確!
	 正確答案是 C.
	 你的分數: 1/1.
Q2: 世界上的多數人是生活在哪裡?(A)低所得國家(B)中所得國家(C)高所得國家 (A/B/C)?: B
	 答案正確!
	 正確答案是 B.
	 你的分數: 2/2.
Q3: 在過去20年,全球赤貧人口占總人口的比例是⋯⋯(A)幾乎翻倍(B)大致不變(C)幾乎減半 (A/B/C)?: B
	 答案錯誤!
	 正確答案是 C.
	 你的分數: 2/3.
Q4: 現今全球的平均壽命是多少?(A)50歲(B)60歲(C)70歲 (A/B/C)?: C
	 答案正確!
	 正確答案是 C.
	 你的分數: 3/4.
Q5: 現今全球有20億個兒童,年齡介於0到15歲之間。根據聯合國的估算,到了2100年全球會有多少個兒童?(A)40億(B)30億(C)20億 (A/B/C)?: C
	 答案正確!
	 正確答案是 C.
	 你的分數: 4/5.
Q6: 根據聯合國的估算,到了2100年全球會再增加40億人,而主要原因是什麼?(A)兒童人口增加(不到15歲)(B)成年人口增加(15歲到74歲)(C)老年人口增加(75歲以上) (A/B/C)?: B
	 答案正確!
	 正確答案是 B.
	 你的分數: 5/6.
Q7: 過去100年間,全球死於天災的人數是如何變化?(A)幾乎翻倍(B)大致不變(C)幾乎減半 (A/B/C)?: C
	 答案正確!
	 正確答案是 C.
	 你的分數: 6/7.
Q8: 現今全球多少2歲兒童有接種疫苗?(A)20%(B)50%(C)80% (A/B/C)?: C
	 答案正確!
	 正確答案是 C.
	 你的分數: 7/8.
Q9: 全球30歲的男性平均接受過10年的學校教育,而同齡的女性平均接受過幾年的學校教育?(A)9年(B)6年(C)3年 (A/B/C)?: B
	 答案錯誤!
	 正確答案是 A.
	 你的分數: 7/9.
Q10: 1996年,老虎、熊貓和黑犀牛都列為瀕危動物。現在這3種動物裡,哪幾種面臨更迫切的危機?(A)2種(B)1種(C)0種 (A/B/C)?: B
	 答案錯誤!
	 正確答案是 C.
	 你的分數: 7/10.
Q11: 全球多少人口享有電力?(A)20%(B)50%(C)80% (A/B/C)?: C
	 答案正確!
	 正確答案是 C.
	 你的分數: 8/11.
Q12: 全球氣象專家認為接下來一百年裡平均氣溫會⋯⋯(A)更暖(B)一樣(C)更冷 (A/B/C)?: A
	 答案正確!
	 正確答案是 A.
	 你的分數: 9/12.
你的總分: 9/12.
恭喜你答得比黑猩猩好!

程式範例

為什麼會看到廣告
avatar-img
47會員
36內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Wei-Jie Weng的沙龍 的其他內容
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
Python依據變數有效的範圍可以區分為全域變數(Global variable)或區域變數(Local variable)。在函數內宣告的變數為區域變數,有效範圍只有在函數內,函數外部無法引用這個變數;在函數以外宣告的變數為全域變數,它的有效範圍為整個檔案,並且在函數內部也可以引用這個變數。
這篇文章將利用之前所學過的一些東西,包括if敘述、串列、while迴圈、函數等等的觀念,來實作一個撲克牌的小遊戲-21點。
在前面的文章中我們學習了關於字典的基本用法,今天再討論更多關於字典的其它用法,以及它和串列、元組等的關聯。
在程式設計中,我們會使用到一些固定不會變動的資料內容,例如一年的月份、物體的邊長、過去一周的氣溫等等,使用串列的結構固然也可以用來儲存這些資料,但串列可以被新增或刪除,不能有效保護這類不可變動的資料。因此,Python也提供了另一種形式的資料結構,稱為元組,它的資料結構和串列相同,但資料的內容不可變
到目前為止,我們所學習的都是程序性的程式設計(procedural programming),也就是程式碼是透過一連串的指令組成的程序或函數,由上而下依序執行不同的程序或是呼叫函數來完成程式的功能。 Python其實是一種物件導向的程式(object oriented programming, 簡稱
Python提供集合做為其資料結構,它就如同高中數學所學集合的概念,集合的內容一般來說是具有某種特性的事物的整體,例如考試分數及格的群體、數字1到100內的所有奇數、球箱內所有球的顏色等。因此,在一個集合中,每個元素的地位都是相同且無序,並且只能出現一次,集合和集合之間,也可以進行交集、聯集、差集等
Python依據變數有效的範圍可以區分為全域變數(Global variable)或區域變數(Local variable)。在函數內宣告的變數為區域變數,有效範圍只有在函數內,函數外部無法引用這個變數;在函數以外宣告的變數為全域變數,它的有效範圍為整個檔案,並且在函數內部也可以引用這個變數。
這篇文章將利用之前所學過的一些東西,包括if敘述、串列、while迴圈、函數等等的觀念,來實作一個撲克牌的小遊戲-21點。
在前面的文章中我們學習了關於字典的基本用法,今天再討論更多關於字典的其它用法,以及它和串列、元組等的關聯。
在程式設計中,我們會使用到一些固定不會變動的資料內容,例如一年的月份、物體的邊長、過去一周的氣溫等等,使用串列的結構固然也可以用來儲存這些資料,但串列可以被新增或刪除,不能有效保護這類不可變動的資料。因此,Python也提供了另一種形式的資料結構,稱為元組,它的資料結構和串列相同,但資料的內容不可變
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
節目這邊聽 📎錄製時間: 2023.10 汪汪隊立大功! MRT(Mission Readiness Test)是難度最高的國際搜救犬認證! 但是我們有兩位英雄(一人一汪)順利通過這次的認證,拿到了優良的成績! 讓我們歡迎領犬員羅浩芳!就讓她帶著小編、江小姐還有各位聽眾,一起了解這次搜救犬
Thumbnail
這一陣子不少投資標的都在上漲 連成長性沒有科技股強的食品股也在慢慢上升中 今天記錄一下自己食品股大成的最新績效 身為雞肉雙雄的其中一雄 除了飼料、雞肉、雞蛋以外,還跨足了沙拉油、豬肉、海鮮、餐廳等事業體 幾乎可說是一檔食品ETF(還不用付管理費),進去它的官網就可以看到許多不同的事業體
Thumbnail
你現在也許單一個句子可以說得溜,但持續說話覺得尷尬的原因在於:缺乏連接詞。好的連接詞會讓口語表達更精確有力,讓韓國人聽到你說的話不需要猜測意思或重新思考,表達能力也就跟著上升!
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。這次播放的是:薔薇之戀、冰糖燉雪梨、HO!我的鬼神君、戀愛可以持續到天長地久、善德女王
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:必娶女人、kill me heal me、錦衣之下、101次求婚、灌籃高手這五個戲劇作品的主題曲。
近期許多地方受到洪水以及颱風的侵襲 但包你發的線路及網路穩定度完全不受到影響 大家可以放心,我們是24小時全年無休不間斷 就算你半夜三點要玩包你發也完全OK 不會像有些系統只在白天開放 而同樣的穩定度也是一大考驗 在這種供電不穩定的情況 也有可能導致其他遊戲斷線 但包你發機房穩定、有備用電源 完全不
Thumbnail
疫情長時間帶來了減少開放性的社交機會,最直接的影響莫過於情緒勒索造成的封閉性失調,感謝國立台灣戲曲學院傑出校友,為身心障礙的大寶寶們帶來一系列精彩的演出,透過精心策劃的舞蹈及雜耍表演,帶給住民體驗了跟以往不同的志工服務內容,見到了久違住民
Thumbnail
每一次TDCA的關愛陪伴,都讓受贈的服務對象感受到滿滿的幸福感,一起協力完成手作皮革鑰匙圈,每一針每一線都在訓練孩子們手眼協調的肢體,透過不同花色皮革來搭配,不僅訓練孩子對色彩的辨識能力,同時也在培養眼界裡的審美觀噢!
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
節目這邊聽 📎錄製時間: 2023.10 汪汪隊立大功! MRT(Mission Readiness Test)是難度最高的國際搜救犬認證! 但是我們有兩位英雄(一人一汪)順利通過這次的認證,拿到了優良的成績! 讓我們歡迎領犬員羅浩芳!就讓她帶著小編、江小姐還有各位聽眾,一起了解這次搜救犬
Thumbnail
這一陣子不少投資標的都在上漲 連成長性沒有科技股強的食品股也在慢慢上升中 今天記錄一下自己食品股大成的最新績效 身為雞肉雙雄的其中一雄 除了飼料、雞肉、雞蛋以外,還跨足了沙拉油、豬肉、海鮮、餐廳等事業體 幾乎可說是一檔食品ETF(還不用付管理費),進去它的官網就可以看到許多不同的事業體
Thumbnail
你現在也許單一個句子可以說得溜,但持續說話覺得尷尬的原因在於:缺乏連接詞。好的連接詞會讓口語表達更精確有力,讓韓國人聽到你說的話不需要猜測意思或重新思考,表達能力也就跟著上升!
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。這次播放的是:薔薇之戀、冰糖燉雪梨、HO!我的鬼神君、戀愛可以持續到天長地久、善德女王
Thumbnail
喜歡音樂的羅小咩,不定期將在周六中午12:00與你聊聊戲劇中的音樂,還有音樂中的戲劇。本次介紹:必娶女人、kill me heal me、錦衣之下、101次求婚、灌籃高手這五個戲劇作品的主題曲。
近期許多地方受到洪水以及颱風的侵襲 但包你發的線路及網路穩定度完全不受到影響 大家可以放心,我們是24小時全年無休不間斷 就算你半夜三點要玩包你發也完全OK 不會像有些系統只在白天開放 而同樣的穩定度也是一大考驗 在這種供電不穩定的情況 也有可能導致其他遊戲斷線 但包你發機房穩定、有備用電源 完全不
Thumbnail
疫情長時間帶來了減少開放性的社交機會,最直接的影響莫過於情緒勒索造成的封閉性失調,感謝國立台灣戲曲學院傑出校友,為身心障礙的大寶寶們帶來一系列精彩的演出,透過精心策劃的舞蹈及雜耍表演,帶給住民體驗了跟以往不同的志工服務內容,見到了久違住民
Thumbnail
每一次TDCA的關愛陪伴,都讓受贈的服務對象感受到滿滿的幸福感,一起協力完成手作皮革鑰匙圈,每一針每一線都在訓練孩子們手眼協調的肢體,透過不同花色皮革來搭配,不僅訓練孩子對色彩的辨識能力,同時也在培養眼界裡的審美觀噢!