Python实现年会抽奖程序:从基础脚本到面向对象重构

沈知远
沈知远
发布时间:2026-10-12 | 3人浏览过
原创

本文介绍如何使用Python实现年会抽奖程序。通过读取CSV文件获取员工数据,利用random模块进行随机抽取,并演示了从基础脚本到面向对象类的重构过程。文章包含代码示例、运行结果及关键步骤解析,帮助开发者快速掌握相关技术。

基础实现:读取与随机抽取

实现抽奖程序的核心在于数据读取和随机选择。首先,需要从存储员工信息的CSV文件中读取工号列表。Python的csv模块提供了便捷的读取功能,结合with语句可以确保文件操作完成后自动关闭,避免资源泄露。

import csv
#创建一个员工列表
emplist = []
#用with自动关闭文件
with open('c://emps.csv') as f:
 empf = csv.reader(f)
 for emp in empf:
  emplist.append(emp)

数据加载完成后,利用random模块的choice函数从列表中随机选取中奖者。为了防止重复中奖,每次抽取后需将中奖工号从列表中移除。以下代码演示了一等奖和二等奖的抽取过程:

import random
#利用random模块的chice函数来从列表中随机选取一个元素
e1 = random.choice(emplist)
#将中奖的员工从列表中剔除
emplist.remove(e1)
print('一等奖得主的号码是 %s' % e1)
print('进行三个二等奖的号码抽奖')
e2_1 = random.choice(emplist)
emplist.remove(e2_1)
e2_2 = random.choice(emplist)
emplist.remove(e2_2)
e2_3 = random.choice(emplist)
emplist.remove(e2_3)
print('获得3个二等奖是 %s %s %s',(e2_1,e2_2,e2_3))

这种初级版实现逻辑简单,但缺乏灵活性,例如奖项层级和名额需要硬编码在代码中,修改起来较为繁琐。

进阶实现:面向对象设计

为了提升程序的可扩展性和可维护性,可以将抽奖逻辑封装为一个类。通过面向对象的方式,可以定义抽奖文件的来源,并提供生成指定数量抽奖号码的方法。

类定义与初始化

定义Choujiang类,在__init__方法中接收CSV文件路径作为参数。同时,为了兼容Python 2环境,需要处理编码问题,设置默认编码为UTF-8。

#!/usr/bin/python
#coding=utf-8
import csv
import sys
import random
reload(sys) 
sys.setdefaultencoding('utf8')
#coding=utf-8
print("开始进行抽奖")
#定义个抽奖类,功能有输入抽奖级别和个数,打印出每个级别的抽奖员工号码
class Choujiang:
 #定义scv文件路径
 def __init__(self,filepath):
  self.empfile = filepath

核心抽奖逻辑

creat_num方法实现了完整的抽奖流程。首先读取员工列表并统计参与人数。接着,通过交互式输入获取抽奖层级数和每层的奖品数量,构建一个字典来存储配置信息。最后,遍历字典执行抽奖:

 def creat_num(self):
  emplist = []
  with open(self.empfile) as f:
   empf = csv.reader(f)
   for emp in empf:
    emplist.append(emp)
  print('共有%s 人参与抽奖' % len(emplist))
  levels = int(input('抽奖分几个层次,请输入:'))
  #定义一个字典
  level_dict = {}
  for i in range(0,levels):
   print('请输入当前获奖层次 %s 对应的奖品个数' % ( i + 1))
   str_level_dict_key = sys.stdin.readline()
   int_level_dict_key = int(str_level_dict_key)
   level_dict[i] = int_level_dict_key
   #循环完成后抽奖层次字典构造完毕
  #进行抽奖开始
  print('抽奖字典设置为: %s' % level_dict)
  for i in range(0,len(level_dict)):
   winers = []
   #产生当前抽奖层次i对应的抽奖个数
   for j in range(0,int(level_dict[i])):
    #利用random模块中的choice函数从列表中随机产生一个
    winer = random.choice(emplist)
    winers.append(winer)
    emplist.remove(winer)
   print('抽奖层次 %s 下产出的获奖人员有:' % (i + 1 ))
   print(winers)

程序入口

在主程序中实例化Choujiang类,并指定数据文件路径,即可启动抽奖程序。

#类功能定义完毕,开始初始化并使用
if __name__ == '__main__':
 peoples = Choujiang('c://emps.csv')
 peoples.creat_num()

运行示例与结果

在Python 3.4.3环境下运行上述代码,程序会提示输入抽奖层级和每层奖品数量。以下是一个典型的运行输出示例:

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> =============================================== RESTART ===============================================
>>> 
开始进行抽奖
共有24790 人参与抽奖
抽奖分几个层次,请输入:2
请输入当前获奖层次 1 对应的奖品个数
1
请输入当前获奖层次 2 对应的奖品个数
3
抽奖字典设置为: {0: 1, 1: 3}
抽奖层次 1 下产出的获奖人员有:
[['张三19826']]
抽奖层次 2 下产出的获奖人员有:
[['张三18670'], ['张三23235'], ['张三15705']]

从结果可以看出,程序成功读取了24790名员工数据,并根据用户输入的2个层级(一等奖1名,二等奖3名)完成了随机抽取。中奖人员工号被正确打印,且未出现重复。

关键技术点总结

  • CSV读取:使用csv.reader逐行读取数据,适合处理结构化文本文件。
  • 随机选择:random.choice从序列中随机返回一个元素,是抽奖逻辑的核心。
  • 列表操作:通过append和remove管理参与抽奖的员工列表,确保不重复中奖。
  • 面向对象:将数据源和抽奖逻辑封装在类中,提高了代码的复用性和结构清晰度。
  • 交互输入:使用input和sys.stdin.readline获取用户动态配置的奖项信息。

以上就是Python实现年会抽奖程序的详细内容,更多关于Python抽奖程序、CSV数据处理及面向对象设计的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表