Смятане
Проблем
Сметката на масата
Поръчал си три кафета по 2,50 € и два кроасана по 1,50 €. Плащаш с банкнота от 20 €. Колко е сметката и колко ресто трябва да получиш?
Наум става. Но касата в кафенето прави такава сметка стотици пъти на ден, с различни цени и количества. Програмата трябва да смята сама.
Идеята
Аритметичните оператори
Смяташ както на хартия: + събира, - изважда, * умножава, / дели. Тези знаци се казват оператори.
coffee = 2.5croissant = 1.5total = 3 * coffee + 2 * croissantchange = 20 - totalprint(f"Общо: {total} €")print(f"Ресто: {change} €")Общо: 10.5 €Ресто: 9.5 €Редът е като в математиката: първо * и /, после + и -. Затова 3 * coffee + 2 * croissant е 7,5 + 3. Ако искаш друг ред, слагаш скоби: (2 + 3) * 4 е 20.
Има и пети оператор, %. За него е следващата идея.
По-точно, за любопитните
- Операторите с еднакъв приоритет се смятат отляво надясно:
20 - 5 - 3е 12, а не 18. -пред число го прави отрицателно:-total.
- При текст
+не събира, а долепя, но само текст към текст. Текст + число спира програмата. Това е капанът в следващата карта.
Пробвай
Билети за концерта
Три билета по 8 € и 5 € такса за поръчката.
Какво ще отпечата програмата?
tickets = 3fee = 5print("Общо: " + tickets * 8 + fee)* се смята първо: tickets * 8 е 24. После отляво надясно: "Общо: " + 24 е текст + число, и Python спира: TypeError: can only concatenate str (not "int") to str. С f-низ сметката е вътре във фигурните скоби и излиза 29: f"Общо: {tickets * 8 + fee}".Проблем
2,25 часа вместо 2 ч. 15 мин.
Филмът е 135 минути. Искаш да го покажеш като часове и минути: 2 ч. 15 мин. Първият опит:
minutes = 135hours = minutes / 60print(f"{hours} ч.")2.25 ч.В Python / дели винаги дробно, дори когато и двете числа са цели: 6 / 3 е 2.0, а 17 / 3 е 5.666666666666667. Тук обаче ти трябват два цели часа и останалите минути. Как се взима само цялата част?
Идеята
Целочислено деление: // и %
// дели и оставя само цялата част: 135 // 60 е 2, а 17 // 3 е 5. Дробната част се отрязва. Това се казва целочислено деление.
Ето го стъпка по стъпка, със сбора на три оценки:
math = 5physics = 6english = 6whole = (math + physics + english) // 3print(f"Цялата част: {whole}")Стъпка по стъпка, с думи
- Три оценки, всяка в int: 5, 6, 6.
- Първо скобите: 5 + 6 + 6 = 17. Сборът също е int.
- 17 // 3: колко цели групи по 3 има в 17? 5.
- Остатъкът 2 (това е 17 % 3) се отрязва. Резултатът е цялото число 5.
- 5 се записва в whole. Резултатът на // от цели числа е int, без .0.
- Отпечатва се „Цялата част: 5“. Дробната част (5,67) не е в резултата: за нея е /.
Отрязаното не се губи напълно. Операторът % дава остатъка от делението: 17 % 3 е 2, защото 17 = 5 · 3 + 2.
Двете заедно разделят количество на цели части и остатък. Филмът е 135 минути:
minutes = 135hours = minutes // 60rest = minutes % 60print(f"{hours} ч. {rest} мин.")2 ч. 15 мин.% ще ти трябва често. Число е четно, ако n % 2 е 0. Последната цифра на число е n % 10.
По-точно, за любопитните
- При отрицателни числа
//закръгля надолу, към по-малкото число:-7 // 2е -4, а не -3, както е в Java и C#. Остатъкът има знака на делителя.%работи и с дробни числа:
print(-7 // 2)print(-7 % 2)print(7.5 % 2)-411.5- Деление на 0 спира програмата:
ZeroDivisionError: division by zero. В Python това важи и за дробните числа:5.0 / 0също спира.
Пробвай
Бутилки в каси
В една каса влизат 6 бутилки. Имаш 17.
Какво ще отпечата програмата?
bottles = 17per_case = 6print(f"{bottles // per_case} каси")print(f"{bottles % per_case} остават")17 // 6 е 2 цели каси (12 бутилки), а 17 % 6 е остатъкът: 5 бутилки, които не пълнят каса.
Идеята
Превръщане между типове
В Python / вече дели дробно и средният успех излиза веднага. Превръщане трябва в обратната посока: от дробно към цяло.
total = 5 + 6 + 6average = total / 3print(average)print(f"{average:.2f}")whole = int(9.99)print(whole)5.6666666666666675.679Превръщането на тип се пише с името на типа: int(9.99) прави int, а float(17) прави 17.0. Това се казва превръщане на тип (cast). int(...) отрязва дробната част: int(9.99) е 9, не 10.
От int към float нищо не се губи и превръщането става само: 10 + 0.5 е float, 10.5. Ако едната страна е float, и // дава float: 17 // 3.0 е 5.0.
По-точно, за любопитните
int("25")от урока за входа е същата функция: тя превръща в цяло число и текст, и дробно число.- Всеки символ има код, число в таблицата със символите.
ordдава кода, аchrправи символ от код:
print(ord("A"))print(chr(66))max_int = 2147483647print(max_int + 1)65B2147483648- В Java и C#
intстига до 2 147 483 647 и едно повече „превърта“ до отрицателно число. В Pythonintняма граница, затова третият ред дава просто 2147483648.
Пробвай
Намери грешката
Сметката за ток е 125 € и се дели между трима съквартиранти. Програмата казва, че всеки дава 41,00 €, а трябва 41,67 €. На кой ред е грешката?
Избери реда с грешката.
// е целочислено деление: 125 // 3 е 41, а дробната част се отрязва. Форматът .2f после показва 41 като 41.00. За дробно деление е /: share = bill / people.Идеята
Съкратени записи: += и -=
Често променяш стойност спрямо самата нея: балансът на картата намалява с всяка покупка, броячът расте с едно. За това има кратки записи:
balance = 20purchases = 0balance -= 4.5purchases += 1balance -= 3.5purchases += 1print(f"{purchases} покупки, остават {balance} €")2 покупки, остават 12.0 €| Пишеш | Значи |
|---|---|
balance -= 4.5 |
balance = balance - 4.5 |
total += price |
total = total + price |
x *= 2, x /= 2, x //= 2, x %= 2 |
същото с *, /, // и % |
purchases += 1 |
purchases = purchases + 1 |
seats -= 1 |
seats = seats - 1 |
В Python няма ++ и --. Броячът расте с += 1.
+= работи и с текст: message += "!" долепя удивителен знак в края.
По-точно, за любопитните
a++ в Python е SyntaxError: invalid syntax. По-коварно е ++a: то не е грешка, а два плюса пред числото, +(+a). Стойността не се променя:
a = 5++aprint(a)5Ако идваш от друг език, внимавай: броячът си остава същият, а Python не казва нищо.
Идеята
math: корен, степен, закръгляне
Пицария продава пица от 30 см на същата цена като две пици от 20 см. Кое е повече? Площта на кръг е π · r². За степента Python има оператор: **. 15 ** 2 е 225. За π и за корена има готово в модула math: редът import math най-отгоре го зарежда, а после пишеш math., името и в скоби числата. Това са функции, готови парчета код. Свои ще пишеш в модул „Функции“.
import math
big = math.pi * 15 ** 2small = 2 * math.pi * 10 ** 2print(f"Една от 30 см: {big:.1f} кв. см")print(f"Две от 20 см: {small:.1f} кв. см")print(math.sqrt(144))print(abs(-7.5))Една от 30 см: 706.9 кв. смДве от 20 см: 628.3 кв. см12.07.5Една голяма пица е повече от две малки.
| Пишеш | Какво дава |
|---|---|
math.sqrt(x) |
корен квадратен |
x ** n или math.pow(x, n) |
x на степен n |
abs(x) |
абсолютната стойност (без знака), без math. |
round(x) |
закръгляне до цяло число, без math. |
math.pi |
числото π, 3,14159… |
math.sqrt и math.pow връщат float, дори когато резултатът е цяло число (затова 12.0). ** с цели числа дава int: 15 ** 2 е 225. Ако ти трябва int, превърни го: int(math.sqrt(144)).
По-точно, за любопитните
- Закръгляне на 2,5: езиците дават различно.
print(round(2.5))print(round(3.5))print(round(5.678, 2))245.68roundзакръгля „половинката“ към четното число: 2,5 става 2, а 3,5 става 4. Така е при банките (оттам и името „банково закръгляне“), както и в C#. С втори аргумент закръгляш до толкова знака след запетаята:round(5.678, 2)е 5,68.
- f-низовете не следват езиковите настройки на компютъра: точката си е точка навсякъде.
Упражнение
Да смята програмата
Реши задачите в редактора си. Всяко число на входа е на отделен ред.
1. Средно на три числа. Прочети три цели числа и отпечатай средното им с два знака след запетаята. Тук ти трябва дробно деление.
566Средно: 5.672. Секунди в часове. Прочети брой секунди и ги раздели на часове, минути и секунди. Подсказка: в един час има 3600 секунди, а % дава каквото остава.
37251 ч. 2 мин. 5 сек.3. Обем на сфера. Прочети радиуса и отпечатай обема: V = 4/3 · π · r³. Тук 4 / 3 е 1.333…, както трябва. А колко би било 4 // 3?
10Обем: 4188.79 куб. см4. Целзий във Фаренхайт. F = C · 9 / 5 + 32. Прочети температурата в градуси Целзий.
3737.0 °C = 98.6 °FОще задачи
- Инчове в сантиметри. Един инч е 2,54 см. За 12 инча:
30.48 см. - Площ на правоъгълник. Прочети дължината и ширината, отпечатай площта (дължина · ширина).
- Площ на квадрат. Прочети страната, отпечатай площта. Направи го веднъж с
*и веднъж с**. - Радиани в градуси. Градуси = радиани · 180 / π. За 3.14159:
180.00°. - Часове в секунди. Прочети брой часове и отпечатай колко секунди са. За 2 часа: 7200.
- Код на символ. Прочети символ и отпечатай кода му. За
A: 65. Първия символ на въведения текст вземаш сinput()[0]. Какво значи това, ще видим в урока за текста.
Тест