""" Урок 06. Логический тип данных и сравнения — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/06-boolean-comparisons/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-06.py """ # ==================================================================== # Пример 1. Что Python считает истиной # ==================================================================== # truthy_falsy.py values = [42, 0, -2, "", "0", "Python", "False", [], {}, (), None, 3.14] for v in values: print(repr(v), "->", bool(v)) # 42 -> True # 0 -> False # -2 -> True # '' -> False # '0' -> True # 'Python' -> True # 'False' -> True # [] -> False # {} -> False # () -> False # None -> False # 3.14 -> True # ==================================================================== # Пример 2. Операторы сравнения возвращают bool # ==================================================================== # comparisons.py a, b = 10, 5 print(a == b, a != b, a > b, a < b, a >= b, a <= b) # False True True False True False print("apple" == "Apple") # False — регистр важен print("apple" < "banana") # True — сравнение по алфавиту (кодам символов) print(3 == 3.0) # True — int и float сравниваются по значению # ==================================================================== # Пример 3. and/or с коротким замыканием # ==================================================================== # short_circuit.py def probe(name, value): print(" проверяю", name) return value print(probe("a", False) and probe("b", True)) # проверяю a # False — probe("b", ...) не вызывался print(probe("c", True) or probe("d", True)) # проверяю c # True — probe("d", ...) не вызывался print(not probe("e", True)) # проверяю e # False # ==================================================================== # Пример 4. and/or возвращают операнд, а не всегда bool # ==================================================================== # operand_return.py print(0 or "default") # default — 0 ложно, берём второй операнд print("value" or "default") # value — первый операнд уже истинный print("" and "unused") # (пусто) — "" ложно, and сразу его и вернул print(5 and "last") # last — 5 истинно, берём второй операнд name = "" or None or "Гость" print(name) # Гость # ==================================================================== # Пример 5. Приоритет: not выше and, and выше or # ==================================================================== # priority.py a2, b2, c2 = False, True, True print(not a2 or b2 and c2) # True print((not a2) or (b2 and c2)) # True — то же самое со скобками print(not (a2 or b2) and c2) # False — скобки меняют результат # ==================================================================== # Пример 6. Двойные неравенства как диапазон # ==================================================================== # chained_comparisons.py x = 5 print(1 < x <= 10) # True print(1 < x and x <= 10) # True — тот же смысл, длиннее запись print(0 <= x < 5) # False — 5 не входит в [0, 5) age = 17 print(0 <= age < 18) # True — типичная проверка возрастной границы # ==================================================================== # Пример 7. Логика в реальных условиях: погода, отпуск, тариф # ==================================================================== # real_life_conditions.py good_weather = True is_weekend = False free_time = True can_go_out = (good_weather or is_weekend) and free_time print(can_go_out) # True have_work = True enough_money = True can_go_vacation = not have_work and enough_money print(can_go_vacation) # False — работа мешает, даже если деньги есть used_mb = 400 extra_mb = used_mb - 500 total_price = 30 + extra_mb * 0.2 * int(used_mb > 500) print(total_price) # 30.0 — лимит не превышен, доплаты нет used_mb2 = 700 extra_mb2 = used_mb2 - 500 total_price2 = 30 + extra_mb2 * 0.2 * int(used_mb2 > 500) print(total_price2) # 70.0 — за 200 МБ сверх лимита начислена доплата # ==================================================================== # Пример 8. == сравнивает значение, is — тот же объект # ==================================================================== # equality_vs_identity.py list1 = [1, 2, 3] list2 = [1, 2, 3] print(list1 == list2) # True — содержимое одинаковое print(list1 is list2) # False — это два разных объекта в памяти list3 = list1 print(list1 is list3) # True — list3 ссылается на тот же объект a3 = None print(a3 == None) # True print(a3 is None) # True — но так писать не принято # ==================================================================== # Пример 9. Фильтрация и проверка условия по коллекции # ==================================================================== # any_all_scores.py scores = [55, 91, 40, 78, 60, 33] passing = [s for s in scores if s >= 60] print(passing) # [91, 78, 60] print(all(s >= 0 for s in scores)) # True — все баллы неотрицательны print(any(s >= 90 for s in scores)) # True — хотя бы один отличник print(all(s >= 60 for s in scores)) # False — не все прошли порог # ==================================================================== # Пример 10. Ошибка = вместо == внутри print() # ==================================================================== # assign_vs_compare.py a4 = 5 b4 = 5 try: print(a4 = b4) except TypeError as error: print("TypeError:", error) # 'a4' is an invalid keyword argument for print() print(a4 == b4) # True — а вот так сравнение работает print("5" == 5) # False — строка и число не равны без приведения print(int("5") == 5) # True — после приведения типов равны