請大家猜一猜下面這段代碼的運行效果:
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 中的效果,
下面來為大家解密,
要實作這個效果,只需要兩個知識點:
- 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不在備選串列中時,一切正常,如下圖所示:
最后總結:不管你是為了Python就業還是興趣愛好,記住:專案開發經驗永遠是核心,如果如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程專案,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/157935.html
標籤:Python
