zoukankan      html  css  js  c++  java
  • 如何用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)
    复制代码

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

     这里还要注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!

    但实际上,我可以让输出结果根据我的意愿随意变动,例如像下面这个 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不在备选列表中时,一切正常,如下图所示:


    最后总结:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!
    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

  • 相关阅读:
    JavaScript 中的求值策略
    JavaScript中的reduce()的5个用例
    使用JavaScript检测空闲的浏览器选项卡,可以做些什么?
    前端优化代码
    你可能不需要在JavaScript使用switch语句
    Js中的compose函数和pipe函数
    css是什么格式的文件?
    h5和css3的新特性有哪些?
    ES2020的这些新功能令人期待
    WindowsServer2003服务器的性能监视
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12718360.html
Copyright © 2011-2022 走看看