美文网首页电脑技术pythonPython
如何用 Python让自己变成天选之子

如何用 Python让自己变成天选之子

作者: 天明豆豆 | 来源:发表于2020-05-14 21:07 被阅读0次

如何用 Python让自己变成天选之子

题外话:其实,路并没有错的,错的只是选择,爱并没有错的,错的只是缘分。所以,无论何地,一路的风景总是无限,终究会有美好的时候,无论何时,我们的年华总会长大,终究会有灿烂的一幕。--------2020514感谢遇见你

转自:早起Python

Python的random真的就随机了吗?

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

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)

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

image

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

image

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

下面来为大家解密。

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

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

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

def choice(option):    return 'kingname'

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

import randomrandom.choice = choice

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

image

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

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

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

image

可能有人会说这样容易被识破啊,别人只要先随便写一些测试数据,运行一次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%的概率被选中,如下图所示:

image

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

image image

相关文章

  • 如何用 Python让自己变成天选之子

    如何用 Python让自己变成天选之子 题外话:其实,路并没有错的,错的只是选择,爱并没有错的,错的只是缘分。所以...

  • 《明日之子3》,选秀万变不离其宗,想出头太难!

    《明日之子3》,选秀万变不离其宗,想出头太难!欢迎来到枯井音乐。 《明日之子3》播出,豆瓣评分6.9。 选秀节目,...

  • 2018-05-16

    如何用七年做成天下生意?

  • 生我何用?不能欢笑。灭我何用?不减狂骄。

    生我何用?不能欢笑。灭我何用?不减狂骄。 过自己想要的生活,上帝会让你付出代价。照顾好自己,爱自己才能爱好别人。如...

  • 【OH卡玩法12】抽张牌来进行自我介绍吧

    上一种玩法,我介绍了如何用“选牌”的方式进行自我介绍,今天来谈谈如何用“抽牌”的方式介绍自己。 选、抽,有什么不同...

  • 天选之子

    第一次感觉年轻真好是二零一零年,百无聊赖的上午,窝在沙发里看球赛。年轻的詹姆斯带领年轻的骑士主场迎战三巨头领衔的老...

  • 天选之子

    好久没有写点豆腐文了,前几天在网上看到了一篇退休教授写的《牛蛙之殇》批了幼升小的竞争,实际上讲的也是牛蛙教育的弊端...

  • 天选之子

    我写下一段故事 把我们的过往搞的人尽皆知 两个不同角色该由我来控制 镜子里的我是那么真实 是小丑还是模特穿着华丽服...

  • 天选之子

    生下来就是王子的人,看他人的眼神仿佛都在说“你是个肮脏的下等人”。没有历经过底层人民贫苦生活的人,大概是无法深刻理...

  • 天选之子

    地龙翻身了,老天发怒了,屋顶的瓦片成了杀人的利器,一片一片往下掉。阿春抱着三岁的女儿,冲了出去,她看到丈夫空手跑出...

网友评论

    本文标题:如何用 Python让自己变成天选之子

    本文链接:https://www.haomeiwen.com/subject/bwnxohtx.html