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

Прикладна аналітика при розробці IT

Ігор Мірошниченко

КНУ імені Тараса Шевченка, ФІТ

Про мене

  • Мірошниченко Ігор Вікторович
  • кандидат економічних наук, доцент
  • доцент кафедри технологій управління, ФІТ, КНУ імені Тараса Шевченка
  • доцент кафедри математичного моделювання та статистики, ІІТЕ, КНЕУ
  • викладач Міжнародного інституту бізнесу (MBA)

ihor.miroshnychenko@kneu.ua

Data Mirosh

@ihormiroshnychenko

@aranaur

aranaur.rbind.io

DataCamp Group

DataCamp Group

DataCamp Group

Як долучитися?

  1. Приєднатися до телеграм-каналу Data Mirosh
  2. Зареєструйтесь на DataCamp
  3. Приєднайтесь до класу за посиланням

Примітка

Клас буде активний з 11 жовтня 2023 року до 11 квітня 2023 року, після чого буде буде відкрито наступний потік. Слідкуйте за оновленнями.

Мотивація

Основні гравці

  • R / Python / Julia - мови програмування
  • SQL - мова для роботи з базами даних
  • Статистика - наука про збір, обробку, аналіз та інтерпретацію даних

Встановлення Python

  1. Завантажити та запустити Python актуальної версії.
  2. Відкрити командний рядок: cmd
  3. Виконати у командному рядку: pip install numpy
  4. Виконати у командному рядку: pip install pandas
  5. Виконати у командному рядку: pip install jupyter
  6. Запустити jupyter: виконати у командному рядку: jupyter-notebook

Порада

Рекомендую використовувати Сhocolatey: https://aranaur.rbind.io/blog/2023/01

  1. Відкрити термінал
  2. Виконати у терміналі: sudo apt update, що оновить всі пакети.
  3. Виконати у терміналі: sudo apt install software-properties-common, що дозволить керувати дистрибутивами.
  4. Виконати у терміналі: sudo add-apt-repository ppa:deadsnakes/ppa, що додасть deadsnakes-репозиторій з пакетами Python різних версій.
  5. Виконати у терміналі: sudo apt install python3.9-dev, що встановить розширений Python 3.9.
  6. Виконати у терміналі: sudo apt install curl - консольна утиліта для роботи з URL-адресами.
  7. Виконати у терміналі: curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py - завантажити і встановити pip.
  8. Виконати у терміналі: sudo apt install python3.9-venv - встановити віртуальне середовище Python 3.9.
  9. Виконати у терміналі: sudo python3.9 get-pip.py - встановити pip.
  10. Виконати у терміналі: pip install numpy
  11. Виконати у терміналі: pip install pandas
  12. Виконати у терміналі: pip install jupyter
  13. Запустити Jupyter: python3.9 -m notebook
  1. Відкрити термінал
  2. Встановити Homebrew: виконати у терміналі команду із сайту https://brew.sh
  3. Встановити Python: brew install python@3.9
  4. Виконати у терміналі: python3.9 -m pip install numpy
  5. Виконати у терміналі: python3.9 -m pip install pandas
  6. Виконати у терміналі: python3.9 -m pip install jupyter
  7. Запустити Jupyter: виконати у терміналі: jupyter-notebook

Хмарні сервіси

  1. Google Colab
  2. Jupyter Notebook
  3. Posit.cloud

IDE

  1. Visual Studio Code
  2. PyCharm
  3. RStudio

Функції

Функції

  • Функція - це дія або дієслово, яке дозволяє вам робити щось у програмі.
  • Аргументи - це вхідні дані для функції, які якимось чином впливають на її поведінку.
print('Привіт, світ!')
Привіт, світ!

У програмуванні така дія називається побічним ефектом (анг. side effects). Він може бути візуальним, звуковим, виконувати запису файл або базу даних тощо.

Баги

Баг - це помилка у програмі. Вони можуть приймати найрізноманітніші форми і наша задача навчитися виправляти їх.

print('Привіт, світ!'
SyntaxError: incomplete input (4260497653.py, line 1)

Hard coding

input('Як тебе звати? ') # Гаррі
print('Привіт, Гаррі')
Привіт, Гаррі
input('Як тебе звати? ') # Герміона
print('Привіт, Гаррі')
Привіт, Гаррі

Змінні

Загальне про змінні

Змінна - це просто контейнер для якогось значення всередині комп’ютера або всередині вашої програми.

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

  • Ім’я змінної починається з літери;
  • Для імен змінних використовуватимемо маленькі літери з підкресленням замість пробілу;
  • Ім’я змінної не повинно співпадати з назвою ключових слів Python:
False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

Оператор присвоєння

Для створення змінних використовується оператор присвоєння =.

name = input('Як тебе звати? ') # Гаррі
print('Привіт, name')
Привіт, name
name = input('Як тебе звати? ') # Гаррі
print('Привіт,')
print(name)
Привіт,
Гаррі

Коментарі до коду

Коментарі - це примітки до вашого коду. Вони не виконуються і не впливають на роботу програми.

Для створення коментарів використовується символ #.

# Запитати користувача про ім'я
name = input('Як тебе звати? ') # Гаррі

# Вивести привітання
print('Привіт,')
print(name)

А що якщо необхідно написати коментар, який займе декілька рядків? В такому випадку можна використати спеціальну техніку використовуючи потрійні лапки (одинарні або подвійні):

'''
Запитати користувача про ім'я
і вивести привітання
'''
name = input('Як тебе звати? ') # Гаррі
print('Привіт,')
print(name)

Псевдокод

Псевдокод - це неформальна форма запису. Це просто використання природної мови, щоб висловити свої думки лаконічно, методично, алгоритмічно тощо.

# Запитати користувача про ім'я

# Вивести привітання

Псевдокод - це гарний спосіб структурувати список справ, особливо якщо ви поки не знаєте, як писати код.

Вирішення різними способами

Давайте у середині функції print() “додамо” змінну name.

# Запитати користувача про ім'я
name = input('Як тебе звати? ') # Гаррі

# Вивести привітання
print('Привіт,' + name)
Привіт,Гаррі

Позбавимось естетичної помилки, додавши пробіл між словами:

# Запитати користувача про ім'я
name = input('Як тебе звати? ') # Гаррі

# Вивести привітання
print('Привіт, ' + name) # додали пробіл після коми
Привіт, Гаррі

Передамо декілька агрументів:

# Запитати користувача про ім'я
name = input('Як тебе звати? ') # Гаррі

# Вивести привітання
print('Привіт,', name)
Привіт, Гаррі

Рядки

Документація

Весь цей час ми працювали з рядками - str, послідовність тексту.

Давайте повернемося до одного з попередніх варіантів написання програми з подвійним використанням функції print():

# Запитати користувача про ім'я
name = input('Як тебе звати? ') # Гаррі

# Вивести привітання
print('Привіт, ')
print(name)
Привіт, 
Гаррі

Чи можна вирішити “проблему” іншим способом? Так:

print(*objects, sep=' ', end='\n', file=None, flush=False)

Примітка

Документація до Python доступна на docs.python.org.

Документація

Варіант 1:

# Запитати користувача про ім'я
name = input('Як тебе звати? ') # Гаррі

# Вивести привітання
print('Привіт, ', end='')
print(name)
Привіт, Гаррі

Варіант 2:

# Запитати користувача про ім'я
name = input('Як тебе звати? ') # Гаррі

# Вивести привітання
print('Привіт', name, sep=', ')
Привіт, Гаррі

f-рядки

f-рядки - це рядки, які містять обчислювальні вирази.

Щоб створити f-рядок, ми використовуємо літеру f перед першими лапками або апострофом.

Вирази, які ми хочемо обчислити, ми пишемо в фігурних дужках {}:

f-рядки

Раніше використовувались такі способи:

  1. За допомогою оператора %:
name = "Гаррі"
age = 11
print("My name is %s and I am %d years old" % (name, age))
My name is Гаррі and I am 11 years old
  1. За допомогою методу format:
name = "Гаррі"
age = 11
print("Моє ім'я {}. Мені {} років.".format(name, age))
Моє ім'я Гаррі. Мені 11 років.
name = "Гаррі"
age = 11
print("Моє ім'я {1}. Мені {0} років.".format(name, age))
Моє ім'я 11. Мені Гаррі років.
print("Моє ім'я {name}. Мені {age} років.".format(name='Гаррі', age=11))
Моє ім'я Гаррі. Мені 11 років.

Методи рядків

Методи - це функції, які виконуються на об’єкті.

Як бачите, ім’я виводиться з пробілами на початку і в кінці. Якщо ми хочемо видалити пробіли з початку і кінця рядка, ми можемо використати метод .strip():

Методи рядків

Вже краще, але що робити з ім’ям, яке введене з маленької літери? Ми можемо використати метод .capitalize(), щоб перетворити першу літеру рядка на велику:

Методи рядків

Тепер розглянемо приклад, коли користувач вводить не тільки ім’я, але і прізвище:

Метод .capitalize() перетворює першу літеру рядка на велику. Але якщо нам необхідно записати і ім’я, і прізвище з великої літери? Ми можемо використати метод .title():

Методи рядків

З іншої сторони, якщо ми хочемо вивести тільки ім’я, а користувач ввів ім’я та прізвище, ми можемо використати метод .split(). Цього разу я не буду додавати зайвих пробілів до імені:

Спеціальні символи в рядках

Часто для форматування тексту необхідно використовувати спеціальні символи або екрановані послідовності:

Ось деякі з найбільш використовуваних:

  • \n — перенесення рядка
  • \t - табуляція
  • \' - одинарна лапка
  • \" - подвійна лапка
  • \\ — зворотний слеш

Спеціальні символи в рядках

Розберемо їх використання відразу на прикладі:

string1 = '\'Ґрифіндор\' - чемпіон з квідичу!\n1996 – 1997'
print(string1)
'Ґрифіндор' - чемпіон з квідичу!
1996 – 1997
print("Привіт\nсвіт!")
Привіт
світ!
print("C:\\Users\\user\\Desktop\\file.txt")
C:\Users\user\Desktop\file.txt
print("Ім'я:\tГаррі")
Ім'я:   Гаррі
print('Кам\'яні стіни, як і в «Ґрінґотсі», освітлювали смолоскипи')
Кам'яні стіни, як і в «Ґрінґотсі», освітлювали смолоскипи
print("Кам'яні стіни, як і в «Ґрінґотсі», освітлювали смолоскипи")
Кам'яні стіни, як і в «Ґрінґотсі», освітлювали смолоскипи

Примітка

Документація до методів рядків у Python доступна за посиланням.

Рядки та їх незмінюваність

Рядки належать до незмінних об’єктів у Python. Які практичні наслідки виникають з того факту, що рядки, на відміну від списків, є незмінними об’єктами?

Щоб показати, що рядки є незмінюваними об’єктами, ми можемо використати такий приклад коду:

my_string = "abcde"
my_string[0] = "f"
TypeError: 'str' object does not support item assignment

Якщо ми хочемо створити новий рядок на основі існуючого, то ми повинні створити новий об’єкт рядка:

my_string = "abcde"
new_string = "f" + my_string[1:]
print(new_string)
fbcde

Числа

Цілі числа

Цілі числа, int (англ. integer) - це окремий тип даних у Python.

Операції з числами:

  • +: додавання
  • -: віднімання
  • *: множення
  • **: зведення в ступінь
  • /: ділення
  • //: цілочислове ділення, арифметична операція, результатом якої є ціла частина частки, отриманого поділом одного цілого числа на інше ціле число
  • %: залишок від ділення

Цілі числа

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

# Запитати користувача про перше число
first_number = input('Введіть перше число: ') # '1'

# Запитати користувача про друге число
second_number = input('Введіть друге число: ') # '2'

# Вивести результат додавання
print(f'Результат додавання: {first_number} + {second_number} = {first_number + second_number}')
Результат додавання: 1 + 2 = 12

😕

Функція input() завжди повертає рядок. Щоб вирішити цю проблему, нам потрібно перетворити рядок у ціле число. Для цього ми можемо використати функцію int():

# Запитати користувача про перше число
first_number = int(input('Введіть перше число: ')) # '1'

# Запитати користувача про друге число
second_number = int(input('Введіть друге число: ')) # '2'

# Вивести результат додавання
print(f'Результат додавання: {first_number} + {second_number} = {first_number + second_number}')
Результат додавання: 1 + 2 = 3

Цілі числа

Взагалі то ми можемо написати весь наш калькулятор у одному рядку:

print(f'Результат додавання: {int(input("Введіть перше число: ")) + int(input("Введіть друге число: "))}')
Результат додавання: 3

Однак далеко не завжди перетворення типів проходить без помилок, наприклад, ми не зможемо зробити таке перетворення:

a = 'my number is 42'
b = int(a) # отримаємо помилку
ValueError: invalid literal for int() with base 10: 'my number is 42'

Це означає, що рядок 'my number is 42' не може бути відразу представлена як ціле число. Ми могли б взяти з цього рядка лише число 42 і перевести його до цілого числа. Скоро ми навчимося так робити.

Примітка

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

Дробові числа

Python також підтримує числа з плаваючою комою (англ. floating point numbers). Це числа, які мають дробову частину. Наприклад, 3.14 - число з плаваючою комою.

Щоб використати число з плаваючою комою, ми можемо використати float():

# Запитати користувача про перше число
first_number = float(input('Введіть перше число: ')) # '1.2'

# Запитати користувача про друге число
second_number = float(input('Введіть друге число: ')) # '3.4'

# Вивести результат додавання
print(f'Результат додавання: {first_number} + {second_number} = {first_number + second_number}')
Результат додавання: 1.2 + 3.4 = 4.6

Примітка

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

Округлення

Для округлення чисел з плаваючою комою ми можемо використати функцію round():

round(number, ndigits=None)

  • number - число, яке ми хочемо округлити
  • ndigits - кількість знаків після коми, до якої ми хочемо округлити число. Якщо ми не вказуємо цей аргумент, то число буде округлено до найближчого цілого.
# Запитати користувача про перше число
first_number = float(input('Введіть перше число: ')) # '1.2'

# Запитати користувача про друге число
second_number = float(input('Введіть друге число: ')) # '3.4'

# Вивести результат додавання
print(f'Результат додавання: {first_number} + {second_number} = {round(first_number + second_number)}')
Результат додавання: 1.2 + 3.4 = 5

Форматування чисел

Давайте додамо 1 до 999:

# Запитати користувача про перше число
first_number = float(input('Введіть перше число: ')) # '1'

# Запитати користувача про друге число
second_number = float(input('Введіть друге число: ')) # '999'

# Вивести результат додавання
print(f'Результат додавання: {first_number} + {second_number} = {round(first_number + second_number)}')
Результат додавання: 1 + 999 = 1000

Все ок, але в різних частинах світу використовують різне форматування чисел для зручності читання:

# Запитати користувача про перше число
first_number = float(input('Введіть перше число: ')) # '1'

# Запитати користувача про друге число
second_number = float(input('Введіть друге число: ')) # '999'

# Вивести результат додавання
print(f'Результат додавання: {first_number} + {second_number} = {first_number + second_number:,}')
Результат додавання: 1 + 999 = 1,000

Форматування чисел

Для округлення, замість round() можна використати спеціальну нотацію {:.2f}:

# Запитати користувача про перше число
first_number = float(input('Введіть перше число: ')) # '2'

# Запитати користувача про друге число
second_number = float(input('Введіть друге число: ')) # '3'

# Вивести результат ділення
print(f'Результат ділення: {first_number} / {second_number} = {first_number / second_number:.2f}')
Результат ділення: 2 / 3 = 0.67

Примітка

Іноді для розв’язання задачі нам потрібно створити змінну і зберегти в ній нескінченність у математичному сенсі слова. Для цього нам допоможе така форма запису:

x = float('inf')

float('-inf') - спеціальне значенням для чисел із плаваючою крапкою з негативною нескінченністю.

Власні функції

Ключове слово def

Для створення власних функцій ми використовуємо ключове слово def:

def hello(name):
    print('Привіт,', name)

name = input('Введіть ваше ім\'я: ') # 'Гаррі'
hello(name)
Привіт, Гаррі

Важливо

Зверніть увагу на відступи в нашому коді. Відступ дорівнює 4 пробілам або одного табулятора. В Python відступи дуже важливі, тому що вони вказують на те, що код належить до певного блоку.

name = 'Гаррі'

def hello(name):
print('Привіт,', name)

hello(name)
IndentationError: expected an indented block after function definition on line 3 (2611194764.py, line 4)

Значення за замовчуванням

Іноді нам потрібно задати значення за замовчуванням для аргументів функції.

Наприклад, якщо ми хочемо вивести привітання, але не знаємо імені користувача, то ми можемо використати значення за замовчуванням:

def hello(name='світ'):
    print('Привіт,', name)

hello()
Привіт, світ

Головна функція main()

Ми можемо зануритися глибше і назвати свою функцію main().

Це не обов’язкова вимога, але це певна конвенція у світі програмування. Це означає, що це головна функція, яка виконується, коли ми запускаємо нашу програму. Давайте спробуємо це зробити:

def main():
    name = input('Введіть ваше ім\'я: ') # 'Гаррі'
    hello(name)

def hello(name):
    print('Привіт,', name)

main()
Привіт, Гаррі

Викликаючи головну функцію main() таким чином, це позбавляє нас від проблем з порядком записів у коді. Таким чином, ми можемо організувати свій код і впорядкувати його.

Область видимості

Змінні, які ви визначаєте всередині функції, не будуть доступні за межами цієї функції:

def main():
    name = 'Гаррі'
    hello()

def hello():
    print('Привіт,', name)

main()
NameError: name 'name' is not defined

Щоб зробити змінну доступною за межами функції, ми можемо використати ключове слово global:

def main():
    global name
    name = 'Рон'
    hello()

def hello():
    print('Привіт,', name)

main()

Дякую за увагу!



Матеріали курсу

ihor.miroshnychenko@kneu.ua

Data Mirosh

@ihormiroshnychenko

@aranaur

aranaur.rbind.io