又到年底了,你们公司搞年会了不?

年会上抽奖了不?

抽中你了不?

今天我们就来写一个年会抽奖的代码片段。

不过……

先请大家猜一猜下面这段代码的运行效果:

import random
import timepeople = ['kingname', '王小一', '李小二', '张小三', '刘小四', '卢小五', '马小六', '周小七', '丁小八', '朱小九']
for i in range(1, 11):lucky_guy = random.choice(people)print(f'第{i}次抽奖,中奖用户:{lucky_guy}')time.sleep(1)

你是不是以为这段代码运行以后,结果如下图所示?

但实际上,我可以让输出结果根据我的意愿随意变动,例如像下面这个 gif ,所有输出结果都是同一个人:

你可以先不要往下看,放下手机,自己写一下代码,试一试 如何才能实现 gif 中的效果。

下面来为大家解密。

要实现这个效果,只需要两个知识点:

  1. Python自带模块是可以被覆盖的

  2. Python 的 import 在同一个运行时只会导入一次

首先来看第一个知识点。Python 的自带模块是可以被覆盖的,所以我们先来定义一个函数:

def choice(option):return 'kingname'

接下来,使用这个函数覆盖random.choice

import random
random.choice = choice

现在,无论给random.choice传入什么参数,它始终都会返回kingname,运行效果如下图所示:

这个时候,你可能会说,那别人写代码的时候,又重新import random怎么办呢?random.choice不是又被改回去了吗?

实际上并不会,因为Python 的包导入机制决定了,在每个运行时内部,每个包只有第一次导入的时候有效,所以只要还在当前运行时,那么后续的所有import random都是无效的。

所以,即使重新导入了 random 模块,random.choice依然是你修改以后的代码。所以当你再次执行的时候,会发现返回的还是你想要的数据,如下图所示:

可能有人会说这样容易被识破啊,别人只要先随便写一些测试数据,运行一次random.choice([123, 456]),发现返回的竟然是kingname,这不就露馅了吗?

实际上完全不用担心,我们可以这样操作:

  1. 如果备选列表里面不包含kingname,那么就使用原生的 random.choice

  2. 如果备选列表里面包含kingname,那么就以60%的概率返回kingname

要实现这样的功能,我们可以这样写代码:

首先重启当前 Jupyter 内核,让 random 恢复成默认的,然后编码:

import randomorigin_choice = random.choicedef choice(option):if 'kingname' not in option or random.randint(1, 10) > 6:return origin_choice(option)return 'kingname'random.choice = choice

这样替换以后,当有kingname在备选列表中时,kingname被有60%的概率被选中,如下图所示:

kingname不在备选列表中时,一切正常,如下图所示:

好了,以上就是我们实现的“年会抽奖程序”!

开玩笑的啦,这里借题发挥,给大家讲了点 Python 中的模块引用机制。很多同学在写代码是不注意用了内置模块的名字作为文件名或者变量名,也可能会产生类似的奇怪bug,这种情况并不少见,这下知道是什么原因了。

本文仅作为技术讨论,切莫当真!但如果你真的敢拿这个去给公司用来抽奖,那我只能交代你一句:

祝各位年会中大奖!

年会抽奖如何用 Python 让自己变成天选之子相关推荐

  1. python random函数_详细代码实战讲解:如何用 Python让自己变成天选之子

    今天为大家带来的内容是:详细代码讲解:如何用 Python让自己变成天选之子 话不多说直接上代码: 请大家猜一猜下面这段代码的运行效果: 你是不是以为这段代码运行以后,结果如下图所示? 但实际上,我可 ...

  2. python 公司年会抽奖_用Python做个年会抽奖小程序吧

    又到了每年一度的年会,最期盼的可能就是抽奖环节了.如果大家都吐槽抽奖不公,那不如用程序来抽吧. 实现思路 在屏幕上不断滚动名字,然后点击停止后停止滚动.名单是保存在excel中,所以需要从excel解 ...

  3. python 公司年会抽奖_用Python写公司年会抽奖程序!中不中还不是我说了算!

    题目:某公司假设有300名员工,开年会抽奖,奖项如下: 一等奖3名:泰国5日游 二等奖6名:Iphone手机 三等奖30名:小型空气净化剂一盒 抽奖规则: 1.共抽三次,第一次抽三等奖,第二次抽二等奖 ...

  4. python 抽奖库_用 python 写一个年会抽奖小程序

    使用 pyinstaller 打包工具常用参数指南 pyinstaller -F demo.py 参数 含义 -F 指定打包后只生成一个exe格式的文件 -D –onedir 创建一个目录,包含exe ...

  5. python 年会抽奖小程序

    python 年会抽奖小程序 import random name = ["a","b","c","d","e ...

  6. python 公司年会抽奖_公司年会抽奖程序-python

    发一下自己写的公司抽奖程序.. 需求:公司年会要一个抽奖程序,转盘上的每一个人名是随机中奖的,中奖后的人不可以再次中奖,按住抽奖,就会一直在转,放开后,要再转一两圈才停. 呵,刚好自己在学python ...

  7. Python实现简易年会抽奖脚本

    一个非常简易的抽奖脚本,大牛请绕行.python版本:3.8 v1.0是不自动剔除已经中奖的人名,适合总人数多而中奖人数少的情况. v2.0会自动剔除已经中奖的人名并再次循环,适合大部分人员都会中奖的 ...

  8. Python实战:年会抽奖程序实现

    Python实战实录 某公司有员工300,年会抽奖需求如下: 一等奖3名, 泰国5日游 二等级6名,iPhone手机 三等级30名,避孕套一盒 要求: 1.共抽3次,第一次抽三等级,第二次抽二等奖,第 ...

  9. python小助手_如何用python写个人专属群聊提醒小助手?

    前言 大家还记得教会父母玩微信是什么时候吗?父母学会后,我们的生活就发生了「质」的变化,父母也许会吐槽你的微信头像不好,要你换一个头像. 最近 pk哥 又被母后大人吐槽了,原因是亲戚微信群里某个亲戚生 ...

最新文章

  1. linux install goolepinyin_Linux截图工具推荐(Ubuntu 18.04亲测)
  2. iOS Sprite Kit教程之xcode安装以及苹果帐号绑定
  3. 【C 语言】文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密 | 非对称加密 | 散列函数 )
  4. 人工智能化发展已经到了哪一步?
  5. vue 打开一个iframe_Vue 之五 —— 单元测试
  6. Stylish窃取用户数据被 Firefox 和 Chrome剔除
  7. Bootstrap CSS 编码规范之简写形式的属性声明
  8. maven 生命周期的指令
  9. Android 编码规范:(二)遇到多个构造器参数时要考虑用构建器
  10. 十个个必装的火狐插件
  11. matlab中一个显示根号的技巧
  12. 启程Objectvie-C(绿柠檬学习笔记)
  13. usb网卡带宽测试软件,腾达AC9与网件R6220无线性能和USB速度测试
  14. webpack不报错但是图标和字体却无法显示
  15. 人工智能/数据科学比赛汇总 2019.8
  16. Huffman Tree
  17. 缺少包含@author的注释信息解决方法
  18. 一篇文章读懂摄像头帧率、码流、分辨率的关系
  19. 第十二期 | 万元的正版课程仅花9.9就可买到?
  20. 有关Amazon站内信邮件类别处理

热门文章

  1. 重温“分开旅行”,体现一种爱情态度
  2. LabVIEW开发的上位机界面在其它电脑分辨率下-界面窗口偏移显示问题解决
  3. 日语零基础,为什么有人可以学半年过N1?
  4. gunicorn参数说明英文及译文
  5. 中概股一路暴跌,富豪榜迎来洗牌时刻,原因何在?
  6. spring的aop
  7. 2022年最新Mac 安装cocoapods步骤
  8. springmvc系列教程一开始springmvc(史上最贴心,原创,亲测)
  9. Python程序下载wyy音乐歌单/专辑
  10. Flutter设置横线