Пожалуйста, угадайте эффект следующего кода:
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)
Как вы думаете, после запуска этого кода результат будет таким, как показано ниже?
Но на самом деле я могу сделать вывод меняющимся как хочу, например вот такой gif, весь вывод я сам:
Вы можете перестать смотреть вниз, положить трубку, написать код самостоятельно и попробовать, как добиться эффекта на гифке.
Давайте расшифруем его для вас.
Для достижения этого эффекта требуется всего два очка знаний:
- Собственные модули Python могут быть переопределены
- Импорт Python будет импортирован только один раз в одной и той же среде выполнения.
Давайте сначала посмотрим на первый пункт знаний. Собственные модули Python могут быть переопределены, поэтому давайте сначала определим функцию:
def choice(option):
return 'kingname'
Далее используйте эту функцию, чтобы переопределитьrandom.choice:
import random
random.choice = choice
Теперь, что угодноrandom.choiceКакие параметры передаются, он всегда будет возвращатьсяkingname, эффект операции показан на следующем рисунке:
В настоящее время вы можете сказать, что когда другие пишут код,import randomКак это сделать?random.choiceНеужели опять не поменяли?
На самом деле нет, потому что механизм импорта пакетов Python определяет, что в каждой среде выполнения каждый пакет действителен только тогда, когда он импортируется в первый раз, поэтому, пока он все еще находится в текущей среде выполнения, все последующиеimport randomЭто недействительно.
Таким образом, даже после повторного импорта случайного модуляrandom.choiceЭто все еще код, который вы изменили. Поэтому, когда вы выполните его снова, вы обнаружите, что нужные вам данные возвращаются, как показано на следующем рисунке:
Кто-то может сказать, что в этом легко разобраться, а кому-то достаточно написать несколько тестовых данных и запустить их один раз.random.choice([123, 456]), и обнаружил, что то, что было возвращено, оказалосьkingname, разве это не показательно?
На самом деле не беспокойтесь, мы можем сделать это так:
- Если в списке кандидатов нет
kingname, затем используйте роднойrandom.choice - Если список кандидатов содержит
kingname, то вернитесь с вероятностью 60%kingname
Чтобы получить такую функцию, мы можем написать такой код:
Сначала перезапустите текущее ядро Jupyter, дайте случайному возврату значение по умолчанию, а затем код:
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Когда нет в списке кандидатов, все работает нормально, как показано на изображении ниже: