Поиск…


Вступление

Условные выражения, включающие ключевые слова, такие как if, elif и другие, предоставляют программам Python возможность выполнять разные действия в зависимости от логического условия: True или False. В этом разделе рассматриваются использование условных выражений Python, логической логики и трехмерных выражений.

Синтаксис

  • <выражение> if <условное> else <выражение> # Тернарный оператор

if, elif, и еще

В Python вы можете определить серию условных выражений, if для первого, elif для остальных, вплоть до окончательного (необязательного) else для чего-либо, не пойманного другими условными выражениями.

number = 5

if number > 2:
    print("Number is bigger than 2.")
elif number < 2:  # Optional clause (you can have multiple elifs)
    print("Number is smaller than 2.")
else:  # Optional clause (you can only have one else)
    print("Number is 2.")

Выходы Number is bigger than 2

Использование else if вместо elif приведет к синтаксической ошибке и не будет разрешено.

Условное выражение (или «Тернарный оператор»)

Тернарный оператор используется для внутренних условных выражений. Его лучше всего использовать в простых, сжатых операциях, которые легко читать.

  • Порядок аргументов отличается от многих других языков (таких как C, Ruby, Java и т. Д.), Что может привести к ошибкам, когда люди, незнакомые с «неожиданным» поведением Python, используют его (они могут отменить порядок).
  • Некоторые считают это «громоздким», так как оно противоречит нормальному потоку мысли (сначала думая о состоянии, а затем о последствиях).
n = 5

"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'

Результат этого выражения будет таким, какой он читается на английском языке - если условное выражение True, тогда оно будет оцениваться с выражением слева, в противном случае - с правой стороны.

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

n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"

Они также предоставляют метод включения условий в лямбда-функции .

Если утверждение

if condition:
    body

Операторы if проверяют условие. Если он принимает значение True , он выполняет тело оператора if . Если он оценивает значение False , он пропускает тело.

if True:
    print "It is true!"
>> It is true!

if False:
    print "This won't get printed.."

Условием может быть любое допустимое выражение:

if 2 + 2 == 4:
    print "I know math!"
>> I know math!

Else statement

if condition:
    body
else:
    body

Оператор else будет выполнять его тело только в том случае, если предыдущие условные операторы все оцениваются как False.

if True:
    print "It is true!"
else:
    print "This won't get printed.."

# Output: It is true!

if False:
    print "This won't get printed.."
else:
    print "It is false!"

# Output: It is false!

Логические выражения логики

Логические логические выражения, помимо оценки True или False , возвращают значение, которое интерпретируется как True или False . Это Pythonic способ представлять логику, которая в противном случае могла бы потребовать проверку if-else.


И оператор

Оператор and вычисляет все выражения и возвращает последнее выражение, если все выражения оцениваются как True . В противном случае он возвращает первое значение, которое имеет значение False :

>>> 1 and 2
2

>>> 1 and 0
0

>>> 1 and "Hello World"
"Hello World"

>>> "" and "Pancakes"
""

Или оператор

Оператор or вычисляет выражения слева направо и возвращает первое значение, которое оценивается как True или последнее значение (если ни один не True ).

>>> 1 or 2
1

>>> None or 1
1

>>> 0 or []
[]

Ленивая оценка

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

>>> def print_me():
        print('I am here!')
>>> 0 and print_me()
0

В приведенном выше примере print_me никогда не выполняется, поскольку Python может определить, что все выражение False когда оно встречает 0 ( False ). Имейте это в виду, если print_me необходимо выполнить для обслуживания вашей логики программы.


Тестирование на несколько условий

Общей ошибкой при проверке нескольких условий является неправильное применение логики.

В этом примере мы пытаемся проверить, являются ли две переменные большими, чем 2. Оператор оценивается как - if (a) and (b > 2) . Это приводит к неожиданному результату, так как bool(a) оценивается как True когда a не равен нулю.

>>> a = 1
>>> b = 6
>>> if a and b > 2:
...     print('yes')
... else:
...     print('no')
    
yes

Каждая переменная должна сравниваться отдельно.

>>> if a > 2 and b > 2:
...     print('yes')
... else:
...     print('no')
        
no

Другая аналогичная ошибка возникает при проверке, является ли переменная одной из нескольких значений. Выражение в этом примере оценивается как - if (a == 3) or (4) or (6) . Это приводит к неожиданному результату, так как bool(4) и bool(6) оценивают значение True

>>> a = 1
>>> if a == 3 or 4 or 6:
...     print('yes')
... else:
...     print('no')
       
yes

Снова каждое сравнение должно быть сделано отдельно

>>> if a == 3 or a == 4 or a == 6:
...     print('yes')
... else:
...     print('no')
        
no

Использование оператора in является каноническим способом его записи.

>>> if a in (3, 4, 6):
...     print('yes')
... else:
...     print('no')
    
no

Значения правды

Следующие значения считаются ложными, поскольку они оцениваются как False при применении к булевому оператору.

  • Никто
  • Ложь
  • 0 или любое числовое значение, равное нулю, например 0L , 0.0 , 0j
  • Пустые последовательности: '' , "" , () , []
  • Пустые сопоставления: {}
  • Пользовательские типы, в __len__ методы __bool__ или __len__ возвращают 0 или False

Все остальные значения в Python оцениваются как True .


Примечание. Общей ошибкой является просто проверка фальшивости операции, которая возвращает разные значения Falsey, где разница имеет значение. Например, использование if foo() а не более явное, if foo() is None

Используя функцию cmp, чтобы получить результат сравнения двух объектов

Python 2 включает в себя функцию cmp которая позволяет вам определить, меньше ли один объект, равный или больший, чем другой объект. Эта функция может использоваться для выбора выбора из списка на основе одного из этих трех вариантов.

Предположим, вам нужно напечатать 'greater than' если x > y , 'less than' если x < y и 'equal' если x == y .

['equal', 'greater than', 'less than', ][cmp(x,y)]

# x,y = 1,1 output: 'equal'
# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'

cmp(x,y) возвращает следующие значения

сравнение Результат
x <y -1
x == y 0
x> y 1

Эта функция удаляется на Python 3. Вы можете использовать вспомогательную функцию cmp_to_key(func) расположенную в functools в Python 3, для преобразования старых функций сравнения в ключевые функции.

Оценка условного выражения с использованием методов List List

Python позволяет взломать списки для оценки условных выражений.

Например,

[value_false, value_true][<conditional-test>]

Пример:

>> n = 16
>> print [10, 20][n <= 15]
10

Здесь n<=15 возвращает False (что равно 0 в Python). Так что Python оценивает:

[10, 20][n <= 15]
==> [10, 20][False] 
==> [10, 20][0]     #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10
Python 2.x 2.7

Встроенный метод __cmp__ возвратил 3 возможных значения: 0, 1, -1, где cmp (x, y) возвращено 0: если оба объекта были одинаковыми 1: x> y -1: x <y

Это можно использовать со списком, чтобы вернуть первый (т. Е. Индекс 0), второй (т. Е. Индекс 1) и последний (т. Е. Индекс -1) элемент списка. Предоставление нам условного типа:

[value_equals, value_greater, value_less][<conditional-test>]

Наконец, во всех приведенных выше примерах Python оценивает обе ветви перед ее выбором. Чтобы оценить только выбранную ветку:

[lambda: value_false, lambda: value_true][<test>]()

где добавление () в конце гарантирует, что лямбда-функции только вызывается / оценивается в конце. Таким образом, мы оцениваем только выбранную ветвь.

Пример:

count = [lambda:0, lambda:N+1][count==N]()

Тестирование, если объект None и его назначение

Вы часто захотите присвоить объект объекту, если он None , указав, что он не был назначен. Мы будем использовать aDate .

Самый простой способ сделать это - использовать тест is None .

if aDate is None:
    aDate=datetime.date.today()

(Обратите внимание, что более Pythonic говорит, что is None вместо == None .)

Но это можно немного оптимизировать, используя понятие, что not None будет оценивать значение True в булевом выражении. Следующий код эквивалентен:

if not aDate:
    aDate=datetime.date.today()

Но есть более питонический путь. Следующий код также эквивалентен:

aDate=aDate or datetime.date.today()

Это делает оценку короткого замыкания . Если aDate инициализируется и not None является not None , тогда он присваивается самому себе без чистого эффекта. Если это is None , то datetime.date.today() присваивается aDate .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow