文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 11:45

关注

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

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

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

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

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

下面来为大家解密。

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

  1. Python自带模块是可以被覆盖的
  2. Python 的 import 在同一个运行时只会导入一次

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

  1. def choice(option): 
  2.     return 'kingname' 

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

  1. import random 
  2. 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 恢复成默认的,然后编码:

  1. import random 
  2.  
  3. origin_choice = random.choice 
  4.  
  5. def choice(option): 
  6.     if 'kingname' not in option or random.randint(1, 10) > 6: 
  7.         return origin_choice(option
  8.     return 'kingname' 
  9.  
  10. random.choice = choice 

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

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

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

 

来源:未闻Code 内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯