Пам'ять і змінні

Ми говорили, що програма - це послідовність директив для комп'ютера. І це дійсно так. Але майже всі програми, які роблять щось корисне або цікаве мають додаткові характеристиками: 

  • вони підтримують введення даних; 
  • вони обробляють введені дані; 
  • вони забезпечують виведення інформації.

У нашій першій програмі не було ні вхідних даних, ні їх обробки. Тому вона не дуже цікава. Результатом її роботи було лише виведення повідомлення на екран. 

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

Отже, запам'ятайте послідовність: введення, обробка, результат. А що комп'ютер робить з вхідними даними? Щоб виконати з ними будь-які дії, комп'ютер спочатку повинен їх запам'ятати, тобто десь зберегти.

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

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

Імена

Поверніться у вікно Python Shell. Після появи запрошення наберіть:

>>> subject = 'Computer sciense'

>>> print(subject) 

 Запам'ятайте, що знаки >>> є запрошенням на введення Python-команди. Наберіть наступний за цим знаком текст і натисніть клавішу Enter. Ось що повинно вийти:

Computer sciense
>>>

Ми тільки що створили елемент, що складається з букв "Computer sciense", і привласнили йому ім'я subject. Знак рівності (=) змушує інтерпретатор Python виконати присвоювання, тобто «зробити щось рівним чомусь». 

Символ “=” в Python називають символом присвоєння. Він використовується для надання значень певним іменам.

Ми привласнили набору букв "Computer sciense" ім'я subject. Букви "Computer sciense" існують в якомусь фрагменті пам'яті вашого комп'ютера. Точне місце розташування не має значення. Ми пояснили інтерпретатору Python, що в подальшому будемо посилатися на ці букви за назвою subject

Подібно мітці, ярлику або наклейці, ім'я призначене для ідентифікації об'єкта.

 Лапки інтерпретатор Python розуміє в буквальному сенсі. І виводить те, що укладено між ними. При відсутності лапок інтерпретатор визначає значення фрагмента. Це може бути число (наприклад 5), вираз (5 + 3) або ім'я (subject). В даному випадку мова йде про ім'я subject, і інтерпретатор Python виводить належне йому значення, тобто набір букв "Computer sciense".

Ось ще один приклад:

 >>> print('25+36')

25+36
>>> print(25+36)
61

 У першому випадку лапки присутні, і інтерпретатор виводить на екран вкладений в них вираз 53 + 28. За відсутності лапок Python сприймає 53 + 28 як арифметичний вираз і обчислює його значення. 

Арифметичним виразом називається комбінація чисел і символів, значення якої може визначити інтерпретатор Python. Обчислити означає всього лише «визначити значення».

Інтерпретатор Python сам вирішує, скільки пам'яті потрібно для зберігання символів і якою частиною пам'яті він скористається. Для отримання цієї інформації достатньо знову вказати її ім'я. Ключове слово print і ім'я дозволять вивести на екран відповідний елемент (наприклад число або текст). Змінні можна створювати не тільки з букв. Ви можете дати назву числовим значенням. Пам'ятаєте наш попередній приклад?

>>> 25+36
61

 Коли ви призначаєте імені значення (наприклад значення "Computer science" імені subject), воно зберігається в пам'яті і починає називатися змінною. У більшості мов програмування кажуть, що значення збережено в змінній. Але Python в цьому відношенні трохи відрізняється від інших мов програмування. Він не зберігає значення в змінних, а, скоріше, дає значенням імена. Деякі програмісти кажуть, що в Python відсутнє поняття змінної, а замість нього є поняття імені. Проте поведінка програми в обох випадках подібна. Тому, говорячи про імена Python, ми будемо використовувати терміни «ім'я» або навіть «ім'я змінної». 

Давайте зробимо те ж саме за участю змінних:

>>> First = 25
>>> Second = 36
>>> print(First + Second)
61

 Ми створили два імені First і Second. Число 25 було присвоєно імені First, а число 36 - імені Second. Потім ми вивели на екран суму цих змінних. Можна зробити і по-іншому:

>>> Third = First + Second
>>> Third
61

 В інтерактивному режимі вивести на екран значення змінної можна, просто набравши її ім'я, не вдаючись до ключового слова print. (В програмах такий підхід не працює.)

У цьому прикладі додавання виконувалося не всередині команди print. Ми взяли елемент з ім'ям First і елемент з ім'ям Second і склали їх, попутно створивши новий елемент з ім'ям Third. Third - це сума змінних First і Second.

Одному і тому ж елементу можна привласнити кілька імен.

Проробіть це в інтерактивному режимі:

>>> subject = 'Computer science'

>>> subject_1 = subject
>>> subject
'Computer science'
>>> subject_1
'Computer science'

Це все одно що наліпити на одну річ дві наклейки. На одній наклейці написано subject, а на іншій - subject_1, але обидві вони приєднані до елементу "Computer science".

Що таке ім'я

Змінні допустимо іменувати як завгодно (ну, майже як завгодно). Ім'я може мати довільну довжину, складатися з цифр і букв, а також символу нижнього підкреслення (_). Проте при іменуванні потрібно дотримуватися ряду правил. Найважливішим є чутливість до регістру. Важливо, якими буквами - великими або малими - набрано ім'я. Тому subject і SUBJECT - два різних імені. Аналогічно first і First. Крім того, ім'я змінної повинно починатися з літери або з символу підкреслення. З числа ім'я починатися не може. Відповідно, ім'я 2subject є неприпустимим. І ще в імені не повинно бути пробілів.

Числа і рядки

Отже, ми вміємо створювати змінні для букв (тексту) і чисел. Але звідки інтерпретатор Python знає, що ми мали на увазі числа 5 і 3, а не символи "5" і "3"? Правильно, все знову залежить від наявності лапок. 

Символ або набір символів (букв, цифр і розділових знаків) називається рядком. 

Щоб пояснити інтерпретатору Python, що ви створюєте рядок, потрібно укласти символи в лапки. В Python ви можете користуватися для цієї мети як одинарними, так і подвійними лапками. Допустимі обидва варіанти:

>>> subject = 'Computer science'
>>> subject
'Computer science'
>>> Subject = "Computer science"
>>> Subject
'Computer science'

 Але лапки на початку і в кінці рядка повинні бути одного типу.

Число без лапок інтерпретатор Python сприймає як числове значення, а не як символ. Спробуйте зробити так, щоб відчути різницю:

>>> first = 25
>>> second = 36
>>> first + second
61
>>> first = '25'
>>> second = '36'
>>> first + second
'2536'

 Без лапок значення 25 і 36 інтерпретуються як цифри, і ви отримуєте в результаті суму. Лапки перетворюють "25" і "36" в рядки, і на виході ми бачимо два «складених» один з одним рядки "2536". Також можна об’єднати між собою рядки наступним способом:

>>> print('Computer'+'science')
Computerscience

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

Конкатенація

Дієслово «додавати» не зовсім коректне, коли мова йде про рядки. Для позначення процесу стикування символів або рядків один з одним з метою отримання більш довгого рядка існує спеціальний термін. Цей процес називається не «додаванням» (термін, допустимий тільки для цифр), а конкатенацією.

Довгі рядки

Для реалізації багаторядкових фрагментів застосовується особливий вид рядків із трьома лапками. Ось як він виглядає:

anthem = """Ще не вмерла України, ні слава, ні воля,
Ще нам, браття українці, усміхнеться доля.
Згинуть наші вороженьки, як роса на сонці,
Запануєм і ми, браття, у своїй сторонці.

Душу й тіло ми положим за нашу свободу,

І покажем, що ми, браття, козацького роду.""" 

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

anthem = '''Ще не вмерла України, ні слава, ні воля,
Ще нам, браття українці, усміхнеться доля.
Згинуть наші вороженьки, як роса на сонці,
Запануєм і ми, браття, у своїй сторонці.

Душу й тіло ми положим за нашу свободу,
І покажем, що ми, браття, козацького роду.'''

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

Наскільки вони «змінні»

Змінні отримали таку назву не просто так. Справа в тому, що вони змінюються! Тобто призначене змінній значення можна змінити. В Python для цього створюється новий елемент, якому присвоюється стара мітка (ім'я). 

Розглянемо приклад. Пам’ятаєте, ми створили змінну subject

>>> subject
'Computer science'

 Ми можемо її змінити:

>>> subject = 'Physics'
>>> subject
'Physics'

 Ми створили новий елемент "Physics" і присвоїли йому ім'я subject. Ярлик перемістився зі старого елемента на новий. Але що сталося зі старим елементом "Computer sciense"? Пам'ятайте, що елементи можуть мати кілька імен (більше одного пов'язаного з ними ярлика). Якщо з елементом "Computer science" все ще пов'язаний якийсь ярлик, він залишається в пам'яті комп'ютера. Але елемент, з яким не пов'язано жодних ярликів, Python вважає непотрібним і видаляє з пам'яті. Завдяки цьому пам'ять звільняється від зайвих елементів. Видалення виконується автоматично, вам про це турбуватися не потрібно. Важливо зрозуміти, що насправді ми не перетворювали елемент "Computer science" в елемент "Phisics". Ми просто перемістили ярлик (перепризначували ім'я) з одного елемента на інший. В Python є сутності (наприклад числа і рядки), які не допускають змін. Можна привласнювати їх імена іншим елементам (як ми тільки що зробили), але змінити значення вихідного елемента у вас не вийде. 

Змінну також можна прирівняти саму собі:

>>> First = 15
>>> First = First

 Б'юся об заклад, що ви визнали цю операцію марною. І ви абсолютно праві. Це все одно що стверджувати: «Я - це я». Але невелика зміна може зробити змінну First абсолютно новою сутністю:

>>> First = First +10
>>> First
25

 Що в цьому випадку відбувається? У першому рядку ярлику First присвоюється значення 15. Потім ми створюємо новий елемент First + 10, або 15 + 10. Він має значення 25. Після цього ярлик First відбирається від старого елемента (15) і приєднується до нового (25). Фактично змінній First присвоюється нове значення. 

У виразі присвоєння змінна завжди фігурує зліва від знака рівності (=). 

Але вона може з'явитися і праворуч. Це вкрай корисна властивість, з якою ви зіштовхнетеся в багатьох програмах. Найчастіше вона застосовується в операції інкремента змінної (збільшення на певну величину) або в протилежній операції - декремента (зменшення на певну величину).

Змінній в будь-якому місці програми можна привласнити інше значення (ярлик переміщається на новий елемент). Однією з найбільш поширених помилок в програмуванні є заміна не тієї змінної або заміна потрібної змінної не в той час. Для запобігання подібній ситуації має сенс користуватися іменами, які легко запам'ятовуються. Ніщо не заважає нам написати:

ZdffgfNJHdfff111 = 18

Але в цьому випадку буде складно запам'ятати змінні, які фігурують в програмі. І при роботі з ними з більшою ймовірністю будуть виникати помилки. Тому користуйтеся осмисленими іменами, що вказують на призначення змінної. 

Що потрібно пам’ятати про змінні

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

1. Назва змінної може складатися лише з малих (a..z) та великих (A..Z) літер англійського алфавіту, цифр (0..9) та знаку нижнього підкреслення (“_”);

2. Імена не можуть починатися з цифр;

3. Ім’я змінної повинно мати певний сенс (не обов’язково)

4. Ім’я змінної залежить від регістра (variable, VaRiAbLe, VARIABLE – це різні імена)

 Для закріплення матеріалу:

Використана література:

  1. У. Сэнд, К. Сэнд "Hello World! Занимательное программирование."
  2.  Python для детей. Самоучитель по программированию / Джейсон Бриггс 
  3. Программирование для детей / К.Вордерман, Дж. Вудкок, Ш. Макаманус