如何用 Python讓自己變成天選之子
題外話:其實(shí),路并沒有錯(cuò)的,錯(cuò)的只是選擇,愛并沒有錯(cuò)的弥激,錯(cuò)的只是緣分糙捺。所以,無論何地耍缴,一路的風(fēng)景總是無限,終究會有美好的時(shí)候,無論何時(shí)勒葱,我們的年華總會長大浪汪,終究會有燦爛的一幕。--------2020514感謝遇見你
轉(zhuǎn)自:早起Python
Python的random真的就隨機(jī)了嗎凛虽?
請大家猜一猜下面這段代碼的運(yùn)行效果:
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)
你是不是以為這段代碼運(yùn)行以后,結(jié)果如下圖所示凯旋?
但實(shí)際上呀潭,我可以讓輸出結(jié)果根據(jù)我的意愿隨意變動,例如像下面這個(gè) gif 至非,所有輸出結(jié)果都是我:
你可以先不要往下看钠署,放下手機(jī),自己寫一下代碼荒椭,試一試 如何才能實(shí)現(xiàn) gif 中的效果谐鼎。
下面來為大家解密。
要實(shí)現(xiàn)這個(gè)效果戳杀,只需要兩個(gè)知識點(diǎn):
- Python自帶模塊是可以被覆蓋的
- Python 的 import 在同一個(gè)運(yùn)行時(shí)只會導(dǎo)入一次
首先來看第一個(gè)知識點(diǎn)该面。Python 的自帶模塊是可以被覆蓋的,所以我們先來定義一個(gè)函數(shù):
def choice(option): return 'kingname'
接下來信卡,使用這個(gè)函數(shù)覆蓋random.choice
:
import randomrandom.choice = choice
現(xiàn)在隔缀,無論給random.choice
傳入什么參數(shù),它始終都會返回kingname
傍菇,運(yùn)行效果如下圖所示:
這個(gè)時(shí)候猾瘸,你可能會說,那別人寫代碼的時(shí)候丢习,又重新import random
怎么辦呢牵触?random.choice
不是又被改回去了嗎?
實(shí)際上并不會咐低,因?yàn)镻ython 的包導(dǎo)入機(jī)制決定了揽思,在每個(gè)運(yùn)行時(shí)內(nèi)部,每個(gè)包只有第一次導(dǎo)入的時(shí)候有效见擦,所以只要還在當(dāng)前運(yùn)行時(shí)钉汗,那么后續(xù)的所有import random
都是無效的。
所以鲤屡,即使重新導(dǎo)入了 random 模塊损痰,random.choice
依然是你修改以后的代碼。所以當(dāng)你再次執(zhí)行的時(shí)候酒来,會發(fā)現(xiàn)返回的還是你想要的數(shù)據(jù)卢未,如下圖所示:
可能有人會說這樣容易被識破啊,別人只要先隨便寫一些測試數(shù)據(jù),運(yùn)行一次random.choice([123, 456])
辽社,發(fā)現(xiàn)返回的竟然是kingname
伟墙,這不就露餡了嗎?
實(shí)際上完全不用擔(dān)心滴铅,我們可以這樣操作:
- 如果備選列表里面不包含
kingname
远荠,那么就使用原生的random.choice
- 如果備選列表里面包含
kingname
,那么就以60%的概率返回kingname
要實(shí)現(xiàn)這樣的功能失息,我們可以這樣寫代碼:
首先重啟當(dāng)前 Jupyter 內(nèi)核,讓 random 恢復(fù)成默認(rèn)的档址,然后編碼:
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
這樣替換以后盹兢,當(dāng)有kingname
在備選列表中時(shí),kingname
被有60%的概率被選中守伸,如下圖所示:
當(dāng)kingname
不在備選列表中時(shí)绎秒,一切正常,如下圖所示: