Если, Elif, больше, чем, меньше, чем логика

#python #python-3.x #discord.py

#python #python-3.x #discord.py

Вопрос:

У меня есть несколько условий для этой игры, если пользователь достигает определенной суммы денег, то тем больше денег они крадут, если другой пользователь находится на их уровне.

У меня возникла проблема при попытке разобраться в логике. Я добавил комментарии с вопросами, но я просто не знаю, есть ли более простой способ подойти к такого рода вещам.

Начинать ли мне с меньшего значения при запуске своих операторов if или мне следует начинать с больших значений?

 # do I need to put a check and money(message.author) < 500000 here?
if money(message.author) >= 20000 and money(user) < 20000: 
    do_thing1()
# do I need to put a check and money(user) < 500000 here?
elif money(message.author) < 20000 and money(user) >= 20000: 
    do_thing1()
# do I need to put a check money(message.author) and money(user) < 500000 here?
elif money(message.author) >= 20000 and money(user) >= 20000: 
    do_thing2()
# do I need to put a check and money(user) >= 20000 here?
elif money(message.author) >= 500000 and money(user) < 500000: 
    do_thing2()
# do I need to put a check and money(message.author) >= 20000 here?
elif money(message.author) < 500000 and money(user) >= 500000: 
    do_thing2()
elif money(message.author) >= 500000 and money (user) >= 500000: 
    do_thing3()
  

Комментарии:

1. Рассматривая это более внимательно, я не думаю, что я описал все в своем ответе ниже. Какие именно случаи вы хотите обработать?

Ответ №1:

Обратите внимание, что вы не показываете, что произойдет, если у обоих будет меньше 20000, или если у обоих будет больше 20000, но меньше 500000. Я покажу, где они обрабатываются ниже.

 if money(message.author) < 20000 and money(user) < 20000:
    do_thing0()  # both have < 20000. You didn't show this case.
elif money(message.author) < 20000 or money(user) < 20000:
    do_thing1()  # only one of them has < 20000
elif money(message.author) < 500000 and money(user) < 500000:
    do_thingX()  # both have >= 20000 but < 500000. You didn't show this case.
elif money(message.author) < 500000 or money(user) < 500000:
    do_thing2()  # both have >= 20000, only one of them has < 5000000
else:
    do_thing3()  # both have >= 500000
  

Если вас не волнуют случаи, когда у обоих есть < 20000 или у обоих есть >= 20000 and < 500000 , то вы можете сократить это с помощью эксклюзивных редакторов:

 elif money(message.author) < 20000 ^ money(user) < 20000:
    do_thing1()  # only one of them has < 20000
elif money(message.author) < 500000 ^ money(user) < 500000:
    do_thing2()  # both have >= 20000, only one of them has < 5000000
elif money(message.author) >= 500000 and money(user) >= 50000
    do_thing3()  # both have >= 500000
  

Обратите внимание, что в последнем случае нам нужно быть явными, иначе мы поймаем все, что не было обнаружено в наших первых двух случаях, и здесь я предполагаю, что вы не хотите ловить случай, когда у обоих, например, меньше 20000.

Ваш код выполняется последовательно, поэтому, если вы пройдете одну из проверок, это расскажет вам кое-что о диапазоне, в котором вы находитесь, и вы сможете соответствующим образом настроить свою логику.

Например, как только вы выполнили elif money(message.author) < 500000 and ... проверку, вы знаете, что оба money(message.author) >= 20000 и money(user) >= 20000 потому что вы бы не зашли так далеко, если бы это было не так.

Комментарии:

1. Вау, я думаю, я просто слишком много думал об этом! Большое спасибо за быстрый ответ, я попробую это. Мой вопрос в том, money(message.author) > 20000 and money(user) < 20000 будет ли он все еще вызывать elif money(message.author) < 20000 or money(user) < 20000: ?

2. Не следует ли в случае do_thing1 использовать xor ^ вместо or ?

3. Я не думаю, что я уловил все в своем первоначальном сообщении. Я обновил его и добавил комментарии, показывающие, что улавливает каждый случай. Я надеюсь, что это поможет.

4. Ах, я только что заметил использование or в вашем ответе. Это устраняет необходимость в двух дополнительных проверках >= and < и < and >= . Очень хорошее и подробное объяснение. Еще раз спасибо!

Ответ №2:

 # Do I need to put a check and money(message.author) < 500000 here?
  

Да, вы делаете, в противном случае некоторые из ваших случаев будут включать другие, например, если money(message.author) == 500001 и money(user) == 1 , вы, вероятно, хотите, чтобы dothing2 произошло, но вместо этого это сработает dothing1 .

Вы могли бы использовать цепочку сравнения для них, например, вместо

 if money(message.author) >= 20000 and money(message.author) < 500000 and money(user) < 20000: 
    dothing1
  

вы могли бы использовать гораздо более короткий

 if 20000 <= money(message.author) < 500000 and money(user) < 20000: 
    dothing1
  

Кроме того, определение двух временных переменных ma = money(message.author) и mu = money(user) может значительно улучшить читаемость. Учитывая большое количество операторов if и elif , вы могли бы даже определить ma1 = ma < 20000 , ma2 = 20000 <= ma < 500000 и т.д., Но это может быть излишним. Вы также могли бы определить переменные low = 20000 и high = 500000 , предотвращая опечатки (это четыре нуля или пять?) и упрощая изменение этого в будущем.

 if low <= ma < high and mu < low: 
    do_thing1()
elif ma < low and low <= mu < high: 
    do_thing1()
elif low <= ma and low <= mu: 
    do_thing2()
elif high <= ma and mu < high: 
    do_thing2()
elif ma < high and high <= mu: 
    do_thing2()
elif high <= ma and high <= mu: 
    do_thing3()
  

Комментарии:

1. Вау, этот ответ тоже хорош. Основная цель — это не сумма user message.author денег, а проверить, есть ли у них обоих определенная сумма в файле JSON, тогда он возьмет деньги из user и добавит их в message.author . Код довольно длинный, поэтому я попытался немного упростить свой вопрос. Если они оба достигают определенной суммы денег, украденная сумма увеличивается (с помощью объявленной переменной, когда она добавляется в файл json), но если один человек находится на этом определенном уровне, а другой нет, я хочу, чтобы он принимал только меньшую сумму.