Прикладна аналітика при розробці 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
- A
80 <= score < 90
- B
70 <= score < 80
- C
66 <= score < 70
- D
60 <= score < 66
- E
21 <= score < 60
- FX
score < 20
- F
score = 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
and
Python дозволяє поміняти місцями 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 без остачі, то воно є парним:
Число парне
%
Рішення через власну функцію:
Число парне
%
А можна ще краще? Так…
Число парне
…або ще краще:
Число парне
match
match
- це механізм зіставлення з шаблонами, дозволяє вам виконувати дії в залежності від значення змінної.
Напишемо код, який запитує у користувача його ім’я, а потім просто виводить гуртожиток, на якому він навчається у книгах про Гаррі Поттера:
Слизерин
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'}