Условия
Проблем
Доставката, която не трябваше да я има
Онлайн магазин обещава безплатна доставка за поръчки от 50 € нагоре. Под 50 € доставката е 4,99 €. Поръчката е 62 €, а програмата пак добавя доставка:
total = 62.0shipping = 4.99print(f"За плащане: {total + shipping} €")За плащане: 66.99 €Програмата изпълнява всеки ред, един след друг. Тук трябва да избере: един ред при едно положение, друг при друго.
Идеята
Сравнението отговаря с да или не
Първо програмата трябва да попита: сумата 50 € или повече ли е? За това има оператори за сравнение. Отговорът им не е число, а True (вярно) или False (невярно): стойност от тип bool.
total = 62.0print(total >= 50)print(total == 50)print(total != 50)TrueFalseTrue| Пишеш | Пита |
|---|---|
a > b, a < b |
по-голямо, по-малко |
a >= b, a <= b |
по-голямо или равно, по-малко или равно |
a == b |
равни ли са |
a != b |
различни ли са |
Внимавай: == сравнява, а = записва стойност. total == 50 пита дали сумата е 50, а total = 50 я прави 50.
Текст в Python се сравнява със същото ==:
answer = "да"yes = answer == "да"print(yes)TrueПо-точно, за любопитните
Дробни числа рядко са точно равни. Компютърът пази 0.1 и 0.2 приблизително, затова сумата им не е точно 0.3:
print(0.1 + 0.2 == 0.3)print(0.1 + 0.2)False0.30000000000000004За дробни числа питай дали са достатъчно близо: abs(a - b) < 0.000001. Сравнения с > и < нямат този проблем.
Идеята
if и else: единият от двата пътя
Сега програмата може да избира. if проверява условието след него. Ако е вярно, изпълнява блока след двоеточието. Ако не е, изпълнява блока след else:. Блокът са редовете, отместени с 4 интервала: скоби няма, отстъпът казва кое е вътре.
total = 62.0if total >= 50: shipping = 0else: shipping = 4.99print(f"Доставка: {shipping} €")Доставка: 0 €При поръчка от 18,50 € същата програма печата Доставка: 4.99 €. Изпълнява се само единият блок, никога и двата.
else не е задължителен. Без него, ако условието не е вярно, блокът просто се прескача и програмата продължава след него.
По-точно, за любопитните
- В Python отстъпът не е за красота, той е част от кода. Ред, отместен колкото самия
if, вече е извън блока и се изпълнява винаги. - Условието може да е всяка стойност, не само
TrueилиFalse. Числото 0 и празният текст""се броят за невярно, всичко друго за вярно:
total = 0if total: print("Има сума")else: print("0 се брои за невярно")0 се брои за невярноif total = 50:спира още преди програмата да тръгне, съсSyntaxError: Python не позволява=в условие.
Пробвай
Поръчка над наличното
В склада има 3 бройки, а клиентът поръчва 5.
Какво ще отпечата програмата?
stock = 3ordered = 5if ordered > stock: print("Няма достатъчно") ordered = stockprint(f"Изпращаме {ordered} бр.")5 > 3 е вярно, затова блокът се изпълнява: печата съобщението и намалява поръчката до 3. Последният ред е след блока и се изпълнява винаги.
Идеята
elif: повече от два пътя
Учителят превръща точките от теста в оценка. Възможностите са четири. Между if и else слагаш elif (съкратено от else if, „иначе ако“):
points = 76if points >= 90: print("Отличен")elif points >= 75: print("Много добър")elif points >= 50: print("Добър")else: print("Слаб")Много добърПроверките вървят отгоре надолу. Изпълнява се първият клон с вярно условие, а останалите се прескачат. 76 не е >= 90, но е >= 75, затова е „Много добър“. До >= 50 не се стига, макар и то да е вярно.
Затова редът има значение: най-строгото условие е първо. Ако points >= 50 беше най-отгоре, всеки с 50 и повече точки щеше да е „Добър“.
points = 76if points >= 90: print("Отличен")elif points >= 75: print("Много добър")elif points >= 50: print("Добър")else: print("Слаб")Стъпка по стъпка, с думи
- points е 76.
- 76 >= 90? Не. Клонът „Отличен“ се прескача.
- 76 >= 75? Да. Влизаме в клона „Много добър“.
- Отпечатва се „Много добър“.
- И 76 >= 50 е вярно, но не се проверява: веригата спира при първия верен клон.
Пробвай
Намери грешката
Отличен е всеки с 90 точки и повече. Ученик с точно 90 точки получава „Много добър“. На кой ред е грешката?
Избери реда с грешката.
points > 90 пропуска самото 90. Трябва points >= 90. Такива грешки „с едно“ се срещат често: когато условието е „от … нагоре“, провери какво става точно на границата.
Идеята
И, или, не
Киното дава билет с отстъпка на деца и на студенти. Условията са две, а стига едното. Свързваш ги с логически оператори:
age = 16student = Falseif age < 18 or student: print("Билет с отстъпка: 6 €")else: print("Билет: 10 €")Билет с отстъпка: 6 €В Python операторите са думи:
a and bе вярно, когато и двете са верни („и“).a or bе вярно, когато поне едното е вярно („или“).not aе вярно, когатоaне е вярно („не“):not student.
Безплатна доставка над 50 € и само в града е total >= 50 and in_city. Числото е между 1 и 12, ако month >= 1 and month <= 12. В Python работи и записът от математиката, 1 <= month <= 12: той значи същото.
month = 13print(1 <= month <= 12)print(month >= 1 and month <= 12)FalseFalseПо-точно, за любопитните
- Ако левият операнд вече решава отговора, десният не се проверява: при
False and …и приTrue or …. Това се казва кратко съединяване и понякога пази от грешка:count != 0 and total / count > 10никога не дели на 0 (в Python делението на 0 спира програмата съсZeroDivisionError). andе предиor, като*преди+. При смесване слагай скоби, за да се чете ясно:(a and b) or c.- Условие може да е и вътре в друг
if. Това е вложенif. Този код е същото катоif total >= 50 and in_city:
if total >= 50: if in_city: shipping = 0Пробвай
И на 5, и на 7
Какво трябва да пише на празното място, за да е вярно условието само за числа, които се делят и на 5, и на 7?
number = 35
if number % 5 == 0 number % 7 == 0:
print("Дели се и на 5, и на 7")and: трябва и двете проверки да са верни. С or щеше да стига едната и 10 също щеше да мине.Идеята
Условният израз if … else
Понякога целият if е само за да избереш една от две стойности. За това има кратък запис на един ред, условен израз:
points = 76message = "Издържал си!" if points >= 50 else "Неуспешен опит."print(message)Издържал си!Чете се почти като изречение: стойност, ако е вярно, if условие, else стойност, ако не е. Същото с if и else е няколко реда, а тук е един.
В Java, C# и JavaScript същото се пише с ? : и се казва тернарен оператор. Python няма ? :, неговото съответствие е условният израз.
Ползвай го за избор на стойност. Ако в двата случая програмата трябва да направи различни неща, пиши if.
По-точно, за любопитните
- Двете стойности могат да са от различен тип: текст в единия случай и число в другия. Програмата върви, но после не знаеш какво държи променливата. Избирай между стойности от един тип.
points = 40result = "Издържал" if points >= 50 else 0print(result)0- Условни изрази могат да се влагат един в друг, но такъв код се чете трудно. За три и повече възможности пиши
elif.
Идеята
match: избор по стойност
Магазинът работи от 9:00 до 18:00 през седмицата, в събота до 14:00, а в неделя е затворен. Ако денят е число (1 е понеделник, 7 е неделя), сравняваш го с няколко точни стойности. За това има match:
day = 6match day: case 6: print("10:00–14:00") case 7: print("Почивен ден") case _: print("9:00–18:00")10:00–14:00matchвзима стойността след него и я сравнява с всекиcaseотгоре надолу. Изпълнява се първият, който съвпада.- След своя
casematchприключва: другите не се изпълняват иbreakне трябва. case _:е за всички останали стойности, като последнияelse.- Няколко стойности с еднакво действие се пишат с
|в единcase:case 6 | 7:.
match има от Python 3.10. В по-стар код същото се пише с if и elif. За проверки от типа „от 50 нагоре“ пиши if.
По-точно, за любопитните
caseс голо име, напримерcase sunday:, не сравнява с променливатаsunday. То съвпада с всяка стойност и я записва в това име. Тук денят е 3, а програмата печата „Почивен ден“:
sunday = 7day = 3match day: case sunday: print("Почивен ден")Почивен денВ case пиши самите числа и текст: case 7:, case "+":.
- В Java и C#
switchможе и да дава стойност.matchне може: запиши стойността в променлива във всекиcase. Пример с|:
day = 7match day: case 6 | 7: print("Почивни дни") case _: print("9:00–18:00")Почивни дниУпражнение
Програми, които избират
Реши задачите в редактора си. Всяко число на входа е на отделен ред. Пробвай всяко решение и с вход, който минава през другите клонове.
1. Билет за кино. Прочети възрастта. До 6 години се влиза безплатно, до 17 билетът е 6 €, до 64 е 10 €, от 65 нагоре е 5 €. Отрицателна възраст е грешка.
15Билетът е 6 €2. Мини калкулатор. Прочети число, операция (+, -, * или /) и второ число. Избери действието с match по текста на операцията. На 0 не се дели.
12/5Резултат: 2.43. Квадратно уравнение. Прочети a, b и c от ax² + bx + c = 0. Дискриминантата е D = b² − 4ac. Ако D е положително, корените са два: (−b ± √D) / 2a. Ако D е 0, коренът е един: −b / 2a. Ако D е отрицателно, реални корени няма. Ако a = 0, уравнението не е квадратно.
1-32x1 = 2.00, x2 = 1.004. Валидна дата. Прочети ден, месец и година и кажи дали датата съществува. Броя на дните в месеца намери с match. Февруари има 29 дни във високосна година: делима на 4, но не на 100, или делима на 400.
2922023Невалидна датаЗа 29, 2, 2024 изходът е Валидна дата.
Още задачи
- Четно или нечетно. За 7:
Нечетно. - Положително, отрицателно или нула. За −5:
Отрицателно. - По-голямо от 10. За 15:
По-голямо от 10. - Равни ли са. Прочети две числа. За 5 и 5:
Равни. - По-голямото от две. Прочети две числа и отпечатай по-голямото. Направи го веднъж с
ifи веднъж с… if … else …. - Абсолютна стойност. Без
abs: ако числото е отрицателно, смени му знака. - Да или не. Прочети текст. Отпечатай
Trueза „да“,Falseза „не“ иНеразбран отговорза всичко друго. - На 5 и на 7. Кажи дали числото се дели и на 5, и на 7. За 35: да, за 10: не.
- Три числа във възходящ ред. Прочети три числа и ги отпечатай от най-малкото към най-голямото. За 7, 2, 5:
2 5 7. - Най-малко и най-голямо от пет. Прочети пет числа в пет променливи. Запомни първото като най-малко и най-голямо, после сравни с него всяко следващо.
- Ден от седмицата. Прочети число от 1 до 7 и отпечатай деня:
1еПонеделник. За друго число:Няма такъв ден. Пробвай сmatch. - Възрастова категория. До 12 години е дете, до 19 тийнейджър, иначе възрастен.
- Сезон по месец. Декември, януари и февруари са зима, март до май пролет и т.н. За 4:
Пролет. С match сложи няколко стойности в един case: case 12 | 1 | 2: - Триъгълник ли е. Три страни правят триъгълник, ако сумата на всеки две е по-голяма от третата. За 3, 4, 5: да, за 1, 2, 3: не.
- Оценка с думи. Прочети оценка от 2 до 6 и отпечатай
Слаб,Среден,Добър,Много добърилиОтличен. - Познай животното. Програмата задава въпроси с отговор „да“ или „не“ и познава какво животно си намислил. Започни с поздрав и кратко обяснение на играта. Можеш да зададеш всички въпроси и после да решиш с
elif, или да питаш само нужното с вложениif. Въпросникът:
| Въпрос | Ако „да“ | Ако „не“ |
|---|---|---|
| Лети ли? | птица или насекомо | продължи |
| Има ли пера? | птица | ако лети, насекомо |
| Плува ли? | ако не лети: риба или водно бозайниче | продължи |
| Мяука ли? | котка | не е котка |
| Има ли косми? | куче, котка или друг бозайник | гущер или друго влечуго |
| Зелено ли е? | ако не лети и не плува: жаба или гущер | продължи |
| Реве ли? | крава или лъв | продължи |
| Има ли хобот? | слон | продължи |
Пример (входът е отговорът на всеки въпрос, по ред):
нененедаданененеНамисли животно. Ще ти задам 8 въпроса, отговаряй с да или не.Лети ли?Има ли пера?Плува ли?Мяука ли?Има ли косми?Зелено ли е?Реве ли?Има ли хобот?Мисля, че е котка.Тест