
Python — одна з найпростіших і водночас потужних мов програмування, з якої зручно починати шлях у розробці. Цей розділ курсу знайомить із ключовими поняттями, без яких неможливо впевнено писати код. Тут розглядається базовий синтаксис Python, робота з інтерактивним інтерпретатором IPython, основні команди та створення змінних. Завдяки цьому блоку новачки отримують практичне уявлення про структуру мови, принципи виконання команд у реальному часі та базову логіку роботи з даними. Саме цей розділ формує фундамент, на який спирається все подальше навчання, відкриваючи шлях до впевненого й ефективного програмування.
Перше, що, як правило, впадає в око, якщо говорити про синтаксис в 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 > b
if a > b
if a > b
else
Декілька правил і рекомендацій щодо відступів:
Як відступи можуть використовуватися таби або пробіли (краще використовувати пробіли, а точніше, налаштувати редактор так, щоб таб дорівнював 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
Для багаторядкового коментаря можна використовувати три подвійні або три одинарні лапки. Коментарі можуть використовуватися як для того, щоб коментувати, що відбувається в коді, так і для того, щоб унеможливити виконання певного рядка або блоку коду (тобто закоментувати їх).
Інтерпретатор дозволяє отримати моментальний відгук на виконані дії. Можна сказати, що інтерпретатор працює як 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
В 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()
дозволяє вивести інформацію стандартний потік виведення (поточний екран терміналу). Якщо необхідно вивести рядок, то його потрібно обов’язково укласти в лапки (подвійні чи одинарні). Якщо ж потрібно вивести, наприклад, результат обчислення чи просто число, то лапки не потрібні:
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()
може використовуватися для того, щоб подивитися, які атрибути (змінні, прив’язані до об’єкта) і методи (функції, прив’язані до об’єкта).
Наприклад, для числа висновок буде таким (зверніть увагу на різні методи, які дозволяють робити арифметичні операції):
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 є спеціальні команди, які полегшують роботу з інтерпретатором. Усі вони починаються зі знака відсотка.
Наприклад, команда %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
показує скільки секунд виконувався вираз:
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
Зауважте, що a
, b
і число 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 зрозумілим і зручним для новачків. Завдяки чіткій структурі, інтерактивному середовищу та гнучкості синтаксису користувачі можуть швидко переходити від теорії до практики. Це міцна основа для подальшого розвитку, яка дозволяє впевнено рухатися вперед і створювати власні проєкти вже з перших уроків.