场景编程集锦 - 吉米的总统梦想

news2024/11/17 15:36:42

1. 场景描述

  吉米是太平洋岛国一个贫苦家庭的孩子,他的梦想就是当总统,引领国家走向富强之路。

  开学的第一堂课上,老师用白色的粉笔在黑板上写下了“我的梦想”,同学们都陷入了思考。大卫的梦想是当一名科学家,用奇思妙想改变世界,探索人类未知的秘密;杰克的梦想是当一名妙手回春的医生,用高超的医术解除病人的痛苦;迪娜的梦想是当一名歌手,让自己的歌声传遍世界的每一个角落;吉米的梦想是当总统,刚说到这里,教室里就传来一阵又一阵的嘲笑声,因为吉米的父亲是一个农民,吉米家连温饱都无法保障,他想当总统,简直就是痴人说梦。在走出校园的那一年,吉米接替了父亲当上了农民。吉米能够吃苦耐劳,在地里一呆就是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人参加选举投票,程序执行结果如下图所示:
在这里插入图片描述
在以上图表中:横轴代表候选人,纵轴代表候选人所获得的选票数。

  如果你对本案例的免费视频讲解有兴趣,可在百度中搜索:寰银学堂,观看项目开发实践 -“选票统计可视化”。

4.3 压力测试

  如果需要统计百万、千万、甚至是上亿量级的选票,执行本程序会导致电脑系统宕机崩溃吗?需要什么样配置的电脑可以完成此项任务?笔记本电脑是否可以胜任呢?
  我们强烈鼓励读者进行以上压力测试,或许这样的测试将会颠覆一些传统固有的思维定式,增长全新的见识。

4.4 优化建议

  到目前为此,elect.py程序模块的代码量超过60多行,为方便日后的代码维护和代码重用,我们可以把函数make_votes(), count_votes()和函数visualize()的程序代码从模块elect.py中剥离出来,形成新的子模块可取名为votes.py,并在主模块elect.py中使用语句from votes import *,这样你就可以使用子模块中的函数了。关于具体的实现方法在此不再赘述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS初级教程(文本)【第六天】

文章目录【1】CSS 文本[字体颜色|背景色]【2】CSS 文本对齐【3】CSS 文字装饰【4】CSS 文本转换[大写或小写]【5】CSS 文字间距【6】CSS 文本阴影【7】所有 CSS 文本属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CS…

Windows访问控制 -- SID

Windows访问控制是一个比较大的题目,因此计划用一系列的文章简单谈一下这个。本篇是开篇,介绍SID。 Windows访问控制定义 Windows访问控制的含义可以参考MSDN的描述:Access control refers to security features that control who can acce…

Java集合容器介绍

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示: Collection接口:单列数据,定义了存取一组对象的方法的集合 1、List:元素有序(指的是存储时,与存放顺序保持一致)、可重复的…

【Docker】(四)使用volume持久化Docker容器中的Redis数据

1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远程镜像仓库管理镜像…

[ 数据结构 ] 赫夫曼编码--------数据、文件压缩解压

0 引出 如上图:给定字符串按定长编码处理,最终对应二进制长度为359 思考:如何压缩,将359有效降低? ----回顾:赫夫曼树 1 数据压缩 拿到数据(字符串)的第一反应,虽然知道应该也像上面一样转为字节数组,但就不知道该怎么办了?统计数组中各字节使用的次数,将次数作为权值,字节…

2023.1.8 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.论文主要贡献5.相关工作5.1 序列感知的推荐系统5.2 神经注意模型6.模型:ATTREC6.1 序列推荐6.2 基于Self-Attention的用户短期兴趣建模6.3 用户长期兴趣建模6.4 模型学习7.实验7.1 数据集7.2 评估指标7.3 模型比较7.4 实验…

SSO单点登录实例详解(前端传Code授权登录)

什么是 SSO(单点登录) SSO 英文全称 Single Sign On,单点登录。SSO 是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 单点登录流程 单点登录大致流程如下所示: 单点登录详细流程&#x…

【自学C++】C++变量初始化

C变量初始化 C变量初始化教程 变量 的初始化就是在定义变量的同时,给变量设置一个初始值,在 C 中,如果定义变量没有初始化,那么变量有可能会被赋值也有可能不会赋值。 如果是定义的 全局变量 或者 静态变量,未初始化…

2022年语音合成(TTS)和语音识别(ASR)年度总结

论文统计每月更新一次,主要跟踪语音合成和语音识别的发展状况(很多文章都是在会议后才发出,但不影响统计。统计过程难免存在疏漏,因此统计结果仅供参考。所有文章语音合成领域统计列表请访问http://yqli.tech/page/tts_paper.html&#xff0c…

绝大多数人远远低估了软件开发的难度

给你付钱了,你应该把软件做好! 这个话相当于: 给你付钱了,你应该把月亮摘下来! 趣讲大白话:臣妾做不到 ********** 软件是特殊商品服务 可以说很难有标准 开发的难度取决于需求多少,技术难度&a…

Java Map集合的介绍和使用

什么是Map类型的集合 介绍 1.用于保存具有映射关系的数据(key——value)。 2.Map中的key和value可以是任意的类型的数据。 3.Map中的key值不允许重复。 4.Map中的value值可以重复。 5.一般常用string作为value的key。 6.key和value之间存在一一对…

如何进行地图SDK开发(二)——示例文档

概述 前面的文章文章我们写到了SDK的开发以及ak认证的实现,在本文我们继续讲讲地图SDK开发中的示例文档的实现。 技术点 vue3viteelement-plusmonaco-editor 实现后效果 实现 1. 工程初始化 1.1 搭建工程 搭建工程的过程请参照博文(使用vite搭建vue3项目&…

javaEE初阶 — 线程池

文章目录线程池1 什么是线程池2 标准库中的线程池2.1 什么是工厂模式2.2 如何使用标准库中的线程池完成任务2.3 ThreadPoolExecutor 构造方法的解释3 实现一个线程池线程池 1 什么是线程池 随着并发程度的提高,随着对性能要求标准的提高会发现,好像线程…

[cpp进阶]C++异常

文章目录C语言传统处理错误的方式C异常概念C异常使用异常的抛出和捕获异常的重新抛出异常安全异常规范自定义异常体系C标准库的异常体系异常的优缺点C语言传统处理错误的方式 传统的错误处理机制: 终止程序。assert断言直接终止程序。缺点:过于粗暴&am…

Fiddler抓取手机APP报文

Http协议代理工具有很多,比如Burp Suite、Charles、Jmeter、Fiddler等,它们都可以用来抓取APP报文,其中charles和Burp Suite是收费的,Jmeter主要用来做接口测试,而Fiddler提供了免费版,本文记录一下在Windo…

位运算做加法,桶排序找消失元素,名次与真假表示,杨氏矩阵,字符串左旋(外加两道智力题)

Tips 1. 2. 3. 大小端字节序存储这种顺序只有在放进去暂时存储的时候是这样的,但是一旦我里面的数据需要参与什么运算之类的,会“拿出来”先恢复到原先的位置再参与运算,因此,大小端字节序存储的什么顺序不影响移位运算等等…

【案例教程】CLUE模型构建方法、模型验证及土地利用变化情景预测实践技术

【前沿】:土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译,可获取历史或当前任何一个区域的土地利用/土地覆盖数据,用于评估区域的生态环境变化、评价重大生态工程建设成效等。借助CLUE模型&…

声音产生感知简记

声音产生 人的发音器官包括:肺、气管、声带、喉、咽、鼻腔、口腔、唇。肺部产生的气流冲击声带,产生震动。 声带每开启和闭合一次的时间是基音周期(Pitch period,T),其到数为基音频率(F.=1/T,基频),范围在70-450Hz。基频越高,声音越尖细,如小孩的声音比大人尖,就是…

编译错误2

本文迁移自本人网易博客&#xff0c;写于2015年11月25日&#xff0c;编译错误2 - lysygyy的日志 - 网易博客 (163.com)1、error C2059:语法错误&#xff1a;“<L_TYPE_RAW>”error C2238:意外的标记位于“;”之前.错误代码定位于&#xff1a;BOOL TreeView_GetCheckState…

excel函数公式:常用高频公式应用总结 上篇

公式1&#xff1a;条件计数条件计数在Excel的应用中十分常见&#xff0c;例如统计人员名单中的女性人数&#xff0c;就是条件计数的典型代表。条件计数需要用到COUNTIF函数&#xff0c;函数结构为COUNTIF(统计区域,条件)&#xff0c;在本例第一个公式COUNTIF(B:B,G2)中&#xf…