01: функції та змінні

Зошит для семінару: Open In Colab

Наша мета на сьогодні:

0. Куди це я потрапив?

Jupyter Notebook - це штука для інтеракктивного запуску коду в браузері. Багато де використовують. Можна писати код, виконувати його і дивитися на результат.

Напиши в комірці нижче 2 + 2 і натисни на кнопки Shift і Enter одночасно. Твій код виконається і ти побачиш відповідь. Далі так і будемо писати код.

# напиши код прямо тут замість трьох крапок
...

Ще у комірок буває різний тип. У цій частині семінару ваш семінарист трохи повчить вас працювати в зошитах із Markdown.

Markdown

1. Python як калькулятор

Можна додавати, множити, ділити і так далі…

4 * 7
3 * (2 + 5)
5 ** 3
5 / 2
5 // 2 # Людина проти машини: раунд 1, вгадайте, що вийде?
5 % 2 # а тут?

Як йдуть справи з іншими операціями? Спробуємо витягти квадратний корінь:

sqrt(4)

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

Ця незрозуміла лайка називається винятком, колись ми навчимося їх обробляти, а зараз звернемо увагу на останній рядок: NameError: name 'sqrt' is not defined - тобто “я не розумію, що таке sqrt”. Однак, не все так погано: відповідна функція є в модулі math. Щоб нею скористатися, потрібно імпортувати цей модуль. Це можна зробити різними способами.

import math
math.sqrt(4)

Після того, як модуль math імпортовано, ви можете дізнатися, які ще в ньому є функції. У IPython Notebook для цього достатньо ввести ім’я модуля, поставити крапку і натиснути кнопку “Tab”. Ось, наприклад, синус:

math.sin(0)

Наведений синтаксис може виявитися незручним, якщо вам часто доводиться викликати якісь математичні функції. Щоб не писати щоразу слово math, можна імпортувати з модуля конкретні функції.

from math import sqrt
sqrt(4)

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

import math as mh
mh.sqrt(4)

2. Змінні

Поняття “змінної” в програмуванні схоже на аналогічне поняття в математиці. Змінна - це осередок пам’яті, що позначається якимось ім’ям. У цій комірці можуть зберігатися числа, рядки і складніші об’єкти. Ми поки що попрацюємо трошки з числовими змінними.

x = 4
x
x = x + 2
x

А що буде в \(x\), якщо запустити клітинку ще раз?

3. Типи

Спробуємо записати числа по-різному

4 * 42
'4' * 42 # Людина проти машини: раунд 2, вгадайте, що вийде?

Для кожного типу арифметика працює по-своєму!

a = 'Ї'
b = 'жак'
a + b
type(4)
type('4')
type(4.0)
type(True)
  • str - текстовий
  • int - цілочисельний
  • float - число з плаваючою комою (звичайне дійсне число)
  • bool - булева змінна

Іноді можна переходити від одного типу змінної до іншого.

x = '42'
print(type(x))

x = int(x)
print(type(x))

А іноді ні. Вмикайте логіку :)

x = 'Люк, я твой отец'
print(type(x))

x = int(x)
print(type(x))

Булеві змінні виникають при різних порівняннях, їх ми будемо активно використовувати на наступному семінарі.

2 + 2 == 4
2 + 2 == 5
x = 5
x < 8

4. Речовинні числа та похибки

Дійсні числа в програмуванні не такі прості. Ось, наприклад, порахуємо синус числа \(\pi\):

from math import pi, sin
sin(pi)  # думаєте, вийде 0? Ха-ха!

Незрозуміла відповідь? По-перше, це так звана комп’ютерна форма експоненціального запису чисел. Вона зручна, якщо треба вміти записувати дуже великі або дуже маленькі числа: 1.2E2 означає 1.2⋅102, тобто 1200, а 2.4e-3 - те ж саме, що 2.4⋅10-3=00024.

Результат, порахований Python для \(\sin \pi\), має порядок 10-16 - це дуже маленьке число, близьке до нуля. Чому не “справжній” нуль? Усі обчислення в дійсних числах робляться комп’ютером з деякою обмеженою точністю, тому часто замість “чесних” відповідей виходять такі наближені. До цього треба бути готовим.

# Людина проти машини: раунд 3, вгадайте, що вийде?
0.4 - 0.3 == 0.1
0.4 - 0.3

Коли порівнюєте дійсні числа, будьте обережнішими.

5. Введення-виведення і ми знову граємо в улюблених.

Робота в Jupyter рідко вимагає писати код, який сам по собі запитує дані з клавіатури, але для інших додатків (і зокрема для домашніх робіт) це може знадобитися. До того ж, написання інтерактивних додатків саме по собі кумедне заняття. Напишемо, наприклад, програму, яка вітається з нами на ім’я.

name = input("Введіть ваше ім'я: ")
print("Привіт,",name)
name

Що тут сталося? У першому рядку ми використовували функцію input. Вона вивела на екран рядок, який їй передали (обов’язково в лапках), і запросила відповідь із клавіатури. Я її ввів, вказавши своє ім’я. Після чого input повернула рядок з ім’ям і присвоїла його змінній name.

Після цього в другому рядку було викликано функцію print і їй було передано два рядки - “Привіт,” і те, що зберігалося у змінній name Функція print вивела ці два рядки послідовно, розділивши пропуском. Зауважимо, що у змінній name, як і раніше, лежить той рядок, який ми ввели з клавіатури.

Спробуємо тепер написати програму “подвоювач”. Вона повинна буде приймати на вхід число, подвоювати його і повертати результат.

x = input("Введіть якесь число: ")
y = x * 2
print(y)

Щось пішло не так. Що саме? Як це виправити?

6. Вчимося дружити з пошуковими системами

Задача: я хочу згенерувати рандомне число, але я не знаю як це зробити. Що я буду робити?

# Місце для маленького дива

Побачили диво? Давайте домовимося, що ви не будете соромитися гуглити потрібні вам команди і шукати відповіді на свої запитання в інтернеті. Якщо вже зовсім не виходить, ставте їх у наш чат технічної підтримки в Телеграм.

8. Дзен Python і PEP-8

Як ми побачили вище, команда import дозволяє довантажити різні пакети і модулі. Один із модулів, який обов’язково потрібно довантажити на першій же парі - це модуль this

import this

Розробники мови Python дотримуються певної філософії програмування, яка називається “The Zen of Python” (“Дзен Пітона”, або “Дзен Пайтона”). Вище ми вивели на екран саме її. Вивчіть цю філософію і теж почніть її дотримуватися.

Ба більше, ми рекомендуємо вам вивчити стайлгайд з написання коду від Google.

Ваше завдання