Към съдържанието
wannacode

Променливи и типове

Проблем

Цената е на три места

В онлайн магазина една цена се появява на няколко места: в каталога, в количката и при плащането. Ако е написана навсякъде с числа, ето какво става:

print("Слушалки: 49.90 €")
print("В количката: слушалки, 49.90 €")
print("За плащане: 49.90 €")

Утре слушалките са в намаление. Трябва да намериш и поправиш всяко 49.90. Пропуснеш ли едно, клиентът вижда две различни цени.

Идеята

Променлива: име за стойност

Запиши цената веднъж и ѝ дай име. После навсякъде пиши името.

price = 49.90
print(f"Слушалки: {price} €")
print(f"В количката: слушалки, {price} €")
print(f"За плащане: {price} €")
Изход
Слушалки: 49.9 €
В количката: слушалки, 49.9 €
За плащане: 49.9 €

price = 49.90 създава променлива: име (price), под което програмата пази стойност (49.90). Където в кода пише price, програмата взима стойността оттам. Типа не пишеш: Python го вижда от стойността. За типовете е следващата карта.

f пред кавичките прави f-низ: текст, в който стойност се пише направо във фигурни скоби, {price}. При печата на това място излиза стойността.

Нулата накрая изчезна: 49.90 излезе като 49.9. За числото това е едно и също. Как да покажеш цената с два знака след запетаята, ще видим в урока за вход и изход.

По-точно, за любопитните
  • Името започва с буква, без интервали. Пиши го с малки букви, а думите свързвай с долна черта: price, price_per_night. Главните и малките букви имат значение: price и Price са две различни имена.
  • Езикът позволява и имена на кирилица (цена), но не го прави. Целият код по света е с латински имена и така ще пишат и колегите ти.
  • Име, на което още не си дал стойност, не може да се ползва. Python спира с NameError: name 'total' is not defined, когато стигне до този ред.
  • Текст и число не се слепват с +:
stock = 12
print("Наличност: " + stock + " бр.")
Изход
TypeError: can only concatenate str (not "int") to str

Python следи типа на стойностите и не превръща числото в текст сам. Затова пишем f-низ. Ако искаш +, превърни числото в текст: "Наличност: " + str(stock) + " бр.".

Идеята

Видове стойности

Типът казва какво може да пази променливата. Ето основните:

name = "Раница"
price = 39.90
stock = 12
on_sale = True
size = "M"
print(f"{name}, размер {size}")
print(f"Цена: {price} €")
print(f"Наличност: {stock} бр.")
print(f"Намаление: {on_sale}")
Изход
Раница, размер M
Цена: 39.9 €
Наличност: 12 бр.
Намаление: True
  • int: цяло число, например брой.
  • float: дробно число, например цена или тегло. В кода десетичният знак е точка: 39.90.
  • bool: да или не, True или False, с главна буква.
  • str: текст, в кавички: "Раница". Това е низ (string), поредица от символи. Отделен тип за един символ няма: "M" е текст с дължина 1.

type(...) казва типа на стойност. Ако допишеш тези редове в същата програма:

print(type(name))
print(type(price))
print(type(stock))
print(type(on_sale))
print(type(size))
Изход
<class 'str'>
<class 'float'>
<class 'int'>
<class 'bool'>
<class 'str'>
По-точно, за любопитните

В Python int няма граница: цяло число може да има колкото цифри поискаш и сметките с него са точни. float е като double в Java и C#: дробно число в 8 байта, с около 15–16 значещи цифри. Долна черта между цифрите само помага да се четат:

population = 8_100_000_000
weight = 1.5
huge = 123_456_789_012_345_678_901_234_567_890
print(f"{population} {weight}")
print(huge + 1)
Изход
8100000000 1.5
123456789012345678901234567891

float пази числата в двоична система и някои дробни стойности като 0.1 не стават точно: 0.1 + 0.2 е 0.30000000000000004. За пари истинските програми ползват Decimal от модула decimal. В курса за кратко пишем цените като float.

Пробвай

Намери грешката

Програмата трябва да отпечата „Тетрадка: 3 бр. по 2.4 €“. Тя тръгва, но печата „Тетрадка: 3 бр. по (2, 40) €“. На кой ред е грешката?

Избери реда с грешката.

Идеята

= записва копие

Знакът = не е „равно“ като в математиката. Той значи: вземи стойността отдясно и я запиши в променливата отляво. Това се казва присвояване. Старата стойност на променливата изчезва.

Когато отдясно е друга променлива, записва се копие на стойността ѝ в този момент. Двете променливи не остават свързани:

seats = 40
seats_at_start = seats
seats = 37
print(f"В началото: {seats_at_start}")
print(f"Сега: {seats}")
Изход
В началото: 40
Сега: 37

seats_at_start получава 40. После seats става 37, но копието в seats_at_start си остава 40.

По-точно, за любопитните

По-точно: в Python = не прави копие, а дава на seats_at_start същата стойност, 40. Когато после seats = 37, seats получава нова стойност, а seats_at_start си остава с 40. При числата и текста това се държи точно като копие. Разликата ще се види при списъците.

Пробвай

Коя стойност остава?

Какво ще отпечата програмата?

room_a = 12
room_b = 20
room_a = room_b
room_b = 25
print(f"{room_a} и {room_b}")
Отговор

Проблем

Размерите са разменени

Програма за печат на снимки получава размерите разменени: ширина 120 и височина 80, а трябва да са 80 x 120. Изглежда, че стига да запишеш едното в другото и обратно:

width = 120
height = 80
width = height
height = width
print(f"{width} x {height}")
Изход
80 x 80

Излезе 80 x 80. Къде отиде 120?

Виж го

Размяна с помощна променлива

width = 120
height = 80
temp = width
width = height
height = temp
print(f"{width} x {height}") # 80 x 120
Стъпка по стъпка, с думи
  1. Ширината и височината са въведени разменени: 120 и 80.
  2. temp = width: копие на 120 отива в temp. В width си остава 120.
  3. width = height: копие на 80 влиза в width. Старото 120 оттам изчезва, но е запазено в temp.
  4. height = temp: 120 се връща от temp в height.
  5. Разменени са: 80 x 120.

В наивния вариант width = height записва 80 в width, а старото 120 изчезва. Когато после height = width, в width вече има 80 и то се копира обратно.

Поправката е трета, помощна променлива temp. Тя пази 120, преди width да бъде презаписана. После 120 отива от temp в height и размерите излизат 80 x 120.

По-точно, за любопитните
В Python размяната може да се напише и на един ред. Отдясно двете стойности се взимат наведнъж и чак после се записват отляво:
width = 120
height = 80
width, height = height, width
print(f"{width} x {height}")
Изход
80 x 120

Ще го срещаш в чужд код. Тук пишем с temp, за да се вижда какво става стъпка по стъпка.

Пробвай

Подреди размяната

В магазина двама колеги си разменят смените. morning е „Иван“, а evening е „Мария“. Подреди редовете така, че да се разменят.

  1. morning = evening
  2. evening = temp
  3. print(f"Сутрин: {morning}, вечер: {evening}")
  4. temp = morning

Идеята

Типът е на стойността

В Python не пишеш типа на променливата. Той е на стойността: 3 е int, "три" е str. Затова една и съща променлива може после да получи стойност от друг тип:

nights = 3
print(type(nights))
nights = "три"
print(type(nights))
Изход
<class 'int'>
<class 'str'>

Python не се оплаква. Това се казва динамично типизиране: типът се знае чак докато програмата работи. Удобно е, но и лесно води до грешки: ако на едно място nights е число, а на друго текст, сметката с нея ще спре. Пази в една променлива един вид стойност.

По-точно, за любопитните

Типът може да се напише като бележка: nights: int = 3. Това се казва анотация на типа. Python не я проверява и nights = "три" след нея пак минава. Проверяват я отделни програми като mypy. В курса не ги ползваме.

Упражнение

Твоите променливи

Реши задачите в редактора си. Стойностите са записани в кода, без четене от клавиатурата. Четенето е в следващия урок.

1. Размяна. На горния рафт има 15 книги, на долния 27. Запиши ги в две променливи, размени стойностите им и отпечатай преди и след.

Изход
Преди: горе 15, долу 27
След: горе 27, долу 15

2. Възраст. Запиши име и възраст в две променливи и ги отпечатай в изречение.

Изход
Мария е на 19 години.

3. Карта на хотел. Запиши в променливи името на хотела (текст), звездите (цяло число), оценката (дробно), дали има закуска (да или не) и категорията (един символ). Отпечатай ги.

Изход
Хотел „Морска звезда“
Звезди: 4
Оценка: 8.7
Закуска: True
Категория: B

Още задачи

  • Три в кръг. Три каси имат съответно 120, 85 и 240 € в началото на деня. Премести сумите в кръг: първата отива във втората, втората в третата, третата в първата. Ползвай една помощна променлива. Отпечатай 240 120 85.
  • Типовете. Отпечатай с type() типа на всяка стойност от задача 3.
  • Нарочна грешка. Слепи текст и число с +: print("Звезди: " + stars). Прочети какво казва Python. После напиши оценката със запетая, rating = 8,7, и виж какво се печата.

Тест

Провери се

1. Какво прави редът count = 5?
2. Какъв е типът на 12.99 в Python?
3. a = 5, b = a, a = 9. Колко е b?
4. Защо размяната на две стойности иска трета променлива?
5. nights = 3, после nights = "три". Какво става?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·