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

更新於 發佈於 閱讀時間約 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.
恭喜你答得比黑猩猩好!

程式範例

本文程式範例收錄於:
https://github.com/wjweng/marathon_python/blob/master/Day1_to_25/marathon_python_day20.py

留言
avatar-img
留言分享你的想法!
avatar-img
Wei-Jie Weng的沙龍
48會員
36內容數
Wei-Jie Weng的沙龍的其他內容
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
對於程式的初學者而言,理解程式的流程、迴圈的進行、或是變數的變化會需要一定程度將程式在腦中進行運算的能力,要一段時間熟悉與適應,尤其是當程式執行的結果不如預期時,往往是計算的過程和自己所想像的不同,這時又更難靠自己的能力找出錯誤。因此,這邊要介紹的這個工具可以將程式執行的過程逐行將變數的變化視覺化地
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/07/13
在上一節介紹了 JSON 資料的基本架構後,我們將改寫並擴充密碼產生器程式,讓它能夠藉由 JSON 的資料結構完成帳密搜尋的功能。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
2022/06/23
JSON的全名叫JavaScript Object Notation,是由Douglas Crockford所設計的一種資料格式,最初應用在JavaScript程式語言中,做為一種資料交換的格式,而後被廣泛運用在Web開發與NoSQL資料庫,現今已成為一種重要的資料格式。
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
隨著疫情、戰爭、極端氣候等等到來,世界是不是越來越糟了? 還是我們對世界理解錯誤了? 1.二元分類 非黑及白的直覺偏誤。 概括型 別將世界二分化,分成我們和他們,現實不是這樣分類。 現今世界上多數人並不在低所得國家,而是在中等所得國家,連最低所得國家裡也有60%女孩讀完小學,識字
Thumbnail
隨著疫情、戰爭、極端氣候等等到來,世界是不是越來越糟了? 還是我們對世界理解錯誤了? 1.二元分類 非黑及白的直覺偏誤。 概括型 別將世界二分化,分成我們和他們,現實不是這樣分類。 現今世界上多數人並不在低所得國家,而是在中等所得國家,連最低所得國家裡也有60%女孩讀完小學,識字
Thumbnail
作者寫這本書、這13個真確問題的目的並不是為了打臉人們、推翻人們的既有認知,而是讓讀者從「意識到自己錯了」這一刻作為起點,打開對世界的好奇心,敏銳察覺自身的直覺偏誤,然後時時刻刻懷疑:媒體上、身旁人說的話、以及自己的印象,究竟是不是真實的。
Thumbnail
作者寫這本書、這13個真確問題的目的並不是為了打臉人們、推翻人們的既有認知,而是讓讀者從「意識到自己錯了」這一刻作為起點,打開對世界的好奇心,敏銳察覺自身的直覺偏誤,然後時時刻刻懷疑:媒體上、身旁人說的話、以及自己的印象,究竟是不是真實的。
Thumbnail
你腦袋中的世界,長什麼樣子? 在回答這個問題之前,可以先看看下面四個問題: 一、現今全球的平均壽命是多少?A50、B60、C70。 二、現今全世界低所得國家裡,多少女孩會讀完小學?A20%、B40%、C60%。 三、全球有多少人口享有電力?A20%、B50%、C80%。 四、過去20年,全球赤貧人口
Thumbnail
你腦袋中的世界,長什麼樣子? 在回答這個問題之前,可以先看看下面四個問題: 一、現今全球的平均壽命是多少?A50、B60、C70。 二、現今全世界低所得國家裡,多少女孩會讀完小學?A20%、B40%、C60%。 三、全球有多少人口享有電力?A20%、B50%、C80%。 四、過去20年,全球赤貧人口
Thumbnail
真確:扭轉十大直覺偏誤,發現事情比你想的美好 FACTFULNESS:Ten Reasons We're Wrong About the World--and Why Things Are Better Than You Think
Thumbnail
真確:扭轉十大直覺偏誤,發現事情比你想的美好 FACTFULNESS:Ten Reasons We're Wrong About the World--and Why Things Are Better Than You Think
Thumbnail
阿崴閱讀-真確 獨立思辯,問題解決。大概是這時代不會被淘汰的軟實力。但有更多的行為學告訴我們,在人類演化的過程中,我們有非常大量的行為與決策其實都是直覺!直覺會不會有偏誤呢?
Thumbnail
阿崴閱讀-真確 獨立思辯,問題解決。大概是這時代不會被淘汰的軟實力。但有更多的行為學告訴我們,在人類演化的過程中,我們有非常大量的行為與決策其實都是直覺!直覺會不會有偏誤呢?
Thumbnail
你最近一次接收新資訊而改變看法是什麼時候呢?如果有人提出證據,反駁你的論點,你願意接受自己可能犯錯而考慮新想法嗎?還是往往很難接受自己過去竟然一直抱著錯誤觀點呢? 之前讀過一本書叫《真確》,當時那本書就讓我很震驚的發現,我腦中竟然抱持著20年前教科書所教的東西沒有更新,即便現在世界已經完全不一樣了。
Thumbnail
你最近一次接收新資訊而改變看法是什麼時候呢?如果有人提出證據,反駁你的論點,你願意接受自己可能犯錯而考慮新想法嗎?還是往往很難接受自己過去竟然一直抱著錯誤觀點呢? 之前讀過一本書叫《真確》,當時那本書就讓我很震驚的發現,我腦中竟然抱持著20年前教科書所教的東西沒有更新,即便現在世界已經完全不一樣了。
Thumbnail
其實有很多我們對世界的認知已經是陳舊不堪的,哪些國家是開發中、已開發或是未開發?怎樣算貧窮?男女接受基本教育的比例?環保狀況有多糟?這些問題問問自己,發現自己的認知往往跟數據顯示的相差十萬八千里,而讀這本真確,可以讓人們較不易限於舊知的框架,更認認真真的看待我們現在所處的世界現況。
Thumbnail
其實有很多我們對世界的認知已經是陳舊不堪的,哪些國家是開發中、已開發或是未開發?怎樣算貧窮?男女接受基本教育的比例?環保狀況有多糟?這些問題問問自己,發現自己的認知往往跟數據顯示的相差十萬八千里,而讀這本真確,可以讓人們較不易限於舊知的框架,更認認真真的看待我們現在所處的世界現況。
Thumbnail
你還在相信高中社會課本上的內容是這世界的真實面貌嗎?為何這本書曾被比爾蓋茲作為美國大學生的畢業禮物?而你,又究竟有多了解這個世界呢?讓這位來自瑞典的國際衛生學教授用各式統計圖表和許多有趣的故事告訴你21世紀的全球長什麼樣子吧!
Thumbnail
你還在相信高中社會課本上的內容是這世界的真實面貌嗎?為何這本書曾被比爾蓋茲作為美國大學生的畢業禮物?而你,又究竟有多了解這個世界呢?讓這位來自瑞典的國際衛生學教授用各式統計圖表和許多有趣的故事告訴你21世紀的全球長什麼樣子吧!
Thumbnail
世界,不一樣了 有些事儘管牴觸我們的直覺認知,儘管顯得絕無可能,卻仍然真確。這本書在談世界,在談世界真正的樣子,也是在談你,以及你該如何真確思考,基於事實行動。 深具啟發性的書,足以改變我們看世界的方式,帶領我們建立新的思維習慣。
Thumbnail
世界,不一樣了 有些事儘管牴觸我們的直覺認知,儘管顯得絕無可能,卻仍然真確。這本書在談世界,在談世界真正的樣子,也是在談你,以及你該如何真確思考,基於事實行動。 深具啟發性的書,足以改變我們看世界的方式,帶領我們建立新的思維習慣。
Thumbnail
【摘下直覺偏誤的濾鏡,看清楚這個世界真實的樣貌】如果說2018年讀過的書有哪一本最讓我有「大開眼界」的頓悟時刻,毫無疑問就是這本《真確》了。跟這本書的認識來自於 Bill Gates 的推薦書單,有興趣的讀者也可以關注他的部落格 gatesnotes,常有許多好書推薦。
Thumbnail
【摘下直覺偏誤的濾鏡,看清楚這個世界真實的樣貌】如果說2018年讀過的書有哪一本最讓我有「大開眼界」的頓悟時刻,毫無疑問就是這本《真確》了。跟這本書的認識來自於 Bill Gates 的推薦書單,有興趣的讀者也可以關注他的部落格 gatesnotes,常有許多好書推薦。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News