今天为大家带来的内容是:详细代码讲解:如何用 Python让自己变成天选之子
话不多说直接上代码:
请大家猜一猜下面这段代码的运行效果:
你是不是以为这段代码运行以后,结果如下图所示?
但实际上,我可以让输出结果根据我的意愿随意变动,例如像下面这个 gif ,所有输出结果都是我:
你可以先不要往下看,放下手机,自己写一下代码,试一试 如何才能实现 gif 中的效果。
下面来为大家解密。
要实现这个效果,只需要两个知识点:
- Python自带模块是可以被覆盖的
- Python 的 import 在同一个运行时只会导入一次
首先来看第一个知识点。Python 的自带模块是可以被覆盖的,所以我们先来定义一个函数:
def choice(option): return 'kingname'
接下来,使用这个函数覆盖random.choice:
import randomrandom.choice = choice
现在,无论给random.choice传入什么参数,它始终都会返回kingname,运行效果如下图所示:
嗨喽:正在学习python的小伙伴或者打算学习的,可以私信小编“07”领取资料!
这个时候,你可能会说,那别人写代码的时候,又重新import random怎么办呢?random.choice不是又被改回去了吗?
实际上并不会,因为Python 的包导入机制决定了,在每个运行时内部,每个包只有第一次导入的时候有效,所以只要还在当前运行时,那么后续的所有import random都是无效的。
所以,即使重新导入了 random 模块,random.choice依然是你修改以后的代码。所以当你再次执行的时候,会发现返回的还是你想要的数据,如下图所示:
可能有人会说这样容易被识破啊,别人只要先随便写一些测试数据,运行一次random.choice([123, 456]),发现返回的竟然是kingname,这不就露馅了吗?
实际上完全不用担心,我们可以这样操作:
- 如果备选列表里面不包含kingname,那么就使用原生的 random.choice
- 如果备选列表里面包含kingname,那么就以60%的概率返回kingname
要实现这样的功能,我们可以这样写代码:
首先重启当前 Jupyter 内核,让 random 恢复成默认的,然后编码:
这样替换以后,当有kingname在备选列表中时,kingname被有60%的概率被选中,如下图所示:
当kingname不在备选列表中时,一切正常,如下图所示:
以上就是本文的全部内容啦!!!
最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“07”即可领取。