1) Основи Python. Перші кроки у програмуванні та знайомство з IPython

4 травня 2025 6 хвилин Автор: Lady Liberty

Python — одна з найпростіших і водночас потужних мов програмування, з якої зручно починати шлях у розробці. Цей розділ курсу знайомить із ключовими поняттями, без яких неможливо впевнено писати код. Тут розглядається базовий синтаксис Python, робота з інтерактивним інтерпретатором IPython, основні команди та створення змінних. Завдяки цьому блоку новачки отримують практичне уявлення про структуру мови, принципи виконання команд у реальному часі та базову логіку роботи з даними. Саме цей розділ формує фундамент, на який спирається все подальше навчання, відкриваючи шлях до впевненого й ефективного програмування.

Синтаксис Python

Перше, що, як правило, впадає в око, якщо говорити про синтаксис в Python, це те, що відступи мають значення:

  • вони визначають, який код потрапляє у блок;

  • коли блок коду починається та закінчується.

Приклад коду Python:

a = 10
b = 5

if a > b:
    print("A більше B")
    print(a - b)
else:
    print("B більше або дорівнює A")
    print(b - a)

print("Кінець")

def open_file(filename):
    print("Читання файлу", filename)
    with open(filename) as f:
        return f.read()
        print("Готово")

Цей код показано для демонстрації синтаксису. І незважаючи на те, що ще не розглядалася конструкція if/else, швидше за все, суть коду буде зрозумілою.

Python розуміє, які рядки відносяться до if на основі відступів. Виконання блоку закінчується, коли зустрічається рядок з тим самим відступом, що і сам рядок . Аналогічно із блоком else. Друга особливість Python: після деяких виразів має йти двокрапка (наприклад, після і після ).if a > bif a > bif a > belse

Декілька правил і рекомендацій щодо відступів:

  • Як відступи можуть використовуватися таби або пробіли (краще використовувати пробіли, а точніше, налаштувати редактор так, щоб таб дорівнював 4 пробілам – тоді при використанні клавіші табуляції будуть ставитися 4 пробіли, замість 1 знака табуляції).

  • Кількість прогалин має бути однаковим в одному блоці (краще, щоб кількість прогалин була однаковою у всьому коді – популярний варіант, це використовувати 2-4 пробіли, так, наприклад, у цій книзі використовуються 4 пробіли).

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

У Python є спеціальний документ, в якому описано як краще писати код Python PEP 8 – Style Guide for Python Code.

Коментарі

При написанні коду часто потрібно залишити коментар, наприклад, щоб описати особливості роботи коду.

Коментарі в Python можуть бути однорядковими:

# Дуже важливий коментар
a = 10
b = 5 # Дуже важливий коментар

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

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

"""
Дуже важливий та довгий коментар
"""
a = 10
b = 5

Для багаторядкового коментаря можна використовувати три подвійні або три одинарні лапки. Коментарі можуть використовуватися як для того, щоб коментувати, що відбувається в коді, так і для того, щоб унеможливити виконання певного рядка або блоку коду (тобто закоментувати їх).

Інтерпретатор Python. IPython

Інтерпретатор дозволяє отримати моментальний відгук на виконані дії. Можна сказати, що інтерпретатор працює як CLI (Command Line Interface) мережевих пристроїв: кожна команда виконуватиметься відразу після натискання Enter. Однак є виняток – складніші об’єкти (наприклад цикли або функції) виконуються тільки після дворазового натискання Enter.

У попередньому розділі для перевірки установки Python викликався стандартний інтерпретатор. Крім нього, є й удосконалений інтерпретатор IPython. IPython дозволяє набагато більше, ніж стандартний інтерпретатор, який викликається за командою python. Декілька прикладів (можливості IPython набагато ширші):

  • автодоповнення команд по Tab або підказка, якщо варіантів команд кілька;

  • більш структурований та зрозумілий висновок команд;

  • автоматичні відступи у циклах та інших об’єктах;

  • можна пересуватися з історії виконання команд, або ж подивитися її «чарівною» командою «%history».

Встановити IPython можна за допомогою pip (установка буде проводитися у віртуальному оточенні, якщо воно налаштоване):

pip install ipython

Після цього, перейти в IPython можна так:

$ ipython
Python 3.7.3 (default, May 13 2019, 15:44:23)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.5.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Для виходу використається команда quit. Далі описується, як використовуватиметься IPython.

Для знайомства з інтерпретатором можна спробувати використати його як калькулятор:

In [1]: 1 + 2
Out[1]: 3

In [2]: 22*45
Out[2]: 990

In [3]: 2**3
Out[3]: 8

В IPython введення та висновок позначені:

  • In – вхідні дані користувача

  • Out – результат, який повертає команда (якщо він є)

  • числа після In або Out – це порядкові номери виконаних команд у поточній сесії IPython

Приклад виведення рядка функцією print():

In [4]: print('Hello!')
Hello!

Коли в інтерпретаторі створюється, наприклад, цикл, то всередині циклу запрошення змінюється на крапку. Для виконання циклу та виходу з цього підрежиму необхідно двічі натиснути Enter:

In [5]: for i in range(5):
   ...:     print(i)
   ...:
0
1
2
3
4

help()

В IPython є можливість переглянути довідку по довільному об’єкту, функції або методу за допомогою help():

In [1]: help(str)
Help on class str in module builtins:

class str(object)
 |  str(object='') -> str
 |  str(bytes_or_buffer[, encoding[, errors]]) -> str
 |
 |  Create a new string object from the given object. If encoding or
 |  errors is specified, then the object must expose a data buffer
 |  that will be decoded using the given encoding and error handler.
...

In [2]: help(str.strip)
Help on method_descriptor:

strip(...)
    S.strip([chars]) -> str

    Return a copy of the string S with leading and trailing
    whitespace removed.
    If chars is given and not None, remove characters in chars instead.

Другий варіант:

In [3]: ?str
Init signature: str(self, /, *args, **kwargs)
Docstring:
str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

Create a new string object from the given object. If encoding or
errors is specified, then the object must expose a data buffer
that will be decoded using the given encoding and error handler.
Otherwise, returns the result of object.__str__() (if defined)
or repr(object).
encoding defaults to sys.getdefaultencoding().
errors defaults to 'strict'.
Type:           type

In [4]: ?str.strip
Docstring:
S.strip([chars]) -> str

Return a copy of the string S with leading and trailing
whitespace removed.
If chars is given and not None, remove characters in chars instead.
Type:      method_descriptor

print()

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

In [6]: print('Hello!')
Hello!

In [7]: print(5*5)
25

Якщо потрібно вивести поспіль кілька значень через пропуск, то потрібно перерахувати їх через кому:

In [8]: print(1*5, 2*5, 3*5, 4*5)
5 10 15 20

In [9]: print('one', 'two', 'three')
one two three

За промовчанням наприкінці кожного виразу, переданого в print(), буде переклад рядка. Якщо необхідно, щоб після виведення кожного виразу не було б перекладу рядка, треба як останній вираз у print() вказати додатковий аргумент end.

dir()

Функція dir()може використовуватися для того, щоб подивитися, які атрибути (змінні, прив’язані до об’єкта) і методи (функції, прив’язані до об’єкта).

Наприклад, для числа висновок буде таким (зверніть увагу на різні методи, які дозволяють робити арифметичні операції):

In [10]: dir(5)
Out[10]:
['__abs__',
 '__add__',
 '__and__',
 ...
 'bit_length',
 'conjugate',
 'denominator',
 'imag',
 'numerator',
 'real']

Аналогічно для рядка:

In [11]: dir('hello')
Out[11]:
['__add__',
 '__class__',
 '__contains__',
 ...
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']

Якщо виконати dir() без передачі значення, то вона показує існуючі методи, атрибути та змінні, визначені в поточній сесії інтерпретатора:

In [12]: dir()
Out[12]:
[ '__builtin__',
 '__builtins__',
 '__doc__',
 '__name__',
 '_dh',
 ...
 '_oh',
 '_sh',
 'exit',
 'get_ipython',
 'i',
 'quit']

Наприклад, після створення змінної a та test():

In [13]: a = 'hello'

In [14]: def test():
   ....:     print('test')
   ....:

In [15]: dir()
Out[15]:
 ...
 'a',
 'exit',
 'get_ipython',
 'i',
 'quit',
 'test']

Спеціальні команди ipython

У IPython є спеціальні команди, які полегшують роботу з інтерпретатором. Усі вони починаються зі знака відсотка.

%history

Наприклад, команда %historyдозволяє переглянути історію введених користувачем команд у поточній сесії IPython:

In [1]: a = 10

In [2]: b = 5

In [3]: if a > b:
   ...:     print("A is bigger")
   ...:
A is bigger

In [4]: %history
a = 10
b = 5
if a > b:
    print("A is bigger")
%history

За допомогою %history можна скопіювати потрібний блок коду.

%time

Команда %timeпоказує скільки секунд виконувався вираз:

In [5]: import subprocess

In [6]: def ping_ip(ip_address):
    ..:     reply = subprocess.run(['ping', '-c', '3', '-n', ip_address],
    ..:                            stdout=subprocess.PIPE,
    ..:                            stderr=subprocess.PIPE,
    ..:                            encoding='utf-8')
    ..:     if reply.returncode == 0:
    ..:         return True
    ..:     else:
    ..:         return False
    ..:

In [7]: %time ping_ip('8.8.8.8')
CPU times: user 0 ns, sys: 4 ms, total: 4 ms
Wall time: 2.03 s
Out[7]: True

In [8]: %time ping_ip('8.8.8')
CPU times: user 0 ns, sys: 8 ms, total: 8 ms
Wall time: 12 s
Out[8]: False

In [9]: items = [1, 3, 5, 7, 9, 1, 2, 3, 55, 77, 33]

In [10]: %time sorted(items)
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 8.11 µs
Out[10]: [1, 1, 2, 3, 3, 5, 7, 9, 33, 55, 77]

Докладніше про IPython можна прочитати в документації IPython.

Коротко інформацію можна переглянути в самому IPython командою %quickref:

IPython -- An enhanced Interactive Python - Quick Reference Card
===========================================================

obj?, obj??      : Get help, or more help for object (also works as
                   ?obj, ??obj).
?foo.*abc*       : List names in 'foo' containing 'abc' in them.
%magic           : Information about IPython's 'magic' % functions.

Magic functions are prefixed by % or %%, and typically take their arguments
without parentheses, quotes or even commas for convenience.  Line magics take a
single % and cell magics are prefixed with two %%.

Example magic function calls:

%alias d ls -F   : 'd' is now an alias for 'ls -F'
alias d ls -F    : Works if 'alias' not a python name
alist = %alias   : Get list of aliases to 'alist'
cd /usr/share    : Obvious. cd -<tab> to choose from visited dirs.
%cd??            : See help AND source for magic %cd
%timeit x=10     : time the 'x=10' statement with high precision.
%%timeit x=2**100
x**100           : time 'x**100' with a setup of 'x=2**100'; setup code is not
                   counted.  This is an example of a cell magic.

System commands:

!cp a.txt b/     : System command escape, calls os.system()
cp a.txt b/      : after %rehashx, most system commands work without !
cp ${f}.txt $bar : Variable expansion in magics and system commands
files = !ls /usr : Capture sytem command output
files.s, files.l, files.n: "a b c", ['a','b','c'], 'a\nb\nc'

History:

_i, _ii, _iii    : Previous, next previous, next next previous input
_i4, _ih[2:5]    : Input history line 4, lines 2-4
exec _i81        : Execute input history line #81 again
%rep 81          : Edit input history line #81
_, __, ___       : previous, next previous, next next previous output
_dh              : Directory history
_oh              : Output history
%hist            : Command history of current session.
%hist -g foo     : Search command history of (almost) all sessions for 'foo'.
%hist -g         : Command history of (almost) all sessions.
%hist 1/2-8      : Command history containing lines 2-8 of session 1.
%hist 1/ ~2/     : Command history of session 1 and 2 sessions before current.

Змінні

Змінні в Python не вимагають оголошення типу змінної (оскільки Python – мова з динамічною типізацією) і є посиланнями на область пам’яті. Правила іменування змінних:

  • ім’я змінної може складатися лише з літер, цифр та знака підкреслення;

  • ім’я не може починатися із цифри;

  • Ім’я не може містити спеціальних символів @, $, %.

Приклад створення змінних у Pytho

In [1]: a = 3

In [2]: b = 'Hello'

In [3]: c, d = 9, 'Test'

In [4]: print(a,b,c,d)
3 Hello 9 Test

Зверніть увагу, що в Python не потрібно вказувати, що a це число, а b це рядок.

Змінні є посилання на область пам’яті. Це можна продемонструвати за допомогою id(), яка показує ідентифікатор об’єкта:

In [5]: a = b = c = 33

In [6]: id(a)
Out[6]: 31671480

In [7]: id(b)
Out[7]: 31671480

In [8]: id(c)
Out[8]: 31671480

У цьому прикладі видно, що всі три імені посилаються на той самий ідентифікатор, тобто це один і той самий об’єкт, на який вказують три посилання – «a», «b» і «c». З числами у Python є одна особливість, яка може трохи збити з розуміння: числа від -5 до 256 створені заздалегідь і зберігаються в масиві (списку). Тому при створенні числа із цього діапазону фактично створюється посилання на число у створеному масиві.

Ця особливість характерна саме для реалізації CPython, що розглядається у книзі.

Це можна перевірити так:

In [9]: a = 3

In [10]: b = 3

In [11]: id(a)
Out[11]: 4400936168

In [12]: id(b)
Out[12]: 4400936168

In [13]: id(3)
Out[13]: 4400936168

Зауважте, що abі число 3мають однакові ідентифікатори. Усі вони є посиланнями на існуюче число у списку.

Якщо зробити те саме з числом більше 256, ідентифікатори у всіх будуть різні:

In [14]: a = 500

In [15]: b = 500

In [16]: id(a)
Out[16]: 140239990503056

In [17]: id(b)
Out[17]: 140239990503032

In [18]: id(500)
Out[18]: 140239990502960

При цьому, якщо зробити присвоєння змінних один одному, то ідентифікатори будуть у всіх однакові (у такому варіанті aі bпосилаються c на один і той же об’єкт):

In [19]: a = b = c = 500

In [20]: id(a)
Out[20]: 140239990503080

In [21]: id(b)
Out[21]: 140239990503080

In [22]: id(c)
Out[22]: 140239990503080

Імена змінних

Імена змінних не повинні перетинатися з назвами операторів та модулів або інших зарезервованих слів. У Python є рекомендації щодо іменування функцій, класів та змінних:

  • імена змінних зазвичай пишуться або повністю великими або маленькими літерами (наприклад DB_NAME, db_name);

  • імена функцій задаються маленькими літерами, з підкреслення між словами (наприклад, get_names);

  • імена класів задаються словами з великими літерами без пробілів, це звані CamelCase (наприклад, CiscoSwitch).

Висновок

Опанування синтаксису Python, принципів роботи інтерпретатора IPython, базових команд та правильного використання змінних — це фундаментальні навички для кожного, хто починає вивчати програмування. Третій розділ курсу знайомить із ключовими особливостями мови, які роблять Python зрозумілим і зручним для новачків. Завдяки чіткій структурі, інтерактивному середовищу та гнучкості синтаксису користувачі можуть швидко переходити від теорії до практики. Це міцна основа для подальшого розвитку, яка дозволяє впевнено рухатися вперед і створювати власні проєкти вже з перших уроків.

Інші статті по темі
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.