Прикладна аналітика при розробці IT
КНУ імені Тараса Шевченка, ФІТ
x < y: x строго менше y,x <= y: x менше або дорівнює y,x > y: x строго більше y,x >= y: x більше або дорівнює y,x == y: x дорівнює y,x != y: x не дорівнює y.Для того, щоб ставити запитання з використанням цих символів нам знадобиться ще одне ключове слово в Python. І це ключове слово, досить просто, як і в англійській мові - if:
x менше y
%%{init:{"theme":"base", "flowchart": {"htmlLabels": true}}}%%
flowchart TB
A(Початок) --> B{x < y}
B -- True --> C["'x менше y'"]
C --> D{x > y}
B -- False --> D
D -- True --> E["'x більше y'"]
E --> F{x == y}
D -- False --> F
F -- True --> G["'x дорівнює y'"]
G --> H(Кінець)
F -- False --> H
elifПопередній код виконує свою задачу, але він не є найкращим. Якщо ви помітите, ми використовуємо три окремі запитання, щоб визначити, яке з двох чисел є більшим. Це можна зробити краще, використовуючи ключове слово elif.
elif - це скорочення від else if.
x менше y
%%{init:{"theme":"base", "flowchart": {"htmlLabels": true}}}%%
flowchart TB
A(Початок) --> B{x < y}
B -- True --> C["'x менше y'"]
C --> H(Кінець)
B -- False --> D{x > y}
D -- True --> E["'x більше y'"]
E --> H
D -- False --> F{x == y}
F -- True --> G["'x дорівнює y'"]
G --> H
F -- False --> H
elseЧи є сенс задавати третє, останнє питання x == y? Напевно ні.
І тут нам на допомогу приходить ключове слово else.
x дорівнює y
%%{init:{"theme":"base", "flowchart": {"htmlLabels": true}}}%%
flowchart TB
A(Початок) --> B{x < y}
B -- True --> C["'x менше y'"]
C --> H(Кінець)
B -- False --> D{x > y}
D -- True --> E["'x більше y'"]
E --> H
D -- False --> F["'x дорівнює y'"]
F --> H
orЦього разу перевіримо, чи дорівнює x числу y. Для цього використаємо оператори or:
x не дорівнює y
%%{init:{"theme":"base", "flowchart": {"htmlLabels": true}}}%%
flowchart TB
A(Початок) --> B{x < y}
B -- True --> C["'x не дорівнює y'"]
C --> H(Кінець)
B -- False --> D{x > y}
D -- True --> C
D -- False --> F["'x дорівнює y'"]
F --> H
orЧи можемо ми покращити цей код? Так, за допомогою оператора заперечення !=:
x не дорівнює y
%%{init:{"theme":"base", "flowchart": {"htmlLabels": true}}}%%
flowchart TB
A(Початок) --> B{x != y}
B -- True --> C["'x не дорівнює y'"]
C --> H(Кінець)
B -- False --> D["'x дорівнює y'"]
D --> H
andЦей оператор дозволяє нам перевірити, чи виконуються обидві умови.
У змінну score будемо приймати значення балу. Система оцінювання в різних університетах може дещо відрізнятися, але в цілому вона виглядає так:
90 <= score <= 100 - A80 <= score < 90 - B70 <= score < 80 - C66 <= score < 70 - D60 <= score < 66 - E21 <= score < 60 - FXscore < 20 - Fscore = int(input('Введіть бал: ')) # 90
if score >= 90 and score <= 100:
print('Оцінка: A')
elif score >= 80 and score < 90:
print('Оцінка: B')
elif score >= 70 and score < 80:
print('Оцінка: C')
elif score >= 66 and score < 70:
print('Оцінка: D')
elif score >= 60 and score < 66:
print('Оцінка: E')
elif score >= 21 and score < 60:
print('Оцінка: FX')
else:
print('Оцінка: F')Оцінка: A
andPython дозволяє поміняти місцями score і відповідний бал при порівнянні. Такий код буде працювати так само, як і попередній:
score = int(input('Введіть бал: ')) # 80
if 90 <= score and score <= 100:
print('Оцінка: A')
elif 80 <= score and score < 90:
print('Оцінка: B')
elif 70 <= score and score < 80:
print('Оцінка: C')
elif 66 <= score and score < 70:
print('Оцінка: D')
elif 60 <= score and score < 66:
print('Оцінка: E')
elif 21 <= score and score < 60:
print('Оцінка: FX')
else:
print('Оцінка: F')Оцінка: B
andАбо навіть об’єднувати діапазони:
score = int(input('Введіть бал: ')) # 70
if 90 <= score <= 100:
print('Оцінка: A')
elif 80 <= score < 90:
print('Оцінка: B')
elif 70 <= score < 80:
print('Оцінка: C')
elif 66 <= score < 70:
print('Оцінка: D')
elif 60 <= score < 66:
print('Оцінка: E')
elif 21 <= score < 60:
print('Оцінка: FX')
else:
print('Оцінка: F')Оцінка: C
andЯкщо задуматись, то можна зробити ще краще:
Оцінка: C
%У змінну x будемо приймати значення числа. Якщо число ділиться на 2 без остачі, то воно є парним:
Число парне
%Рішення через власну функцію:
Число парне
%А можна ще краще? Так…
Число парне
…або ще краще:
Число парне
matchmatch - це механізм зіставлення з шаблонами, дозволяє вам виконувати дії в залежності від значення змінної.
Напишемо код, який запитує у користувача його ім’я, а потім просто виводить гуртожиток, на якому він навчається у книгах про Гаррі Поттера:
Слизерин
matchУ попередньому коді є певна повторюваність: Гаррі, Герміона та Рон належать до Гріфіндору. Давайте об’єднаємо ці умови в одну:
Ґрифіндор
matchА тепер, нарешті, через match:
Ґрифіндор
Зверніть увагу на те, що я використовую _ для визначення варіанту за замовчуванням. Це означає, що якщо жоден з варіантів не відповідає значенню name, то виконається варіант за замовчуванням. Це дозволяє нам уникнути використання else в кінці.
matchМожна краще? Так - об’єднання трьох операторів case ми можемо використовувати оператор |:
Ґрифіндор
Варто зазначити, що Вам не потрібен оператор break для виходу з case, Ви просто використовуєте _ як паличку-виручалочку в кінці коду.
Порівняння рядків влаштовано трохи хитріше. Почнемо з простого та розглянемо порівняння двох однакових рядків:
А якщо записати так:
Порівняння рядків у Python відбувається лексикографічно, тобто посимвольно зліва направо. Якщо символи збігаються, Python переходить до наступного символу в рядку і продовжує порівняти доти, доки не знайде різниця між символами в рядку.
whileПрипустимо нам потрібно створити програму кота, який буде “нявкти” три рази:
%%{init:{"theme":"base", "flowchart": {"htmlLabels": true}}}%%
flowchart TB
A(Початок) --> B["'Няв!'"]
B --> C["'Няв!'"]
C --> D["'Няв!'"]
D --> E(Кінець)
Якщо масштабувати задачу, то вочевидь це не найкращій варіант. Для цього існують цикли.
whileКлючове слово while - це конструкція, яка дозволяє ставити питання знову і знову.
whileАбо можна піти від зворотного і використати “синтаксичний цукор”:
for та спискиlist - це структура даних, яка дозволяє зберігати декілька значень у одній змінній.
Списки в Python створюються за допомогою квадратних дужок [] і можуть містити будь-які значення, в тому числі інші списки.
Принцип роботи циклу for полягає в тому, що він дозволяє ітераційно перебирати список елементів, наприклад так:
for та спискиЩо в попередньому варіанті коду не так? Якщо ми захочемо змінити кількість нявкань, нам доведеться змінювати список. Це не дуже зручно. Щоб цього уникнути, ми можемо скористатися функцією range(), яка дозволяє створити список послідовності чисел:
Pythonic варіант:
А можна ще?
while + forДавайте запитаємо користувача, скільки разів цей кіт має нявкнути:
Няв!
Няв!
Няв!
while + for + власна функціяДавайте ще трошки попрактикуємо писати власні функції:
Потренуємося працювати з індексами списків.
До будь-якого елемента списку можна звернутися за його індексом. Запам’ятайте, що індексація починається з нуля:
Як роздрукувати список студентів? Для цього я можу скористатися індексом, який вказує на позицію елемента у списку за допомогою квадратних [] дужок після назви змінної:
Але ж має бути кращий спосіб, чи не так?
students = ["Гаррі Поттер", "Герміона Грейнджер", "Рон Уізлі"]
for student in students:
print(student)Гаррі Поттер
Герміона Грейнджер
Рон Уізлі
А що, якщо я хочу крім імені студента вивести його номер у списку? Для цього я можу скористатися функцією enumerate(), яка дозволяє мені отримати індекс елемента у списку:
Можна робити зрізи списків:
Методи - це функції, які можна викликати для списків. Методи списків дозволяють виконувати різні дії зі списками.
append() - додає елемент у кінець спискуstudents = ["Гаррі Поттер", "Герміона Грейнджер", "Рон Уізлі"]
students.append("Драко Малфой")
print(students)['Гаррі Поттер', 'Герміона Грейнджер', 'Рон Уізлі', 'Драко Малфой']
clear() - видаляє всі елементи спискуcopy() - повертає копію спискуcount() - повертає кількість елементів спискуextend() - додає елементи іншого списку до поточногоstudents = ["Гаррі Поттер", "Герміона Грейнджер", "Рон Уізлі"]
new_students = ["Драко Малфой", "Невілл Лонгботтом"]
print(students.extend(new_students))None
index() - повертає індекс першого елемента зі спискуinsert() - додає елемент у список за індексомstudents = ["Гаррі Поттер", "Герміона Грейнджер", "Рон Уізлі"]
students.insert(1, "Драко Малфой")
print(students)['Гаррі Поттер', 'Драко Малфой', 'Герміона Грейнджер', 'Рон Уізлі']
pop() - видаляє та повертає елемент із заданим індексомstudents = ["Гаррі Поттер", "Герміона Грейнджер", "Рон Уізлі", "Драко Малфой"]
removed_student = students.pop(1)
print(removed_student)
print(students)Герміона Грейнджер
['Гаррі Поттер', 'Рон Уізлі', 'Драко Малфой']
remove() - видаляє елемент із списку за значеннямreverse() - змінює порядок елементів у списку на зворотнийstudents = ["Гаррі Поттер", "Герміона Грейнджер", "Рон Уізлі", "Драко Малфой"]
students.reverse()
print(students)['Драко Малфой', 'Рон Уізлі', 'Герміона Грейнджер', 'Гаррі Поттер']
sort() - сортує елементи спискуList comprehension в Python - це компактний спосіб створення нового списку на основі наявного списку або іншої ітерованої послідовності, наприклад, рядка.
Загальний синтаксис для створення list comprehension виглядає наступним чином:
де:
expression - вираз, який застосовуватиметься до кожного елемента списку або послідовностіitem - змінна, що представляє поточний елемент послідовності, що ітерується;iterable - список або інша послідовність, що ітерується;condition (необов’язково) - умова, за якою буде фільтруватися вихідна послідовність.[1, 4, 9, 16, 25]
А ось так виглядало б рішення за допомогою list comprehension:
Інакше кажучи, результат роботи нашого циклу відразу поміщається в список.
Стандартний розв’язок:
numbers = [1, 2, 3, 4, 5]
even_numbers = []
for i in numbers:
if i % 2 == 0:
even_numbers.append(i)
print(even_numbers)[2, 4]
List comprehension:
Словники - це структура даних, яка дозволяє зберігати пари ключ-значення у одній змінній. Словники в Python створюються за допомогою фігурних дужок {} і можуть містити будь-які значення, в тому числі інші словники.
Припустимо, що ми хочемо відстежувати, хто до якого гуртожитку відноситься в Гоґвортсі. Для прикладу візьмемо чотирьох учнів:
| Герміона Грейнджер | Гаррі Поттер | Рон Уізлі | Драко Малфой |
|---|---|---|---|
| Ґрифіндор | Ґрифіндор | Ґрифіндор | Слизерин |
Тепер давайте виведемо на екран ім’я та гуртожиток кожного учня. Для цього ми можемо скористатися циклом for:
students = {
"Герміона Грейнджер": "Ґрифіндор",
"Гаррі Поттер": "Ґрифіндор",
"Рон Уізлі": "Ґрифіндор",
"Драко Малфой": "Слизерин"
}
for student in students:
print(student)Герміона Грейнджер
Гаррі Поттер
Рон Уізлі
Драко Малфой
Щоб вивести ім’я та гуртожиток кожного учня, ми можемо скористатися індексацією словника за ключем:
Давайте ускладнимо задачу і додамо ще одину характеристику до кожного учня - його Патронуса:
| Ім’я | Гуртожиток | Патронус |
|---|---|---|
| Герміона Грейнджер | Ґрифіндор | Видра |
| Гаррі Поттер | Ґрифіндор | Олень |
| Рон Уізлі | Ґрифіндор | Тер’єр |
| Драко Малфой | Слизерин |
students = [
{
"ім'я": "Герміона Грейнджер",
"гуртожиток": "Ґрифіндор",
"патронус": "Видра"
},
{
"ім'я": "Гаррі Поттер",
"гуртожиток": "Ґрифіндор",
"патронус": "Олень"
},
{
"ім'я": "Рон Уізлі",
"гуртожиток": "Ґрифіндор",
"патронус": "Тер'єр"
},
{
"ім'я": "Драко Малфой",
"гуртожиток": "Слизерин",
"патронус": None
}
]Зверніть увагу, що згідно канонічного варіанту Драко Малфой не має Патронуса. Тому ми вказали його значення як None - це спеціальне значення, яке означає “нічого”.
Для виводу інформації про учнів ми можемо скористатися циклом for:
students = [
{
"ім'я": "Герміона Грейнджер",
"гуртожиток": "Ґрифіндор",
"патронус": "Видра"
},
{
"ім'я": "Гаррі Поттер",
"гуртожиток": "Ґрифіндор",
"патронус": "Олень"
},
{
"ім'я": "Рон Уізлі",
"гуртожиток": "Ґрифіндор",
"патронус": "Тер'єр"
},
{
"ім'я": "Драко Малфой",
"гуртожиток": "Слизерин",
"патронус": None
}
]
for student in students:
print(student["ім'я"], student["гуртожиток"], student["патронус"], sep=", ")Герміона Грейнджер, Ґрифіндор, Видра
Гаррі Поттер, Ґрифіндор, Олень
Рон Уізлі, Ґрифіндор, Тер'єр
Драко Малфой, Слизерин, None
Альтернативний варіант створення словника students - це використання вкладених словників:
students = {
"Герміона Грейнджер": {
"гуртожиток": "Ґрифіндор",
"патронус": "Видра"
},
"Гаррі Поттер": {
"гуртожиток": "Ґрифіндор",
"патронус": "Олень"
},
"Рон Уізлі": {
"гуртожиток": "Ґрифіндор",
"патронус": "Тер'єр"
},
"Драко Малфой": {
"гуртожиток": "Слизерин",
"патронус": None
}
}
for student in students:
print(student, students[student]["гуртожиток"], students[student]["патронус"], sep=", ")Герміона Грейнджер, Ґрифіндор, Видра
Гаррі Поттер, Ґрифіндор, Олень
Рон Уізлі, Ґрифіндор, Тер'єр
Драко Малфой, Слизерин, None
У Python є кілька способів створення словників:
{"ім'я": 'Аліса', 'вік': 25, 'місто': 'Київ'}
dict()Генератори словників дозволяють створювати словники на основі інших послідовностей. Наприклад:
fruit_list = ['яблуко', 'банан', 'апельсин']
fruit_dict = {fruit: len(fruit) for fruit in fruit_list}
print(fruit_dict){'яблуко': 6, 'банан': 5, 'апельсин': 8}
fromkeys()Метод fromkeys() дає змогу створити словник із зазначеними ключами й одним і тим самим значенням для всіх ключів. Наприклад:
get() - дає змогу отримати значення за ключем, але на відміну від звернення через [], не викликає виняток KeyError, якщо ключ відсутній у словнику:my_dict = {"one": 1, "two": 2, "three": 3}
print(my_dict.get("two"))
print(my_dict.get("four", "Key not found"))2
Key not found
keys() - дає змогу отримати список ключів словника:values() - дає змогу отримати список значень словника:items() - дає змогу отримати список пар ключ-значення словника:dict_items([('one', 1), ('two', 2), ('three', 3)])
pop() - дає змогу видалити пару ключ-значення за ключем. Якщо ключ відсутній, викликає виняток KeyError або повертає другий аргумент, якщо він переданий:my_dict = {"one": 1, "two": 2, "three": 3}
print(my_dict.pop("two"))
print(my_dict.pop("four", "Key not found"))2
Key not found
clear() - дає змогу видалити всі пари ключ-значення зі словника:update() - дає змогу оновити словник із іншого словника або із послідовності пар ключ-значення:my_dict = {"one": 1, "two": 2, "three": 3}
new_dict = {"two": 22, "four": 4}
my_dict.update(new_dict)
print(my_dict){'one': 1, 'two': 22, 'three': 3, 'four': 4}
copy() - дає змогу створити копію словника:continue та breakОператор continue і оператор break є керуючими операторами в циклах, їх використовують для зміни поведінки виконання циклу.
Оператор continue використовується для пропуску частини тіла циклу, що залишилася, і переходу до наступної ітерації циклу. Якщо зустрінеться оператор continue, то код нижче за нього в поточній ітерації циклу не буде виконано, а виконання циклу продовжиться відразу з наступної ітерації:
continue та breakОператор break використовується для переривання виконання циклу. Якщо зустрінеться оператор break, виконання циклу буде припинено і відбувається вихід із циклу:
continue та breakПриклад спільного використання:
employees = [
{'name': 'John', 'qualification': 'low'},
{'name': 'Alice', 'qualification': 'high'},
{'name': 'Bob', 'qualification': 'medium'},
{'name': 'Eva', 'qualification': 'low'},
{'name': 'Mike', 'qualification': 'high'},
{'name': 'Lisa', 'qualification': 'medium'}
]
found_high_qualification_employee = False
for employee in employees:
qualification = employee['qualification']
if qualification == 'low':
continue # Пропускаємо працівника з низькою кваліфікацією
elif qualification == 'high':
found_high_qualification_employee = True
high_qualification_employee = employee
break # Знайдено працівника з високою кваліфікацією, припиняємо пошук
if found_high_qualification_employee:
print("Працівника з високою кваліфікацією знайдено!")
print(high_qualification_employee)
else:
print("Працівника з високою кваліфікацією не знайдено.")Працівника з високою кваліфікацією знайдено!
{'name': 'Alice', 'qualification': 'high'}