Вопрос

На этот вопрос уже есть ответ здесь:

При использовании операторов IF в Python вам необходимо сделать следующее, чтобы «каскад» работал правильно.

if job == "mechanic" or job == "tech":
        print "awesome"
elif job == "tool" or job == "rock":
        print "dolt"

Есть ли способ заставить Python принимать несколько значений при проверке «равно»?Например,

if job == "mechanic" or "tech":
    print "awesome"
elif job == "tool" or "rock":
    print "dolt"
Это было полезно?

Решение

if job in ("mechanic", "tech"):
    print "awesome"
elif job in ("tool", "rock"):
    print "dolt"

Значения в скобках представляют собой кортеж.А in оператор проверяет, встречается ли элемент левой части где-нибудь внутри кортежа правого дескриптора.

Обратите внимание: когда Python ищет кортеж или список, используя in оператор, он выполняет линейный поиск.Если у вас большое количество элементов в правой части, это может стать узким местом в производительности.Более масштабный способ сделать это — использовать frozenset:

AwesomeJobs = frozenset(["mechanic", "tech", ... lots of others ])
def func():
    if job in AwesomeJobs:
        print "awesome"

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

Другие советы

Вы можете использовать в:

if job  in ["mechanic", "tech"]:
    print "awesome"

При проверке очень больших чисел, возможно, стоит сохранить набор элементов для проверки, так как это будет быстрее.Например.

AwesomeJobs = set(["mechanic", "tech", ... lots of others ])
...

def func():
    if job in AwesomeJobs:
        print "awesome"
if job in ("mechanic", "tech"):
    print "awesome"
elif job in ("tool", "rock"):
    print "dolt"

Хотя я не думаю, что вы можете делать то, что хотите, напрямую, есть одна альтернатива:

if job in [ "mechanic", "tech" ]:
    print "awesome"
elif job in [ "tool", "rock" ]:
    print "dolt"

Кортежи с постоянными элементами сами сохраняются как константы в скомпилированной функции.Их можно загрузить с помощью одной инструкции.С другой стороны, списки и наборы всегда создаются заново при каждом выполнении.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top