Змінні та присвоєння
Огляд
Викладання: 10 хв
Вправи: 10 хвПитання
Як я можу зберігати дані в програмах?
Цілі
Написати програми, які присвоюють скалярні значення змінним і виконують обчислення з цими значеннями.
Правильнo відстежувати зміни значень у програмах, які використовують скалярне присвоєння.
Використовуйте змінні для зберігання значень.
- Змінні - це назви значень.
- У Python символ
=
використовується для присвоєння значення, яке знаходиться праворуч, до її назви, яка вказана ліворуч. - Змінна створeна, коли ій присвоюється значення.
- Нижче Python присвоює значення року змінній
age
та ім’я у лапках - зміннійfirst_name
.
age = 42
first_name = 'Ahmed'
- Назви змінних
- можуть складатися тільки з букв, цифр та підкреслення
_
(яке звичайно використовується, щоб відокремити слова у довгих назвах змінних) - не можуть починатися з цифри
- залежать від регістру (тобто
age
,Age
таAGE
- це три різні змінні)
- можуть складатися тільки з букв, цифр та підкреслення
- Назви змінних які починаються з підкреслення, як наприклад
__alistairs_real_age
, мають спеціальне значення, і тому ми не будемо використовувати їх, доки не зрозуміємо цього правила.
Використовуйте print
для виводу значень.
- Python має вбудовану функцію
print
, яка друкує щось як текст. - Щоб викликати функцію (тобто, щоб виконати її), треба вказати її ім’я.
- Щоб передати функції значення (тобто, те що треба надрукувати), їх треба помістити у дужки.
- Щоб направити до друку рядок тексту, його треба помістити у одинарні або подвійні лапки.
- Значення, які передаються до функції, називаються аргументами
print(first_name, 'is', age, 'years old')
Ahmed is 42 years old
print
автоматично додає пропуск проміж надрукованими аргументами, щоб розділити їх.- Також
print
переходить на новий рядок після друку.
Змінні мають бути створені перед їх використанням.
- Якщо змінна не їснує, або її назва написана з помилкою, Python видасть помилку. (На відміну від деяких іншіх мов, які можуть “вгадати” якесь значення за замовчуванням.)
print(last_name)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-c1fbb4e96102> in <module>()
----> 1 print(last_name)
NameError: name 'last_name' is not defined
- Останній рядок у повідомленні про помилку є найбільш інформативним.
- Ми більш детально подивимось на повідомлення про помилки пізніше.
Змінні зберігаються між клітинками
Майте на увазі, що в блокноті Jupyter важливий порядок виконання клітинок, а не порядок їх появи. Python запам’ятає весь код, який було запущено раніше, включно з будь-якими змінними, які ви визначили, незалежно від порядку в блокноті. Тому, якщо ви визначите змінні нижче в блокноті, а потім (повторно) запустите комірки вище, то ті клітинки, що визначені нижче, все одно будуть присутні. Для прикладу створіть дві клітинки з таким вмістом у такому порядку:
print(myval)
myval = 1
Якщо ви виконуєте це послідовно, перша клітинка дасть помилку. Однак,якщо ви запустите першу клітинку після другої, то буде надруковано
1
. Щоб уникнути плутанини, може бути корисним скористатися опцієюKernel
->Restart & Run All
, яка очищує інтерпретатор і запускає все з чистого листа зверху вниз.
Змінні можна використовувати для обчислень.
- Ми можемо використовувати змінні в обчисленнях так само, як би вони були значеннями.
- Пам’ятайте, ми присвоїли значення
42
зміннійage
кількома рядками вище.
- Пам’ятайте, ми присвоїли значення
age = age + 3
print('Age in three years:', age)
Age in three years: 45
Використовуйте індекс, щоб отримати один символ із рядка.
- Символи (окремі літери, цифри тощо) у рядку є
упорядкованими. Наприклад, рядок
'AB'
не те саме, що'BA'
. Завдяки такому упорядкуванню ми можемо розглядати рядок як список символів. - Кожна позиція в рядку (перша, друга тощо) має номер. Це число називається індексом або іноді нижнім індексом.
- Індекси нумеруються від 0.
- Використовуйте індекс позиції в квадратних дужках, щоб отримати символ з тієї позиції.
atom_name = 'helium'
print(atom_name[0])
h
Використовуйте зріз, щоб отримати підрядок.
- Частина рядка має назву підрядок. Підрядок може бути дуже коротким - лише один символ.
- Список складається з елементів. У випадку, коли рядок розглядається як список, його елементами є окремі символи.
- Фрагмент - це частина рядка (в загальному випадку, будь-який вираз).
- Фрагмент вилучається за допомогою
[start:stop]
, деstart
замінюється на індекс елемента, який повинен бути першим, аstop
- на індекс елемента, який розташований відразу після останнього потрібного елемента. - З математичної точки зору, фрагмент вибирає
[start:stop)
. - Проміжок між
stop
andstart
- це довжина фрагмента. - Вилучення фрагмента не змінює вміст вихідного рядка. Навпаки, фрагмент буде копією частини вихідного рядка.
atom_name = 'sodium'
print(atom_name[0:3])
sod
Використовуйте вбудовану функцію len
, щоб знайти довжину рядка.
print(len('helium'))
6
- Вкладені функції опрацьовуються, починаючи з середини, як в математиці.
Python чутливий до регістру.
- Python вважає, що великі та малі літери різні,
таким чинoм,
Name
таname
є різними змінними. - Існують домовленості про використання великих літер на початку імен змінних, тому ми будемо використовувати малі літери.
Використовуйте осмислені назви змінних.
- Python байдуже, як ви називаєте змінні, якщо вони відповідають правилам (букви, цифри та підкреслення).
flabadab = 42
ewr_422_yY = 'Ahmed'
print(ewr_422_yY, 'is', flabadab, 'years old')
- Використовуйте змістовні назви змінних, щоб допомогти іншим зрозуміти, що робить програма.
- Найважливіша «інша людина» — це ваше майбутнє.
Заміна значень
Заповніть таблицю, вказавши значення змінних у цій програмі після виконання кожного оператора.
# Оператор # Значення x # Значення y # Значення swap # x = 1.0 # # # # y = 3.0 # # # # swap = x # # # # x = y # # # # y = swap # # # #
Рішення
# Оператор # Значення x # Значення y # Значення swap # x = 1.0 # 1.0 # не визначено # не визначено # y = 3.0 # 1.0 # 3.0 # не визначено # swap = x # 1.0 # 3.0 # 1.0 # x = y # 3.0 # 3.0 # 1.0 # y = swap # 3.0 # 1.0 # 1.0 #
Ці три рядки обмінюються значеннями в
x
таy
за допомогоюswap
- змінною для тимчасового зберігання. Це досить поширена ідіома програмування.
Прогнозування значень
Яке кінцеве значення
position
у наведеній нижче програмі? (Спробуйте передбачити значення без запуску програми, а потім перевірте свій прогноз).initial = 'left' position = initial initial = 'right'
Рішення
'left'
Змінній
initial
присвоюється значення'left'
. У другому рядку зміннаposition
також отримує значення рядка'left'
. У третьому рядку зміннійinitial
надається значення'right'
, але зміннаposition
зберігає своє рядкове значення'left'
.
Випробування
Якщо ви призначите
a = 123
, що станеться, якщо ви спробуєте отримати другу цифруa
черезa[1]
Рішення
Числа не є рядками чи послідовностями, і Python поверне помилку, якщо ви спробуєте виконати операцію індексування на числі. У наступному уроці про типи та перетворення типів ми дізнаємося більше про типи та про правила конвертації різних типів. Якщо вам потрібна N-та цифра числа, ви можете перетворити число на рядок за допомогою вбудованої функції
str
, а потім виконати операцію індексування цього рядка.a = 123 print(a[1])
TypeError: 'int' object is not subscriptable
a = str(123) print(a[1])
2
Вибір імені
Яка назва змінної є кращою:
m
,min
абоminutes
? Чому? Підказка: подумайте, який код ви б хотіли успадкувати від когось, хто виходить з лабораторії:
ts = m * 60 + s
tot_sec = min * 60 + sec
total_seconds = minutes * 60 + seconds
Рішення
minutes
краще, тому щоmin
може означати щось на зразок “мінімум” (і фактично це вбудована функція в Python, яку ми розглянемо пізніше).
Практика застосування зрізів
Що надрукує наступна программа?
atom_name = 'carbon' print('atom_name[1:3] is:', atom_name[1:3])
Рішення
atom_name[1:3] is: ar
Визначення зрізів
- Що є результатом зрізу
thing[low:high]
?- Що є результатом зрізу
thing[low:]
(без значення після двокрапки)?- Що є результатом зрізу
thing[:high]
(без значення до двокрапки) ?- Що є результатом зрізу
thing[:]
(тільки двокрапка)?- Що є результатом зрізу
thing[number:some-negative-number]
?- Що станеться, якщо ми оберемо значення
high
, яке виходить за рамки діапазону? (наприклад, спробуйтеatom_name[0:15]
)Рішення
thing[low:high]
поверне зріз, починаючи зі значенняlow
до значення передhigh
thing[low:]
поверне зріз, починаючи зі значенняlow
, що містить всі значення до кінцяthing
thing[:high]
поверне зріз, починаючи зі значенняthing
до значення передhigh
thing[:]
поверне всі значення рядкаthing
thing[number:some-negative-number]
поверне зріз, починаючи зі значенняnumber
до значенняsome-negative-number
, що розраховується з кінця рядкаthing
- Якщо частина фрагмента виходить за межі діапазону, операція не завершується.
atom_name[0:15]
дає той самий результат, що йatom_name[0:]
.
Ключові моменти
Використовуйте змінні для зберігання значень.
Використовуйте
Змінні зберігаються між клітинками.
Змінні мають бути створені перед їх використанням.
Змінні можна використовувати в обчисленнях.
Використовуйте індекс, щоб отримати один символ із рядка (string).
Використовуйте зріз, щоб отримати підрядок (substring).
Використовуйте вбудовану функцію
len
, щоб знайти довжину рядка.Python чутливий до регістру.
Використовуйте змістовні імена змінних.