Получение пользовательского ввода в python с input()

# Преобразование к логическому типу

Нам известны три типа данных – целые и вещественные (дробные) числа, и также строками. Новый четвертый – логический тип данных (тип ). Его также называют булевым. У этого типа всего два возможных значения: (правда) и (ложь):

1234

Здесь переменной a было присвоено значение , после чего с помощью встроенной в Python функции проверен ее тип. Интерпретатор сообщил, что это переменная класса . Понятия «класс» и «тип данных» в данном случае одно и то же. Переменная b также связана с булевым значением.

В программировании обычно приравнивают к нулю, а – к единице. Чтобы в этом убедиться, можно преобразовать булево значение к целочисленному типу:

12

Возможно и обратное. Можно преобразовать какое-либо значение к булевому типу:

12345

И здесь работает правило: всё, что не и , является правдой: .

Операторы сравнения

В программировании операторы сравнения используются при оценке и сравнении значений для последующего сведения их к одному логическому значению (True или False).

Операторы сравнения Python 3 представлены в этой таблице:

Оператор
Значение
== Проверяет равенство между компонентами; условие истинно, если компоненты равны.
!= Проверяет равенство между компонентами; условие истинно, если компоненты НЕ равны.
Оценивает значение левого компонента; условие истинно, если он меньше, чем правый.
> Оценивает значение левого компонента; условие истинно, если он больше, чем правый.
Оценивает значение левого компонента; условие истинно, если он меньше или равен правому компоненту.
>= Оценивает значение левого компонента; условие истинно, если он больше или равен правому компоненту.

Попробуйте поработать с этими операторами, чтобы понять, как они действуют. Для начала создайте пару переменных:

Теперь сравните значения переменных с помощью вышеперечисленных операторов.

x = 5
y = 8
print(«x == y:», x == y)
print(«x != y:», x != y)
print(«x
print(«x > y:», x > y)
print(«x
print(«x >= y:», x >= y)
x == y: False
x != y: True
x
x > y: False
x
x >= y: False

Следуя математической логике, Python оценивает соотношения между значениями переменных так:

  • 5 равно 8? Ложь
  • 5 не равно 8? Истина
  • 5 меньше 8? Истина
  • 5 больше 8? Ложь
  • 5 меньше или равно 8? Истина
  • 5 больше или равно 8? Ложь

Также операторы сравнения можно применять к числам с плавающей точкой и строкам.

Примечание
: Строки чувствительны к регистру; чтобы отключить такое поведение, нужно использовать специальный метод.

Попробуйте сравнить две строки:

Hello = «Hello»
hello = «hello»
Hello == hello: False

Строки Hello и hello содержат одинаковый набор символов, однако они не равны, поскольку одна из них содержит символы верхнего регистра. Попробуйте добавить ещё одну переменную, которая также будет содержать символы верхнего регистра, а затем сравните их.

Hello = «Hello»
hello = «hello»
Hello_there = «Hello»
print(«Hello == hello: «, Hello == hello)
print(«Hello == Hello_there», Hello == Hello_there)
Hello == hello: False
Hello == Hello_there: True

Битовые операторы в Python

Побитовые операторы работают над битами и выполняют операции бит за битом. Допустим, если а = 60; и б = 13; В настоящее время в двоичном формате они будут выглядить следующим образом:

—————–

а&б = 0000 1100

а|б = 0011 1101

а^б = 0011 0001

Встроенная функция bin() в Python может быть использована для получения двоичного представления целого числа.

Следующие Битовые операторы поддерживаются языком Python:

Оператор Описание Пример
& бинарный И копии оператора бита, в результате, если они существует в обоих операндах (а & б) (0000 означает 1100)
| бинарный ИЛИ копирует бит, если он существует в любом из операндов. (а | б) = 61 (означает 0011 1101)
^ бинарный Исключающий или копирует бит, если он установлен в одном операнде, но не в обоих. (а ^ б) = 49 (означает 0011 0001)
~ Бинарным комплемент Это унарное и имеет эффект бит «листать». (~ а) = -61 (в форме означает двойной комплемент 1100 0011 из-за подписанного двоичного числа.
Значение левого операнда перемещается влево на число битов, заданное правым операндом. а
>> Двоичный сдвиг вправо Значение левого операнда перемещается вправо на число битов, заданное правым операндом. а >> = 15 (0000 означает 1111)

Одиночные проверки

Внутри условия
можно прописывать и такие одиночные выражения:

x = 4; y = True; z = False
if(x): print("x = ", x, " дает true")
if(not ): print("0 дает false")
if("0"): print("строка 0 дает true")
if(not ""): print("пустая строка дает false")
if(y): print("y = true дает true")
if(not z): print("z = false дает false")

Вот этот оператор
not – это отрицание
– НЕ, то есть, чтобы проверить, что 0 – это false мы
преобразовываем его в противоположное состояние с помощью оператора отрицания
НЕ в true и условие
срабатывает. Аналогично и с переменной z, которая равна false.

Из этих примеров
можно сделать такие выводы:

  1. Любое число,
    отличное от нуля, дает True. Число 0 преобразуется в False.

  2. Пустая строка –
    это False, любая другая
    строка с символами – это True.

  3. С помощью
    оператора not можно менять
    условие на противоположное (в частности, False превращать в True).

Итак, в условиях
мы можем использовать три оператора: and, or и not. Самый высокий
приоритет у операции not, следующий приоритет имеет операция and и самый
маленький приоритет у операции or. Вот так работает оператор if в Python.

Видео по теме

Python 3 #1: установка и запуск интерпретатора языка

Python 3 #2: переменные, оператор присваивания, типы данных

Python 3 #3: функции input и print ввода/вывода

Python 3 #4: арифметические операторы: сложение, вычитание, умножение, деление, степень

Python 3 #5: условный оператор if, составные условия с and, or, not

Python 3 #6: операторы циклов while и for, операторы break и continue

Python 3 #7: строки — сравнения, срезы строк, базовые функции str, len, ord, in

Python 3 #8: методы строк — upper, split, join, find, strip, isalpha, isdigit и другие

Python 3 #9: списки list и функции len, min, max, sum, sorted

Python 3 #10: списки — срезы и методы: append, insert, pop, sort, index, count, reverse, clear

Python 3 #11: списки — инструмент list comprehensions, сортировка методом выбора

Python 3 #12: словарь, методы словарей: len, clear, get, setdefault, pop

Python 3 #13: кортежи (tuple) и операции с ними: len, del, count, index

Python 3 #14: функции (def) — объявление и вызов

Python 3 #15: делаем «Сапер», проектирование программ «сверху-вниз»

Python 3 #16: рекурсивные и лямбда-функции, функции с произвольным числом аргументов

Python 3 #17: алгоритм Евклида, принцип тестирования программ

Python 3 #18: области видимости переменных — global, nonlocal

Python 3 #19: множества (set) и операции над ними: вычитание, пересечение, объединение, сравнение

Python 3 #20: итераторы, выражения-генераторы, функции-генераторы, оператор yield

Python 3 #21: функции map, filter, zip

Python 3 #22: сортировка sort() и sorted(), сортировка по ключам

Python 3 #23: обработка исключений: try, except, finally, else

Python 3 #24: файлы — чтение и запись: open, read, write, seek, readline, dump, load, pickle

Python 3 #25: форматирование строк: метод format и F-строки

Python 3 #26: создание и импорт модулей — import, from, as, dir, reload

Python 3 #27: пакеты (package) — создание, импорт, установка (менеджер pip)

Python 3 #28: декораторы функций и замыкания

Python 3 #29: установка и порядок работы в PyCharm

Python 3 #30: функция enumerate, примеры использования

Сравнение

Операторы в Python используется для сравнения переменных. Кроме стандартных, известных из математических задач, существует проверка по значению и по типу, а также проверка неравенства.

Операции сравнения осуществляются в виде a x b, где x — это оператор сравнения.

В программировании оператор “=” работает не так, как в математике. Соответствие значений каждого аргумента определяется оператором “==”, но “=” только присваивает значение. С помощью!= проверяется неравенство переменных. Этот оператор можно заменить как “”, что не является стандартным оператором в других языках, как Си, Джава или Джаваскрипт.

Арифметические операторы Python

Пайтон предоставляет огромное количество библиотек для решения вычислительных задач. Большой набор методов ставит Python на один уровень с Matlab и Octave. Арифметические операции применяются относительно к целым числам типа int, вещественным типа float, комплексным complex.

Если в качестве аргументов операции используются только целые числа, результат тоже будет целым. Операции между числами с плавающей точкой в результате дадут целое и дробное. Единственная операция, при которой взаимодействие целых чисел дает дробное, — это деление.

Все возможные арифметические операции приведены в таблице.

Добавление одного числа к другому выполняет оператор additional. Вычитание осуществляется с помощью subtraction. Умножение одного числа на другое происходит с multiplication. Возведение в степень осуществляется с помощью exponenta. Для деления используется division.

Оператор modulus (%) возвращает остаток от деления левого операнда на правый. Если переменная a = 10, переменная b = 20, то b%a == 0. Что такое оператор деления с остатком, легко понять на следующем примере. Если 9/2 == 4.5, то 9//2 возвращает результат, равный 4. Деление с floor division (//) возвращает целое число от операции деления левого операнда на правый.

Выполнение любых операций осуществляется непосредственно самими числами или перемеными, которым присвоены числовые значения. Результатом может являться другая переменная либо одна из существующих.

Наряду с целыми и вещественными числами в Python существуют комплексные числа. Они состоят из действительной и мнимой части. Записываются в виде c = a+bj, где а — действительная часть,

C.real()
#a

b — мнимая.

C.imag()
#b

Арифметические операции c комплексными числами имеют те же свойства, что и с вещественными. Использование complex numbers можно представить на плоскости с прямоугольной системой координат. Точка a пересечения оси X и оси Y соответствует комплексному числу x + yi. Таким образом, на оси X располагаются вещественные числа, а на вертикальной оси Y — мнимые.

Приоритеты

В списке приведены операторы и выражения, отсортированные по приоритету выполнения от меньшего к большему.

Операторы в Python и их приоритет выполнения:

  • Лямбда выражения.
  • Python.
  • Булевое ИЛИ.
  • Булевое И.
  • Булевое НЕ.
  • Операторы тождественности, принадлежности, операторы присваивания.
  • Битовый ИЛИ.
  • Битовый НЕ.
  • Битовый И.
  • Битовый оператор сдвига битов.
  • Сложение и вычитание.
  • Умножение и деление, включая операцию получения остатка деления и целого числа.
  • Битовое НЕ.
  • Возведение в степень.
  • Обращение к элементу массива по индексу, слайсинг, обращение к объекту класса, вызов функции с аргументами.

Первый пункт в списке — лямбда-выражение. Lambda expression используется для создания анонимных функций. Лямбда ведет себя как обычная функция, и объявляется в виде

Def (arguments):
return expression

После лямбда-выражения следуют операции, выполняемые тернарным оператором Python.

В конце списка располагаются методы манипуляции массивом и функциями. Обращение к элементу массива по индексу выглядит так:

В рассматриваемом случае а — это массив, i — это индекс элемента.

Слайсинг означает передачу полной копии массива или выборочную последовательность из членов списка. Диапазон желаемых значения указывается в . В качестве аргументов x представляется начало отсчета, y — конец, а z — шаг прохождения по элементам массива при каждой итерации. X по умолчанию обозначает начало списка, y — конец, z равняется единице. Если указать z как отрицательное число, значения списка передаются в обратном порядке с конца к началу.

О
ператоры являются конструкциями, которые могут манипулировать значением операндов. Рассмотрим выражение 4 + 5 = 9. Здесь, 4 и 5 называются операндами и + называется оператором.

Логические операции

Логические операции
and  (логическое И),
or  (логическое ИЛИ),
not  (логичесткое НЕ) работают вполне предсказуемо, , только для обозначения используются английские слова, вместо двух символов:

Python

$ python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
on linux
Type «help», «copyright», «credits» or «license» for more information.
>>> x = true
Traceback (most recent call last):
File «<stdin>», line 1, in <module>
NameError: name ‘true’ is not defined
>>> x = True
>>> y = False
>>> print (x and y)
False
>>> print (x or y)
True
>>> print(not(x))
False

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$python3

Python3.5.3(default,Sep272018,172539)

GCC6.3.020170516on linux

Type»help»,»copyright»,»credits»or»license»formore information.

>>>x=true

Traceback(most recent call last)

File»<stdin>»,line1,in<module>

NameErrorname’true’isnotdefined

>>>x=True

>>>y=False

>>>print(xandy)

False

>>>print(xory)

True

>>>print(not(x))

False

Операции сравнения

Операции сравнения
== (равенство),
!=  (неравенство),
>  (больше),
=  (больше или равно),

Обратите внимание, что для сравнения используется не знак равенства
=, а два знака равенства, так как в C- подобных языках один знак равенства используется для операции присваивания

Примеры использования:

Python

$ python3
Python 3.5.3 (default, Sep 27 2018, 17:25:39)
on linux
Type «help», «copyright», «credits» or «license» for more information.
>>> 20 == 30
False
>>> 20 == 20
True
>>> 20 != 30
True
>>> 20 != 20
False
>>> 20 > 30
False
>>> 30 > 20
True
>>> 20 < 30
True
>>> 30 < 20
False
>>> 30 >= 20
True
>>> 20 >= 20
True
>>> 19 >= 20
False
>>> 30 <= 20
False
>>> 20 <= 20
True
>>> 19 <= 20
True
>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

$python3

Python3.5.3(default,Sep272018,172539)

GCC6.3.020170516on linux

Type»help»,»copyright»,»credits»or»license»formore information.

>>>20==30

False

>>>20==20

True

>>>20!=30

True

>>>20!=20

False

>>>20>30

False

>>>30>20

True

>>>20<30

True

>>>30<20

False

>>>30>=20

True

>>>20>=20

True

>>>19>=20

False

>>>30<=20

False

>>>20<=20

True

>>>19<=20

True

>>>

Вложенные операторы If

Вложенные операторы if используются, когда нужно проверить второе условие, когда первое условие выполняется. Для этого можно использовать оператор if-else внутри другого оператора if-else. Синтаксис вложенного оператора if:

if statement1:              #внешний оператор if
    print("true")

    if nested_statement:    #вложенный оператор if
        print("yes")

    else:                   #вложенный оператор else 
        print("no")

else:                       #внешний оператор else 
    print("false")

Результатом работы программы может быть:

Если значение statement1 равно true, программа проверяет, равно ли true значение nested_statement. Если оба условия выполняются, результат будет следующим:

Вывод:

true
yes

Если statement1оценивается как true, но nested_statement оценивается как false, вывод будет уже другим:

Вывод:trueno

Значение statement1 равно false, а вложенный оператор if-else не будет выполняться, поэтому «сработает» оператор else:

Вывод:

false

Также можно использовать несколько вложенных операторов if:

if statement1:                  #внешний if 
    print("hello world")

    if nested_statement1:       #первый вложенный if 
        print("yes")

    elif nested_statement2:     # первый вложенный elif
        print("maybe")

    else:                       # первый вложенный else
        print("no")

elif statement2:                # внешний elif
    print("hello galaxy")

    if nested_statement3:       #второй вложенный if
        print("yes")

    elif nested_statement4:     # второй вложенный elif
        print("maybe")

    else:                       # второй вложенный else
        print("no")

else:                           # внешний else
    statement("hello universe")

В приведенном выше коде внутри каждого оператора if  (в дополнение к оператору elif ) используется вложенный if. Это дает больше вариантов в каждом условии.

Используем пример вложенных операторов if в программе grade.py.  Сначала проверим, является ли балл проходным (больше или равно 65%). Затем оценим, какой буквенной оценке соответствует балл. Но если балл непроходной, нам не нужно проверять буквенные оценки. И можно сразу информировать ученика, что балл является непроходным. Модифицированный код с вложенным оператором if:

if grade >= 65:
    print("Passing grade of:")

    if grade >= 90:
        print("A")

    elif grade >=80:
        print("B")

    elif grade >=70:
        print("C")

    elif grade >= 65:
        print("D")

else:
    print("Failing grade")

При переменной grade равной 92 первое условие будет выполнено, и программа выведет «Passing grade of:». Затем она проверит, является ли оценка больше или равной 90. Это условие также будет выполнено и она выведет A.

Если переменная grade равна 60, то первое условие не будет выполнено. Поэтому программа пропустит вложенные операторы if, перейдет к оператору else и выведет сообщение «Failing grade».

Но можно добавить еще больше вариантов и использовать второй слой вложенных if. Например, чтобы определить оценки A+, A и A-. Мы можем сделать это, сначала проверив, является ли оценка проходной, затем, является ли оценка 90 или выше. А после этого, превышает ли оценка 96 для A+, например:

if grade >= 65:
    print("Passing grade of:")

    if grade >= 90:
        if grade > 96:
            print("A+")

        elif grade > 93 and grade <= 96:
            print("A")

        elif grade >= 90:
            print("A-")

Для переменной grade со значением 96 программа выполнит следующее:

  1. Проверит, является ли оценка больше или равной 65 (true).
  2. Выведет «Passing grade of:»
  3. Проверит, является ли оценка больше или равной 90 (true).
  4. Проверит, превышает ли оценка 96 (false).
  5. Проверит, является ли оценка больше 93, а также меньше или равна 96 (true).
  6. Выведет
  7. Пропустит оставшиеся вложенные условные операторы и вернется к остающемуся коду.

Результат работы программы для переменной grade равной 96:

Вывод:

Passing grade of:
A

Вложенные операторы if позволяют добавлять несколько уровней условий в создаваемый код.

Присваивание

Операторы Python присваивают значение переменной.

Присваивание является одной из центральных конструкций в программировании. С его помощью переменным задаются некоторые значения, они могут изменяться в ходе программы.

Алгоритм работы:

  • вычисление левостороннего значения;
  • вычисление правостороннего значения;
  • присвоение одного значения другому — при конфликте типов должно быть осуществлено их приведение;
  • возврат результата операции — true или false.

И математической операции работают по такому принципу:

a x b, где x — это оператор, означает что a = a x b. Таким образом, a += b говорит о том, что значение переменной a прибавляется к значению переменной b, а их результат присваивается переменной a. То же самое происходит с другими примерами. Например, a **= b расшифровывается как a = a ** b, то есть a возводится в степень b, результат в итоге присваивается a.

Методы словарей Python

В словарях есть специальные методы, которые можно использовать:

d.get(ключ)

Метод get() позволяет получить значение. Ему нужно указать ключ для поиска. Можно вернуть значение по умолчанию, если ключ не будет найден. По умолчанию это None:

>>> print(sample_dict.get('address'))
None
>>> print(sample_dict.get('address', 'Not Found'))
Not Found

Первый пример иллюстрирует, что происходит, если попытаться получить ключ, которого не существует без установки значения get по умолчанию. В этом случае метод возвращается None.

Во втором примере показано, как установить по умолчанию строку “Not Found”.

d.clear()

Метод clear() используется, чтобы удалить все элементы из словаря.

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict
{'email': 'jdoe@gmail.com', 'first_name': 'James', 'last_name': 'Doe'}
>>> sample_dict.clear()
>>> sample_dict
{}

d.copy()

Чтобы создать простую копию словаря, используется метод copy().

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> copied_dict = sample_dict.copy()
>>> copied_dict
{'email': 'jdoe@gmail.com', 'first_name': 'James', 'last_name': 'Doe'}

Если в словаре есть объекты или словари, то можно столкнуться с логическими ошибками. Так как изменение одного словаря может повлиять на его копию. В этом случае необходимо использовать модуль Python copy, в котором есть функция deepcopy(). Она создаетотдельную копию словаря.

d.Items()

Метод items() возвращает новое представление из элементов словаря.

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.items()
dict_items()

Этот объект представления будет меняться по мере изменения самого словаря.

d.keys()

Чтобы получить представление ключей, которые есть в словаре, используется метод keys(). Он предоставляет динамическое представление ключей словаря. Можно представление, а также проверить принадлежность представлению по ключевому слову in.

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> keys = sample_dict.keys()
>>> keys
dict_keys()
>>> 'email' in keys
True
>>> len(keys)
3

d.values()

Метод values() возвращает объект динамического представления значений словаря.

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> values = sample_dict.values()
>>> values
dict_values()
>>> 'Doe' in values
True
>>> len(values)
3

d.pop(ключ)

Чтобы удалить ключ из словаря, используется метод pop(). Он принимает ключ и строку параметра по умолчанию. Если не установить значение по умолчанию и ключ не будет найден, то выведется ошибка KeyError.

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.pop('something')
Traceback (most recent call last):
Python Shell, prompt 146, line 1
builtins.KeyError: 'something'
>>> sample_dict.pop('something', 'Not found!')
'Not found!'
>>> sample_dict.pop('first_name')
'James'
>>> sample_dict
{'email': 'jdoe@gmail.com', 'last_name': 'Doe'}

d.popitem()

Метод popitem() используется для удаления и возвращает пары ключ-значение из словаря в порядке «последним добавлен — первым удален». Если метод вызывается в пустом словаре, то отобразится KeyError.

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.popitem()
('email', 'jdoe@gmail.com')
>>> sample_dict
{'first_name': 'James', 'last_name': 'Doe'}

d.update()

Метод обновляет словарь другими парами ключ-значение, перезаписывая существующие ключи. Возвращает None.

>>> sample_dict = {'first_name': 'James', 'last_name': 'Doe', 'email': 'jdoe@gmail.com'}
>>> sample_dict.update()
>>> sample_dict
{'email': 'jdoe@gmail.com',
'first_name': 'James',
'last_name': 'Doe',
'something': 'else'}

Операторы:

Самое первое и самое главное что нужно знать, так это операторы, для сравнения и логические.

Python 3 операторы сравнения:

Операторов сравнения в Python 3 не так много, как в других языках программирования, так как нет строгого сравнивания, том уже по умолчанию строгое сравнение, вот они все:

Python

1
2
3
4
5
6
7
8
9
10

a=10;

b=3;

c=a>b# a больше b, c будет равен true

c=a<b# a меньше b, c будет равен false

c=a>=b# a больше или равно b, c будет равен true

c=a<=b# a меньше или равно b, c будет равен false

c=a==b# a равно b, c будет равен false

c=a!=b# a не равно b, c будет равен true

c=a<>b# аналог !=

Как видите тут всё по стандарту, единственное есть ещё оператор который полный аналог оператора (Не равно), в остальном тут всё понятно.

Python 3 логические операторы:

Логические операторы в Python 3 пишутся словами, а не как в других языках программирования:

Python

1
2
3
4
5
6

a=True

b=False

c=aandb# Логическое и, возвращает True, если два значение равно True, c равно False

c=aorb# Логическое или, возвращает True, если хотя бы одно значение равно True, c равно True

c=nota# Логическое не, просто отзеркаливает значение, c равно False

Тоже не чего сложного тут нет, всё понятно и просто, я думаю вы поняли, единенное оператор возвращает противоположное значение, то есть если значение логического выражения равно , то используя not на нём, оно будет равен .

# Упражнения

  1. Напишите следующую программу:

    • Присвойте двум переменным любые числовые значения.
    • с помощью оператора составьте два сложных логических выражения, одно из которых дает , другое – .
    • используя оператор составьте два сложных логических выражения, одно из которых дает , другое – .
  2. Составьте программу сравнения строковых переменных:

    • с пятью простыми логическими выражениями;
    • с четырьмя сложными выражениями;
    • объясните результат.
  3. Напишите программу, которая спрашивает у пользователя: «What day of month is it?» И выводит — если день указан верно, и — если день указан не верно. Указанный день считается верным, если число от 1 до 31.

  4. Напишите программу, которая спрашивает у пользователя: «What number of month were you born?» И выводит — если месяц указан верно, и — если не верно. Указанный месяц считается верным, если число от 1 до 12.

Виды плохого кода и варианты рефакторинга

Составные условия

Во-первых, это составные условия для выполнения блока под условным оператором.

Если в наше выражение с оператором заложено одно условие, то его сравнительно легко прочитать.

Но вот когда мы заготавливаем составные условия, становится чуть-чуть сложнее переварить логику.

Чем больше сложностей мы закладываем в свои условные выражения, тем сложнее понимать нашу логику.

Предлагаю переделать условия в булевую переменную (boolean variable) или функцию.

Вернемся к условному выражению с двумя компонентами.

Рефакторинг кода может заключаться в вынесении условия в отдельную переменную с понятным описательным названием. Затем мы используем эту переменную в выражении с оператором :

Эту переменную можно использовать и в том более сложном условном выражении, и еще много-много раз.

Как вариант рефакторинга, можно переделать выражение в функцию, чтобы код стал более читаемым.

Вложенные условия выражения

Еще одна схема программирования, усложняющая чтение кода — это вложенные выражения с оператором (nested if statements). Они включают в себя серию подчиненных выражений, которые приобретают форму наконечника стрелы.

Какие проблемы создает такой код.

Во-первых, в таком коде высокая цикломатическая сложность (cyclomatic complexity). Это такая метрика для количества отдельных ветвей кода. Чем выше цикломатическая сложность, тем код сложнее для понимания и еще сложнее для тестов.

Кроме того, для глубоко вложенных условных выражений остается слишком узкая строка с небольшим количеством символов. Чем дальше вложенность выражения, тем больше пробелов нужно ставить.

Второй совет по поводу рефакторинга кода связан как раз с выравниванием вложенного кода.

Пускай примером станет программа совместного пользования велосипедами у нас в Чикаго. У нее будет открытый API, а у меня дома — панель с количеством велосипедов, доступных для использования на ближайшей станции.

Давайте пройдемся по коду, который создает эту панель. В нем используется библиотека , которая соединяется с API. Мы получаем ответ (response), и если он 200, то мы получим данные со станции. Затем мы запустим цикл по всем доступным станциям и найдем ту, которая нужна именно нам.

Далее, если количество велосипедов меньше или равно заданному пороговому значению (здесь это будет 3), то мы вернем сообщение о том, что нужно поспешить («Hurry up! Bikes are almost out!»). Если же велосипедов больше порогового значения, то мы возвращаем другое сообщение о том, что их много и торопиться не нужно («No need to rush just yet.»)

Наконец, если первый запрос получает не 200 в качестве ответа, то мы можем выбросить исключение. Оно окажется достаточно далеко от того кода, с которым связано.

Есть много способов, с помощью которых можно выровнять вложенный код. Основные из них следующие: — всегда добавлять строку о возвращаемом значении как можно раньше; — заменить условное выражение контрольным оператором (guard clause); — заменить проверку на положительный ответ проверкой на отрицательный ответ; — дополнительная информация

Итак, что можно сделать с этой программой. Сначала мы добавляем контрольного оператора (Guard Clause), который проверяет код статуса на случай, если ответ будет не 200. Это дает возможность объединить логику завершения программы в этом случае, а остальной код не будет иметь посторонних элементов.

Также обратите внимание, что в новом варианте полностью удален блок , потому что он не приносит никакой пользы

Дубликаты условных выражений

Еще один вид плохого кода, который мы сегодня обсудим — дубли выражений с оператором , набрызганные по всему коду.

Если сравнивать эту проблему с рассмотренными ранее, то их легко найти и исправить, а эту проблему найти тоже легко, но исправить уже сложнее. Это связано с тем, что найти новое решение можно только основательно погрузившись в задачу.

Каждому из нас приходилось заниматься этим, т.е. многократно пробегать по всему коду вверх-вниз, пытаясь проследить логику. На самом деле, это не такая уж проблема, если нет планов менять код.

Однако, если есть намерение в будущем вносить обновления, то, возможно, есть смысл попробовать другой вид абстракции.

Таблицы истинности

Математическая логика – очень полезная в программировании область знаний. В данном руководстве мы ознакомимся с основными её аспектами.

Ниже представлены таблицы истинности для оператора сравнения == и всех логических операторов. Ими можно пользоваться при написании логических выражений. В таблицах перечислены общие случаи использования оператора, потому их рекомендуется выучить наизусть.

Таблица истинности оператора NOT

Таблицы истинности – общие математические таблицы, которые используются в логике. Их полезно выучить наизусть, чтобы затем применять при построении алгоритмов и написании программ.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector