Умовні оператори

Огляд

Викладання: 10 хв
Вправи: 15 хв
Питання
  • Як програми можуть робити різні речі для різних даних?

Цілі
  • Правильно писати програми, які використовують оператори if та else та прості логічні вирази (без логічних операторів).

  • Відстежувати виконання невкладених умовних операторів і умовних операторів усередині циклів.

Використовуйте оператори if, щоб контролювати виконання блоку коду..

mass = 3.54
if mass > 3.0:
    print(mass, 'є великим')

mass = 2.07
if mass > 3.0:
    print (mass, 'є великим')
3.54 є великим

Умовні оператори часто використовуються всередині циклів.

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 3.0:
        print(m, 'є великим')
3.54 є великим
9.22 є великим

Використовуйте else для виконання блоку коду, коли умова if є не істинною.

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 3.0:
        print(m, 'є великим')
    else:
        print(m, 'є малим')
3.54 є великим
2.07 є малим
9.22 є великим
1.86 є малим
1.71 є малим

Використовуйте elif для визначення додаткових перевірок.

masses = [3.54, 2.07, 9.22, 1.86, 1.71]
for m in masses:
    if m > 9.0:
        print(m, 'є ВЕЛИЧЕЗНИМ')
    elif m > 3.0:
        print(m, 'є великим')
    else:
        print(m, 'є малим')
3.54 є великим
2.07 є малим
9.22 є ВЕЛИЧЕЗНИМ
1.86 є малим
1.71 є малим

Умови перевіряються один раз, по порядку.

grade = 85
if grade >= 70:
    print('grade is C')
elif grade >= 80:
    print('grade is B')
elif grade >= 90:
    print('grade is A')
grade is C
velocity = 10.0
if velocity > 20.0:
    print('рухається занадто швидко')
else:
    print('регулювання швидкості')
    velocity = 50.0
регулювання швидкості
velocity = 10.0
for i in range(5): # виконати цикл 5 разів
    print(i, ':', velocity)
    if velocity > 20.0:
        print('рухається занадто швидко')
        velocity = velocity - 5.0
    else:
        print('рухається надто повільно')
        velocity = velocity + 10.0
print('кінцева швидкість:', velocity)
0 : 10.0
рухається занадто повільно
1 : 20.0
рухається занадто повільно
2 : 30.0
рухається занадто швидко
3 : 25.0
рухається занадто швидко
4 : 20.0
рухається занадто повільно
кінцева швидкість: 30.0

Створіть таблицю зі значеннями змінних для відстеження виконання програми.

i 0 . 1 . 2 . 3 . 4 .
швидкість 10.0 20.0 . 30.0 . 25.0 . 20.0 . 30.0

Комбінація відношень з використанням «і», «або» та круглих дужок

Часто потрібно, щоб певна комбінація речей була правдою. Можна комбінувати відносини в умовному операторі з використанням «і» та «або». Продовжуючи приклад, наведений вище, припустімо, що у вас є>

mass     = [ 3.54,  2.07,  9.22,  1.86,  1.71]
velocity = [10.00, 20.00, 30.00, 25.00, 20.00]

i = 0
for i in range(5):
    if mass[i] > 5 and velocity[i] > 20:
        print("Швидкий важкий предмет. Качка!")
    elif mass[i] > 2 and mass[i] <= 5 and velocity[i] <= 20:
        print("Нормальний трафік")
    elif mass[i] <= 2 and velocity[i] <= 20:
        print("Повільний, легкий предмет. Ігноруйте це")
    else:
        print("ой! Щось сталося з даними. Перевірте це")

Так само, як і в арифметиці, ви можете і маєте використовувати круглі дужки, якщо у виразі можлива двозначність. Хорошим загальним правилом є використання круглих дужок завжди при одночасному використанні і та або в однакових умовах. Тобто замість:

if mass[i] <= 2 or mass[i] >= 5 and velocity[i] > 20:

напишіть одну умов нижче:

if (mass[i] <= 2 or mass[i] >= 5) and velocity[i] > 20:
if mass[i] <= 2 or (mass[i] >= 5 and velocity[i] > 20):

і тоді читачеві (і Python) цілком зрозуміло, що ви насправді маєте на увазі.

Відстеження виконання

Що надрукує ця програма?

pressure = 71.9
if pressure > 50.0:
    pressure = 25.0
elif pressure <= 50.0:
    pressure = 0.0
print(pressure)

Рішення

25.0

Обрізання значень

Заповніть порожні поля, щоб програма створила новий список, що містить нулі, якщо початкові значення списку були від’ємними та одиниці, де початкові значення списку були додатними.

original = [-1.5, 0.2, 0.4, 0.0, -1.3, 0.4]
result = ____
for value in original:
    if ____:
        result.append(0)
    else:
        ____
print(result)
[0, 1, 1, 1, 0, 1]

Рішення

original = [-1.5, 0.2, 0.4, 0.0, -1.3, 0.4]
result = []
for value in original:
    if value<0.0:
        result.append(0)
    else:
        result.append(1)
print(result)

Обробка малих файлів

Змініть цю програму так, щоб вона обробляла лише файли з менш ніж 50 записами.

import glob
import pandas as pd
for filename in glob.glob('data/*.csv'):
    contents = pd.read_csv(filename)
    ____:
        print(filename, len(contents))

Рішення

import glob
import pandas as pd
for filename in glob.glob('data/*.csv'):
    contents = pd.read_csv(filename)
    if len(contents)<50:
        print(filename, len(contents))

Ініціалізація

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

values = [...деякі тестові дані...]
smallest, largest = None, None
for v in values:
    if ____:
        smallest, largest = v, v
    ____:
        smallest = min(____, v)
        largest = max(____, v)
print(smallest, largest)

Які переваги та недоліки використання цього методу для визначення діапазону даних?

Рішення

values = [-2,1,65,78,-54,-24,100]
smallest, largest = None, None
for v in values:
    if smallest==None and largest==None:
        smallest, largest = v, v
    else:
        smallest = min(smallest, v)
        largest = max(largest, v)
print(smallest, largest)

Використання функцій з умовними операторами в Pandas

Функції часто містять умови. Ось короткий приклад, в якому на основі закодованих вручну значень визначається, у якому квартилі знаходиться аргумент, з урахуванням квартильних точок розрізу.

def calculate_life_quartile(exp):
    if exp < 58.41:
        # Це спостереження належить першому квартилю
        return 1
    elif exp >= 58.41 and exp < 67.05:
        # Це спостереження належить другому квартилю
       return 2
    elif exp >= 67.05 and exp < 71.70:
        # Це спостереження належить третьому квартилю
       return 3
    elif exp >= 71.70:
        # Це спостереження належить четвертому квартилю
       return 4
    else:
        # Це спостереження має погані дані
       return None

calculate_life_quartile(62.5)
2

Ця функція зазвичай використовується в циклі for, але Pandas має інший, більш ефективний спосіб робити те саме шляхом застосування функції до фрейму даних або частини фрейму даних. Розглянемо приклад, використовуючи наведене вище визначення функції.

data = pd.read_csv('Americas-data.csv')
data['life_qrtl'] = data['lifeExp'].apply(calculate_life_quartile)

У другому рядку є багато цікавого, тому давайте розглянемо це по частинах. Праворуч від = ми починаємо з data['lifeExp'], який є стовпцем з позначкою lifExp у фреймі даних data . Ми використовуємо засіб apply(), щоб виконати функцію calculate_life_quartile для визначення значень стовпця ‘life_qrtl’ для кожного рядку фрему даних data

Ключові моменти

  • Використовуйте оператори if, щоб контролювати виконання блоку коду.

  • Умовні оператори часто використовуються всередині циклів.

  • Використовуйте else для виконання блоку коду, коли умова if є не істинною.

  • Використовуйте elif для визначення додаткових перевірок.

  • Умови перевіряються один раз, по порядку.

  • Створіть таблицю зі значеннями змінних для відстеження виконання програми