Променливи и типове
Проблем
Цената е на три места
В онлайн магазина една цена се появява на няколко места: в каталога, в количката и при плащането. Ако е написана навсякъде с числа, ето какво става:
print("Слушалки: 49.90 €")print("В количката: слушалки, 49.90 €")print("За плащане: 49.90 €")Утре слушалките са в намаление. Трябва да намериш и поправиш всяко 49.90. Пропуснеш ли едно, клиентът вижда две различни цени.
Идеята
Променлива: име за стойност
Запиши цената веднъж и ѝ дай име. После навсякъде пиши името.
price = 49.90print(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 = 12print("Наличност: " + stock + " бр.")TypeError: can only concatenate str (not "int") to strPython следи типа на стойностите и не превръща числото в текст сам. Затова пишем f-низ. Ако искаш +, превърни числото в текст: "Наличност: " + str(stock) + " бр.".
Идеята
Видове стойности
Типът казва какво може да пази променливата. Ето основните:
name = "Раница"price = 39.90stock = 12on_sale = Truesize = "M"print(f"{name}, размер {size}")print(f"Цена: {price} €")print(f"Наличност: {stock} бр.")print(f"Намаление: {on_sale}")Раница, размер MЦена: 39.9 €Наличност: 12 бр.Намаление: Trueint: цяло число, например брой.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_000weight = 1.5huge = 123_456_789_012_345_678_901_234_567_890print(f"{population} {weight}")print(huge + 1)8100000000 1.5123456789012345678901234567891float пази числата в двоична система и някои дробни стойности като 0.1 не стават точно: 0.1 + 0.2 е 0.30000000000000004. За пари истинските програми ползват Decimal от модула decimal. В курса за кратко пишем цените като float.
Пробвай
Намери грешката
Програмата трябва да отпечата „Тетрадка: 3 бр. по 2.4 €“. Тя тръгва, но печата „Тетрадка: 3 бр. по (2, 40) €“. На кой ред е грешката?
Избери реда с грешката.
2,40 за Python са две числа, 2 и 40, записани заедно като двойка (такава двойка се казва кортеж, tuple). Грешка няма, затова такъв пропуск се хваща по изхода. Цената е price = 2.40.Идеята
= записва копие
Знакът = не е „равно“ като в математиката. Той значи: вземи стойността отдясно и я запиши в променливата отляво. Това се казва присвояване. Старата стойност на променливата изчезва.
Когато отдясно е друга променлива, записва се копие на стойността ѝ в този момент. Двете променливи не остават свързани:
seats = 40seats_at_start = seatsseats = 37print(f"В началото: {seats_at_start}")print(f"Сега: {seats}")В началото: 40Сега: 37seats_at_start получава 40. После seats става 37, но копието в seats_at_start си остава 40.
По-точно, за любопитните
По-точно: в Python = не прави копие, а дава на seats_at_start същата стойност, 40. Когато после seats = 37, seats получава нова стойност, а seats_at_start си остава с 40. При числата и текста това се държи точно като копие. Разликата ще се види при списъците.
Пробвай
Коя стойност остава?
Какво ще отпечата програмата?
room_a = 12room_b = 20room_a = room_broom_b = 25print(f"{room_a} и {room_b}")room_a = room_b записва в room_a копие на 20. Когато после room_b става 25, room_a не се променя.
Проблем
Размерите са разменени
Програма за печат на снимки получава размерите разменени: ширина 120 и височина 80, а трябва да са 80 x 120. Изглежда, че стига да запишеш едното в другото и обратно:
width = 120height = 80width = heightheight = widthprint(f"{width} x {height}")80 x 80Излезе 80 x 80. Къде отиде 120?
Виж го
Размяна с помощна променлива
width = 120height = 80temp = widthwidth = heightheight = tempprint(f"{width} x {height}") # 80 x 120Стъпка по стъпка, с думи
- Ширината и височината са въведени разменени: 120 и 80.
- temp = width: копие на 120 отива в temp. В width си остава 120.
- width = height: копие на 80 влиза в width. Старото 120 оттам изчезва, но е запазено в temp.
- height = temp: 120 се връща от temp в height.
- Разменени са: 80 x 120.
В наивния вариант width = height записва 80 в width, а старото 120 изчезва. Когато после height = width, в width вече има 80 и то се копира обратно.
Поправката е трета, помощна променлива temp. Тя пази 120, преди width да бъде презаписана. После 120 отива от temp в height и размерите излизат 80 x 120.
По-точно, за любопитните
width = 120height = 80width, height = height, widthprint(f"{width} x {height}")80 x 120Ще го срещаш в чужд код. Тук пишем с temp, за да се вижда какво става стъпка по стъпка.
Пробвай
Подреди размяната
В магазина двама колеги си разменят смените. morning е „Иван“, а evening е „Мария“. Подреди редовете така, че да се разменят.
morning = eveningevening = tempprint(f"Сутрин: {morning}, вечер: {evening}")temp = morning
Идеята
Типът е на стойността
В Python не пишеш типа на променливата. Той е на стойността: 3 е int, "три" е str. Затова една и съща променлива може после да получи стойност от друг тип:
nights = 3print(type(nights))nights = "три"print(type(nights))<class 'int'><class 'str'>Python не се оплаква. Това се казва динамично типизиране: типът се знае чак докато програмата работи. Удобно е, но и лесно води до грешки: ако на едно място nights е число, а на друго текст, сметката с нея ще спре. Пази в една променлива един вид стойност.
По-точно, за любопитните
Типът може да се напише като бележка: nights: int = 3. Това се казва анотация на типа. Python не я проверява и nights = "три" след нея пак минава. Проверяват я отделни програми като mypy. В курса не ги ползваме.
Упражнение
Твоите променливи
Реши задачите в редактора си. Стойностите са записани в кода, без четене от клавиатурата. Четенето е в следващия урок.
1. Размяна. На горния рафт има 15 книги, на долния 27. Запиши ги в две променливи, размени стойностите им и отпечатай преди и след.
Преди: горе 15, долу 27След: горе 27, долу 152. Възраст. Запиши име и възраст в две променливи и ги отпечатай в изречение.
Мария е на 19 години.3. Карта на хотел. Запиши в променливи името на хотела (текст), звездите (цяло число), оценката (дробно), дали има закуска (да или не) и категорията (един символ). Отпечатай ги.
Хотел „Морска звезда“Звезди: 4Оценка: 8.7Закуска: TrueКатегория: BОще задачи
- Три в кръг. Три каси имат съответно 120, 85 и 240 € в началото на деня. Премести сумите в кръг: първата отива във втората, втората в третата, третата в първата. Ползвай една помощна променлива. Отпечатай 240 120 85.
- Типовете. Отпечатай с
type()типа на всяка стойност от задача 3. - Нарочна грешка. Слепи текст и число с
+:print("Звезди: " + stars). Прочети какво казва Python. После напиши оценката със запетая,rating = 8,7, и виж какво се печата.
Тест