天天看點

場景程式設計集錦 - 吉米的總統夢想1. 場景描述2. 程式設計思路3. 代碼實作4. 運作效果

1. 場景描述

場景程式設計集錦 - 吉米的總統夢想1. 場景描述2. 程式設計思路3. 代碼實作4. 運作效果

  吉米是太平洋島國一個貧苦家庭的孩子,他的夢想就是當總統,引領國家走向富強之路。

  開學的第一堂課上,老師用白色的粉筆在黑闆上寫下了“我的夢想”,同學們都陷入了思考。大衛的夢想是當一名科學家,用奇思妙想改變世界,探索人類未知的秘密;傑克的夢想是當一名妙手回春的醫生,用高超的醫術解除病人的痛苦;迪娜的夢想是當一名歌手,讓自己的歌聲傳遍世界的每一個角落;吉米的夢想是當總統,剛說到這裡,教室裡就傳來一陣又一陣的嘲笑聲,因為吉米的父親是一個農民,吉米家連溫飽都無法保障,他想當總統,簡直就是癡人說夢。在走出校園的那一年,吉米接替了父親當上了農民。吉米能夠吃苦耐勞,在地裡一呆就是30多年,他研發出了很多能讓農作物産量成倍提升的方法,55歲的吉米擁有了自己的綠色生态農業公司。吉米的公司座落在城市最繁華的地段,生意越做越大,吉米成了全國知名的企業家,與此同時他還熱心公益,回報社會。吉米70歲那年,他的綠色生态農業公司成功上市了。望着窗外的摩天大廈,口中反複念叨着他兒時的夢想,在那個物質極度匮乏的年代許下的願望,半個多世紀過去了都一直未曾改變。73歲的吉米決定參加總統選舉,最終因為身體原因不得不中途退出競選。在他彌留之際,他告訴兒子小吉米:我從小的夢想就是當總統,引領國家走向富強之路。現在我倒在了追求夢想的路上,此生無悔!十年之後,小吉米也參加了總統競選,最後吉米以壓倒性優勢戰勝其他競選人,成功當選新一屆總統。

  吉米父子的故事給我們的啟迪:在實作夢想的道路上都會遭遇無盡的荊棘,隻要堅持夢想,在追夢的路上不斷前行,終能創造奇迹,夢想成真。

下面我們将根據以上場景,模拟總統大選的投票和選票統計的過程。

2. 程式設計思路

  為了模拟投票和計票過程,我們需要解決以下幾個關鍵問題:

2.1 參選人

  使用字典candidates存放參選人資訊,字典的鍵是參選人編号,字典的值是參選人姓名。内容如下:

candidates = {1: ‘jimmy’, 2: ‘jenifer’, 3: ‘peter’, 4: ‘linda’, 5: ‘roger’}

這個字典描述了5位參選人。1号參選人是jimmy,2号參選人是jenifer,3号參選人是peter,以此類推。

2.2 選票

  我們使用清單votes來存放選票,這個清單中的每個元素代表一張選票,它是一個整數,對應參選人字典candidates中的參選人編号。例如:

votes = [1,5,3,1,1]

表示清單votes中存放了5張選票,對照字典candidates找出映射關系,我們可以得出結論:

jimmy : 3 張選票

roger : 1 張選票

peter : 1 張選票

2.3 模拟生成選票

  編寫函數make_votes(voter_num, candidate_num),模拟生成選票。其中參數voter_num代表投票人數,candidate_num代表參選人數;傳回值是一個存放選票的清單votes。其内容為如下樣式:

votes = [1, 3, 5, 2, 1, 4, 4, 1]

2.4 統計選票

  編寫函數count_votes(votes),實作選票統計功能。參數votes是一個清單,存放所有參選人的選票。傳回值是字典candidate_votes,諸如以下内容:

candidate_votes = { 1:3, 3:1, 5:1, 2:1, 4:2 }

代表如下含義:

jimmy : 3 張選票;

peter : 1 張選票;

roger : 1 張選票;

jenifer : 1 張選票;

linda : 2 張選票。

2.5 統計結果可視化

  編寫函數:visualize(index, value, color),繪制選票統計直方圖。其輸入參數index為參選人姓名清單,value 是選票數清單,而color則是繪圖中使用的顔色清單。

3. 代碼實作

"""
elect.py : 吉米的總統夢想
"""
import random
from sys import argv, exit
from matplotlib import pyplot as plt

candidates = {1: 'jimmy', 2: 'jenifer', 3: 'peter', 4: 'linda', 5: 'roger'}  # 參選人字典
color_lst = ['aquamarine', 'dodgerblue', 'indianred', 'darkorange', 'seagreen']  # 顔色清單

def make_votes(voter_num, candidate_num):
""" 
功能:模拟生成選票 
參數:
voter_num : 投票人數
candidate_num : 參選人數
傳回:
votes :選票清單
"""
votes = []
    for i in range(voter_num):  # ①
    vote = random.randint(1, candidate_num)  # ②
    votes.append(vote)   # ③

return votes

def count_votes(votes):
""" 
功能:按參選人統計選票
參數:
votes :選票池清單
傳回:
candidate_votes : 包含參選人編号及選票數的字典
"""
    candidate_votes = {}
    for vote in votes:  # ④
        if vote in candidate_votes:  # ⑤
            candidate_votes[vote] += 1
        else:
            candidate_votes[vote] = 1

    return candidate_votes

def visualize(index, value, color):
    """ 
功能:選票資料可視化,繪制直方圖
參數:
index : 參選人清單
value : 參選人所得選票數的清單
color : 繪圖使用的顔色清單
"""
fig_mgr = plt.get_current_fig_manager()
    fig_mgr.set_window_title("Counting-Votes")

    plt.xlabel('Candidates', color='red')
    plt.ylabel('Votes', color='red')
    plt.bar(index, value, width=0.7, color=color)
    plt.title('Counting - Votes', color='red')

    data = zip(index, value)  # ⑥
for x, y in data:  # ⑦
        plt.text(x, y, y, ha='center', va='bottom')
    plt.show()

def main():
    if len(argv) != 2:
        print('Usage: elect.py voter_number')
        exit(1)
    voters = int(argv[1])  

votes = make_votes(voters, len(candidates))  # ⑧
    candidate_votes = count_votes(votes)  # ⑨

    index = [candidates[k] for k in candidate_votes]
    value = candidate_votes.values()
    visualize(index, value, color_lst)  # ⑩

if __name__ == '__main__': 
    main()

           

程式主要語句說明如下:

語句①按照投票人數,生成選票。每個投票人隻能投一票,并且隻能投給1名參選人;

語句②随機生成1張選票,使用一個整數表示,其含義是參選人編号;

語句③将1張選票添加到選票清單votes中,我們可以把votes了解為選票池;

語句④通過循環語句,對選票池中的每一張進行分類統計;

語句⑤按參選人編号分類,統計累加所得選票數;

語句⑥生成可疊代變量data,其中每個元素是包含參選人姓名和得票數的元組,諸如以下内容:

[ (‘jimmy’, 26), (‘roger’, 20), (‘jenifer’, 18), (‘peter’, 13), (‘linda’, 23) ]

語句⑦完成在直方圖的立柱列印選票數;

語句⑧調用make_votes()建立選票池,參數分别是投票人數和參選人數;

語句⑨調用count_votes()統計選票,輸入參數是選票池votes清單;

語句⑩調用函數visualize()實作選票可視化展現,它是通過調用第三方繪圖庫matplotlib實作的。

4. 運作效果

4.1 運作環境

  由于資料可視化部分使用了第三方繪圖庫:matplotlib,是以在程式運作之前,我們需要在Python環境中進行手動安裝,可在Windows指令行視窗中執行以下指令即可:

D:>pip install matplotlib

如果安裝速度慢,可以指定安裝源。執行以下指令,将完成快速安裝:

D:>pip install matplotlib -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

4.2 程式執行

D:\cases\吉米的總統夢想>python elect.py 100

代表有100人參加選舉投票,程式執行結果如下圖所示:

場景程式設計集錦 - 吉米的總統夢想1. 場景描述2. 程式設計思路3. 代碼實作4. 運作效果

在以上圖表中:橫軸代表候選人,縱軸代表候選人所獲得的選票數。

  如果你對本案例的免費視訊講解有興趣,可在百度中搜尋:寰銀學堂,觀看項目開發實踐 -“選票統計可視化”。

4.3 壓力測試

  如果需要統計百萬、千萬、甚至是上億量級的選票,執行本程式會導緻電腦系統當機崩潰嗎?需要什麼樣配置的電腦可以完成此項任務?筆記本電腦是否可以勝任呢?

  我們強烈鼓勵讀者進行以上壓力測試,或許這樣的測試将會颠覆一些傳統固有的思維定式,增長全新的見識。

4.4 優化建議

  到目前為此,elect.py程式子產品的代碼量超過60多行,為友善日後的代碼維護和代碼重用,我們可以把函數make_votes(), count_votes()和函數visualize()的程式代碼從子產品elect.py中剝離出來,形成新的子子產品可取名為votes.py,并在主子產品elect.py中使用語句from votes import *,這樣你就可以使用子子產品中的函數了。關于具體的實作方法在此不再贅述。

繼續閱讀