年会抽奖如何用 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 中的抽奖成天效果。

下面来为大家解密。何用

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

Python自带模块是己变可以被覆盖的 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,这不就露馅了吗?

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

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

如果备选列表里面包含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不在备选列表中时,一切正常,如下图所示:

本文转载自微信公众号「未闻Code」,可以通过以下二维码关注。转载本文请联系未闻Code公众号。

网站模板
IT科技
上一篇:3.dns修改成功后,点击“域名解析”,按提示进行操作。解析格式一般如下:
下一篇:第三,.cc域名域名也有很多优势资源域名,从整体注册基数也可以由此推断;