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

简介: 年会抽奖如何用 Python让自己变成天选之子

摄影:产品经理这个叉烧很不错

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

import random
import time
people = ['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 random
origin_choice = random.choice
def 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不在备选列表中时,一切正常,如下图所示:

目录
相关文章
|
16小时前
|
JSON 数据格式 Python
13 Python 阶段性总结抽奖系统(文末附代码地址)
13 Python 阶段性总结抽奖系统(文末附代码地址)
58 0
13 Python 阶段性总结抽奖系统(文末附代码地址)
|
7月前
|
Python
python之实现班级随机抽奖
python之实现班级随机抽奖
|
8月前
|
C++ Python
Python+Qt抽奖点名工具源码窗体程序
Python+Qt抽奖点名工具源码窗体程序
111 0
Python+Qt抽奖点名工具源码窗体程序
|
10月前
|
Python
抽奖!Python高手之路
抽奖!Python高手之路
|
API Go C#
免杀&&抽奖|python进行shellcode免杀(三)
免杀&&抽奖|python进行shellcode免杀
229 0
|
安全 PHP 数据安全/隐私保护
免杀&&抽奖|python进行shellcode免杀(二)
免杀&&抽奖|python进行shellcode免杀
577 0
|
API 数据安全/隐私保护 C语言
免杀&&抽奖|python进行shellcode免杀(一)
免杀&&抽奖|python进行shellcode免杀
166 0
|
Python
「Python」控制台建议滚动抽奖
制作滚动抽奖的缘由:为什么要弄一个控制台滚动抽奖呢? 市面上抽奖的东西多了去了。其实是当初初学Python的时候,对一些没见过的东西感兴趣吧。虽然说市面上的抽奖层出不穷。但是远没有自己实现的东西来的实在。 每当自己手动实现一个小东西的时候,总会有满满的成就感。希望大家能够保持最初的的那份热忱啊,与诸君共勉~
114 0
「Python」控制台建议滚动抽奖
|
机器学习/深度学习 算法 安全
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
187 0
【Python 百练成钢】时间调整、二进制数、回文素数、字母距离、CTF、Huffuman树、抽奖、前后缀最值、纯质数求解、花园灌溉
|
16小时前
|
JSON 数据格式 开发者
pip和requests在Python编程中各自扮演着不同的角色
【5月更文挑战第9天】`pip`是Python的包管理器,用于安装、升级和管理PyPI上的包;`requests`是一个HTTP库,简化了HTTP通信,支持各种HTTP请求类型及数据交互。两者在Python环境中分别负责包管理和网络请求。
27 5