不間斷 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.
恭喜你答得比黑猩猩好!

程式範例

為什麼會看到廣告
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
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
繼上一篇的破除執念,我按照內文的方式做,最近狀態的確好很多了。我偶爾會找對方說說話,有趣的是,偶爾還是會被激起一些情緒,但那比較像是內在小孩的BUG被抓到了,和對對方的情感關係不大。 比如說對方沒回覆,或是回答簡短的時候,我會情緒激動,因為我感受到"自己不被在乎"和"自己不值得"的負面信念。我同時
Thumbnail
讓愛心文具成為教育的養分 在尼泊爾,佛學院承載著重要的教育責任。很多家庭自小就將最優秀的孩子送來佛學院,讓他們能接受系統的教育和培養。有些孩子則來自非常貧困的家庭,佛學院也提供他們完善受教育的機會。在這趟尼泊爾助學行,德內ㄦ特別訂製準備了3,200個文具組及16箱色鉛筆,將我們的關懷送到了12所學
Thumbnail
世堅無奇不有,如果以一種單一的方式存活,豈不是錯過很多種可能性?
Thumbnail
90%的人都想過的問題! 應該很多人都想過⋯「你們是誰?」、「你們要幹什麼?」、「我在哪?」,這三個問題吧!⋯但我騙你們的啦!以上這是馬雲新三問😂是大家應該都想過⋯「生存的意義」! 其實我覺得根本沒意義啊!說到底你只是人類在繁衍過程精子跟卵子結合罷了,然後在女生肚子懷孕十個月後出生⋯難不成一出
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
我們時常會發現有些問題不見得有標準答案,也會發現回答問題的人多半站在自己的立場思考,當我們聽到別人的答案時,是否會感到大吃一驚,原來從別人口中吐出的答案竟然是我們未曾想過的觀點! 《森林有多少樹?》這本書便是講述許多動物輪番表達自己對於森林應該有幾棵樹木的看法,每隻動物都基於自己的需求
前言 與友輩聊及下一代,幾乎是人人搖頭,因為他們的思想、行為、價值觀好像都跟我們有著極大的差異,不婚不生,三不五時就換個工作,買豪車,三C一定要最新最貴的,養寵物,上健身房……,我忽的想到學生時代看過一篇"擁擠環境對老鼠的影響"相關的論文,但不確定實際名稱,因此在網路上打上"老鼠,擁擠”出來的有叫
Thumbnail
生命的天平,物種的法碼,不等值?! 初閱《大猩猩審判日》,舉世爭議的「電車難題」旋即躍入腦海,極為類似無限循環的辯論,孰是孰非?大約就是不同角度切入的截然。不過,從看似以人類為主導的世界,能夠開庭審判動物園僅因人類兒童誤入大猩猩領地可能因而喪命,即選擇格斃閒適居家的奧馬利(大猩猩)一案,或許也算是
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
繼上一篇的破除執念,我按照內文的方式做,最近狀態的確好很多了。我偶爾會找對方說說話,有趣的是,偶爾還是會被激起一些情緒,但那比較像是內在小孩的BUG被抓到了,和對對方的情感關係不大。 比如說對方沒回覆,或是回答簡短的時候,我會情緒激動,因為我感受到"自己不被在乎"和"自己不值得"的負面信念。我同時
Thumbnail
讓愛心文具成為教育的養分 在尼泊爾,佛學院承載著重要的教育責任。很多家庭自小就將最優秀的孩子送來佛學院,讓他們能接受系統的教育和培養。有些孩子則來自非常貧困的家庭,佛學院也提供他們完善受教育的機會。在這趟尼泊爾助學行,德內ㄦ特別訂製準備了3,200個文具組及16箱色鉛筆,將我們的關懷送到了12所學
Thumbnail
世堅無奇不有,如果以一種單一的方式存活,豈不是錯過很多種可能性?
Thumbnail
90%的人都想過的問題! 應該很多人都想過⋯「你們是誰?」、「你們要幹什麼?」、「我在哪?」,這三個問題吧!⋯但我騙你們的啦!以上這是馬雲新三問😂是大家應該都想過⋯「生存的意義」! 其實我覺得根本沒意義啊!說到底你只是人類在繁衍過程精子跟卵子結合罷了,然後在女生肚子懷孕十個月後出生⋯難不成一出
Thumbnail
我不知道,有多少人從自身的問題中,看到全人類的問題。 就是因為我以整體的角度出發,所以我個人的煩惱也是全體的煩惱。 因為系統的任何一個零件有故障,整個系統都存在崩潰的風險,因為環環相扣就是系統的定義。
Thumbnail
我們時常會發現有些問題不見得有標準答案,也會發現回答問題的人多半站在自己的立場思考,當我們聽到別人的答案時,是否會感到大吃一驚,原來從別人口中吐出的答案竟然是我們未曾想過的觀點! 《森林有多少樹?》這本書便是講述許多動物輪番表達自己對於森林應該有幾棵樹木的看法,每隻動物都基於自己的需求
前言 與友輩聊及下一代,幾乎是人人搖頭,因為他們的思想、行為、價值觀好像都跟我們有著極大的差異,不婚不生,三不五時就換個工作,買豪車,三C一定要最新最貴的,養寵物,上健身房……,我忽的想到學生時代看過一篇"擁擠環境對老鼠的影響"相關的論文,但不確定實際名稱,因此在網路上打上"老鼠,擁擠”出來的有叫
Thumbnail
生命的天平,物種的法碼,不等值?! 初閱《大猩猩審判日》,舉世爭議的「電車難題」旋即躍入腦海,極為類似無限循環的辯論,孰是孰非?大約就是不同角度切入的截然。不過,從看似以人類為主導的世界,能夠開庭審判動物園僅因人類兒童誤入大猩猩領地可能因而喪命,即選擇格斃閒適居家的奧馬利(大猩猩)一案,或許也算是
Thumbnail
十年前,我跟小悟參加了台南政府所舉辦的 24 小時不間斷進食比賽,當年,我以兩分之差,沒擠進金榜。在挑戰時間內,來不及吃狀元糕跟芋頭八寶冰,以致失掉食物王的頭銜。十年後,小悟說,要不要再來回味當年勇?我知道,年輕的我胃袋能撐船,可逝去的青春,最先反映在食慾上。我笑著說不了......
Thumbnail
持著前作的風格,《蜘蛛人:穿越新宇宙》在色彩或畫面的呈現上依舊大膽、前衛,並且嘗試藉由多重宇宙的「優勢」,在成長動畫的既有敘事上,嘗試更多不同的可能性。精彩的安排讓觀看這部作品讓成為十足的享受,並賦予了觀眾再次進場支持的充分動機。