Операторы сравнения
Содержание:
Содержание
Функция print
Формат вызова:
print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
выводит в файл file значение value, добавляя в конце вывода строку end
элементы value разделены строкой sep. Если flush=True, тогда после
выполнения команды посылается команда очистки буферов ввода/вывода.
value может быть любым объектом python
чаще всего эта функция используется для вывода строковых сообщений.
форматрирование строк
для того, чтобы вывести форматированную строку на экран, нужно использовать строку с символами форматирования:
%s — подстановка строки
%d — подстановка целого числа
%f — подстановка числа с плавающей точкой
Подстановочные аргументы передаются в строку форматирования с помощью оператора %, за которым следует кортеж с постановочными аргументами.
Функция input
Формат вызова:
input(prompt=None, /)
Читает строку со стандартного ввода. Символ перевода строки опускается.
Если prompt указан, то он выводится в стандартный вывод без символа перевода строки.
Если пользователь послал сигнал EOF (*nix: Ctrl-D, Windows: Ctrl-Z-Return), вызывает исключение EOFError. На *nix системах используется библиотека readline, если таковая установлена.
Оператор присваивания
Оператор присваивания в Python, как и во многих других языках программирования это .
Поскольку все в Python объекты, операция присваивания копирует ссылку на объект. Это так в случае изменяемых объектов (), однако для неизменяемых, таких как , происходит создание нового объекта.
While loop
Выражение или цикл «пока» имеет следующий вид:
Цикл выполняется, пока истинно, если условие нарушается, выполняется блок и осуществляется выход из цикла
Пример:
For loop
В питоне цикл используется для прохода всех элементов в последовательности (строка, список, кортеж) или другого итерируемого объекта.
вычисляется один раз; оно должно вернуть итерируемый объект. Suite выполняется каждый раз для каждого элемента из итератора. Каждый элемент итератора в свою очередь присваивается и затем выполняется .
Когда элементы итератора исчерпываются (когда последовательность заканчивается или итератор вызывает исключение), выполняется из ветки и цикл завершается.
Если в теле цикла вызывается , она завершает цикл, без выполнения ветки . в теле цикла пропускает оставшуюся часть кода до новой итерации или до ветки , если новой итерации нет.
Цикл присваивает значения переменным из . Это действие переписывает все предыдущие присваивания переменным, включае те, что были сделаны в теле цикла.
имена из не удаляются по завершении цикла, но если итерируемая последовательность пуста, они не будут инициализированы.
функция возвращает итератор, с помощью которого можно с эмулировать работу цикла в паскале. .
Если мы итерируем по mutable объекту и нам нужно удалять или вставлять туда элементы, то цикл вида:
будет выполняться неверно, поскольку при удалении из списка его размер уменьшится, и в позиции, куда указывает итератор, будет стоять следующий элемент. На следующем шаге позиция итератора снова сдвинется, приведя к тому, что один элемент будет пропущен.
То же касается и вставки.
Выход из решения — создать временную копию списка, например с помощью сечения.
Здесь мы итерировать будем копию списка, а удалять элементы из оригинала.
Операторы¶
Кратко рассмотрим операторы и их применение:
Обратите внимание, вычислить значения выражений, данных в примерах, можно также
используя интерпретатор интерактивно. Например, для проверки выражения
воспользуйтесь интерактивной командной строкой интерпретатора Python:
>>> 2 + 3 5 >>> 3 * 5 15
Операторы и их применение
Оператор
Название
Объяснение
Примеры
Сложение
Суммирует два
объекта
даст ;
даст
Вычитание
Даёт разность
двух чисел;
если первый
операнд
отсутствует,
он считается
равным нулю
даст отрицательное число,
а даст .
Умножение
Даёт
произведение
двух чисел или
возвращает
строку,
повторённую
заданное число
раз.
даст .
даст .
Возведение
в степень
Возвращает
число ,
возведённое в
степень
даст
(т.е. )
Деление
Возвращает
частное от
деления
на
даст .
Целочисленное
деление
Возвращает
неполное
частное от
деления
даст .
даст .
Деление по
модулю
Возвращает
остаток от
деления
даст .
даст .
Сдвиг влево
Сдвигает биты
числа влево на
заданное
количество
позиций. (Любое
число в памяти
компьютера
представлено в
виде битов —
или двоичных
чисел, т.е.
0 и 1)
даст .
В двоичном виде представляет
собой . Сдвиг влево на 2 бита
даёт , что в десятичном
виде означает .
Сдвиг вправо
Сдвигает биты
числа вправо на
заданное число
позиций.
даст .
В двоичном виде представляется
как , что будучи смещённым на
1 бит вправо, даёт , а это, в
свою очередь, не что иное как
десятичное
Побитовое И
Побитовая
операция И над
числами
даёт .
Побитовое ИЛИ
Побитовая
операция ИЛИ
над числами
даёт
Побитовое
ИСКЛЮЧИТЕЛЬНО
ИЛИ
Побитовая
операция
ИСКЛЮЧИТЕЛЬНО
ИЛИ
даёт
Побитовое НЕ
Побитовая
операция НЕ для
числа
соответствует
даёт .
Меньше
Определяет,
верно ли, что
меньше
Все
операторы
сравнения
возвращают
или
.
Обратите
внимание на
заглавные буквы
в этих словах.
даст ,
а даст .
Можно составлять произвольные цепочки
сравнений: даёт .
Больше
Определяет,
верно ли, что
больше
даёт .
Если оба операнда — числа, то перед
сравнением они оба преобразуются к
одинаковому типу. В противном случае
всегда возвращается .
Меньше или
равно
Определяет,
верно ли, что
меньше
или равно
даёт
.
Больше или
равно
Определяет,
верно ли, что
больше
или равно
даёт
.
Равно
Проверяет,
одинаковы ли
объекты
даёт
.
даёт
.
даёт
.
Не равно
Проверяет,
верно ли, что
объекты не
равны
даёт
.
Логическое НЕ
Если
равно ,
оператор вернёт
Если
же равно
,
получим
.
даёт .
Логическое И
даёт ,
если
равно
, в противном
случае
возвращает
значение
возвращает , поскольку x равно
. В этом случае Python не
станет проверять значение , так
как уже знает, что левая часть
выражения ‘and’ равняется ,
что подразумевает, что и всё выражение
в целом будет равно ,
независимо от значений всех остальных
операндов. Это называется укороченной
оценкой булевых (логических) выражений.
Логическое
ИЛИ
Если
равно ,
в результате
получим
, в
противном
случае получим
значение
даёт
. Здесь также может
производиться укороченная оценка
выражений.
Приоритеты операторов
Consider this expression:
>>> 20 + 4 * 10 60
There is ambiguity here. Should Python perform the addition first and then multiply the sum by ? Or should the multiplication be performed first, and the addition of second?
Clearly, since the result is , Python has chosen the latter; if it had chosen the former, the result would be . This is standard algebraic procedure, found universally in virtually all programming languages.
Всем операторам, которые поддерживает язык, присваивается приоритет. В выражении все операторы с наивысшим приоритетом выполняются первыми. Как только эти результаты получены, выполняются операторы следующего наивысшего приоритета. Так продолжается до тех пор, пока выражение не будет полностью оценено. Все операторы с одинаковым приоритетом выполняются в порядке слева направо.
Вот порядок приоритета операторов Python, которые вы видели до сих пор, от низшего к высшему:
Оператор
Описание
низший приоритет
Логическое ИЛИ
Логическое И
Логическое НЕ
, , , , , , ,
сравнения, идентификация
побитовое ИЛИ
побитовое ИСКЛЮЧАЮЩЕЕ ИЛИ
побитовое И
,
битовый сдвиг
,
сложение, вычитание
, , ,
умножение, деление, окруляющее деление, остаток от деления
, ,
плюс, минус, побитовый минус
наивысший приоритет
возведение в степень
Операторы в верхней части таблицы имеют самый низкий приоритет, а операторы в нижней части таблицы имеют самый высокий. Любые операторы в одной строке таблицы имеют одинаковый приоритет.
Понятно, почему умножение выполняется первым в приведенном выше примере: умножение имеет более высокий приоритет, чем сложение.
Аналогично, в приведенном ниже примере сначала возводится в степень , что равно , а затем выполняется умножение в порядок слева направо():
>>> 2 * 3 ** 4 * 5 810
Приоритеты операторов могут быть переопределены с помощью скобок. Выражения в скобках всегда выполняются в первую очередь, перед выражениями, которые не заключены в скобки. Таким образом, происходит следующее:
>>> 20 + 4 * 10 60 >>>(20 + 4) * 10 240
>>> 2 * 3 ** 4 * 5 810 >>> 2 * 3 **(4 * 5) 6973568802
В первом примере сначала вычисляется , затем результат умножается на . Во втором примере сначала вычисляется , затем значение увеличивается до этой степени, а затем результат умножается на .
Нет ничего плохого в том, чтобы свободно использовать круглые скобки, даже если они не нужны для изменения порядка оценки. Фактически, это считается хорошей практикой, потому что это может сделать код более читабельным, и это освобождает читателя от необходимости вызывать Приоритеты операторов из памяти. Учтите следующее:
(a < 10) and(b > 30)
Здесь круглые скобки совершенно не нужны, поскольку операторы сравнения имеют более высокий приоритет, чем , и в любом случае выполнялись бы первыми. Но некоторые могут считать намерение версии в скобках более очевидным, чем эта версия без скобок:
a < 10 and b > 30
С другой стороны, вероятно, есть те, кто предпочел бы последнее; это вопрос личных предпочтений. Дело в том, что вы всегда можете использовать круглые скобки, если считаете, что это делает код более читабельным, даже если в них нет необходимости менять порядок вычислений.
Методы словарей 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 поддерживает дополнительный метод принятия решений, называемую условным выражением. (Он также упоминается как условный оператор или тернарный оператор в различных местах документации Python).
В своей простейшей форме синтаксис условного выражения выглядит следующим образом:
<expr1> if <conditional_expr> else <expr2>
Это отличается от форм операторов , перечисленных выше, потому что это не управляющая структура направляет поток выполнения программы. Он действует скорее как оператор, определяющий выражение. В приведенном выше примере сначала вычисляется . Если истина, то выражение вычисляется как . Если ложь, то выражение вычисляется как .
Обратите внимание на не очевидный порядок: сначала вычисляется среднее выражение, и на основе этого результата возвращается одно из выражений на концах. Вот несколько примеров, которые, надеюсь, помогут прояснить ситуацию:
raining = False print("Let's go to the", 'beach' if not raining else 'library') raining = True print("Let's go to the", 'beach' if not raining else 'library') age = 12 s = 'minor' if age < 21 else 'adult' s 'yes' if ('qux' in ) else 'no'
Примечание: условное выражение Python аналогично синтаксису ? : , используемому многими другими языками-C, Perl и Java. На самом деле, оператор ?: обычно называют тернарным оператором в этих языках, что, вероятно, является причиной того, что условное выражение Python иногда называют тернарным оператором Python.
Обычно условное выражение используется для выбора назначения переменной. Например, предположим, что вы хотите найти большее из двух чисел. Конечно, есть встроенная функция max (), которая делает именно это (и многое другое), что вы могли бы использовать. Но предположим, вы хотите написать свой собственный код с нуля.
Вы можете использовать стандартный оператор с предложением :
if a > b: m = a else: m = b
Но условный оператор короче и, возможно, более читабельнее:
m = a if a > b else b
Не забывайте, что условное выражение ведет себя как синтаксическое выражение. Его можно использовать как часть более длинного выражения. Условное выражение имеет более низкий приоритет, чем практически все остальные операторы, поэтому для его группировки необходимы круглые скобки.
В следующем примере оператор + связывается более плотно, чем условное выражение, поэтому сначала вычисляются +x и y + 2, а затем условное выражение. Скобки во втором случае не нужны и результат не меняется:
x = y = 40 z = 1 + x if x > y else y + 2 z z = (1 + x) if x > y else (y + 2) z
Если вы хотите, чтобы условное выражение было вычислено первым, вам нужно окружить его группирующими скобками. В следующем примере сначала вычисляется (x, если x > y, иначе y). В результате получается y, который равен 40, поэтому присваивается z 1 + 40 + 2 = 43:
x = y = 40 z = 1 + (x if x > y else y) + 2 z
Если вы используете условное выражение как часть более крупного выражения, вероятно, будет хорошей идеей использовать группирующие скобки для уточнения, даже если они не нужны.
Условные выражения также используют оценку короткого замыкания, как и составные логические выражения. Части условного выражения не вычисляются, если в этом нет необходимости.
В выражении , если иначе :
Если <conditional_expr> правда, <expr1> и <expr2> не вычисляется.
Если <conditional_expr> имеет значение false, то возвращается <expr2> и <expr1> не вычисляется.
Вы можете проверить это, используя термины, которые вызвали бы ошибку:
'foo' if True else 1/0 1/0 if False else 'bar'
В обоих случаях условия 1/0 не оцениваются, поэтому никаких исключений не возникнет.
Условные выражения также могут быть объединены вместе, как своего рода альтернативная структура , как показано здесь:
s = ('foo' if (x == 1) else 'bar' if (x == 2) else 'baz' if (x == 3) else 'qux' if (x == 4) else 'quux' ) s
Неясно, имеет ли это какое-либо существенное преимущество перед соответствующим оператором , но это синтаксически правильно для Python.
Битовые операции
Битовые операции работают так же, как и в большинстве других языков. в Python поддерживаются:
& (битовое И),
| (битовое ИЛИ),
^ (битовое ИСКЛЮЧАЮЩЕЕ ИЛИ),
~ (унарный префиксный операнд, инвертирует биты),
<< (битовый сдвиг влево),
>> (битовый сдвиг вправо). Если вы понимаете двоичную систему исчисления и представление чисел в них, то проблем возникнуть не должно.
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 = 5
>>> y = 6
>>> print(x & y)
4
>>> print(x | y)
7
>>> print(x ^ y)
3
>>> print(~x)
-6
>>> print(x<<2)
20
>>> print(x>>2)
1
1 |
$python3 Python3.5.3(default,Sep272018,172539) GCC6.3.020170516on linux Type»help»,»copyright»,»credits»or»license»formore information. >>>x=5 >>>y=6 >>>print(x&y) 4 >>>print(x|y) 7 >>>print(x^y) 3 >>>print(~x) -6 >>>print(x<<2) 20 >>>print(x>>2) 1 |
Оператор цикла for
Следующий и,
наверное, самый часто используемый оператор цикла – это оператор for, который имеет
такой синтаксис:
for <переменная> in <список> :
операторы 1…N
Например,
for x in 1,5,2,4: print(x**2)
выведет в
консоль квадраты соответствующих чисел. Но что, если мы хотим перебрать
значения по порядку в соответствии с правилом:
начальное
значение, шаг, конечное значение
Для этого
используется генератор последовательностей
range(start, stop, step)
Например, если
мы запишем его вот так:
for x in range(1,5,1): print(x)
то в консоли
увидим числа от 1 до 4 с шагом 1. То есть, range генерирует
последовательность в интервале
[1;5)
Последнее
значение не входит в интервал. Если в нашем примере поставить шаг отрицательный
-1, то конечное значение 5 не может быть достигнуто и в этом случае Python возвратит пустую
последовательность:
for x in range(1,5,-1): print(x)
Если нам нужны
числа от 5 до 1, то следует записывать range в таком виде:
for x in range(5,,-1): print(x)
Причем, в range можно записывать
только целые числа, с вещественными он не работает.
Давайте
перепишем нашу программу подсчета суммы
с помощью цикла for, получим:
S= for i in range(1, 1001, 1): S += 1/i print(S)
Здесь весь цикл
записан буквально в одну строчку, а тело цикла состоит из одного оператора –
подсчета суммы ряда.
Вторым примером
рассмотрим задачу вычисления значений линейной функции
Программа будет
выглядеть так:
k = 0.5; b = 2 lst = , 0.1, 0.2, 0.3, 0.4, 0.5 for x in lst: print(x*k+b)
Этот пример
показывает, что для перебора значений счетчика x можно
использовать списки, сформированные ранее в программе. (О списках мы подробнее
будем говорить на последующих занятиях). Здесь же приведем еще один пример:
msg = "Hello World!" for x in msg: print(x)
Он показывает,
что строку можно воспринимать как список и перебирать с помощью цикла for.
Также в цикле for можно
использовать блок else, о котором мы говорили ранее:
for <переменная> in <список> :
операторы 1…N
else:
операторы 1…N
Операторы сравнения
Оператор
Пример
Смысл
Результат
Эквивалентно
если значение равно значению , в противном случае
Не эквивалентно
если не равно и в противном случае
Меньше
если меньше чем , в противном случае
Меньше или равно
если меньше или равно , в противном случае
Больше
если больше , в противном случае
Больше или равно
если больше или равно , в противном случае
Вот примеры используемых операторов сравнения:
>>> a = 10 >>> b = 20 >>> a == b False >>> a != b True >>> a <= b True >>> a >= b False >>> a = 30 >>> b = 30 >>> a == b True >>> a <= b True >>> a >= b True
Операторы сравнения обычно используются в булевых контекстах, таких как условные операторы и операторы цикла, для процессом вычислений, как вы увидите позже.
Равенство для значений с плавающей точкой
Вспомните из более раннего обсуждения , что значение хранится внутри для объекта может быть не совсем таким, как вы думаете. По этой причине не рекомендуется сравнивать значения с плавающей точкой для точного равенства. Рассмотрим этот пример:
>>> x = 1.1 + 2.2 >>> x == 3.3 False
Бабах! Внутренние представления операндов сложения не совсем равны и , поэтому вы не можете полагаться на для точного сравнения с .
Предпочтительным способом определения того, являются ли два значения с плавающей точкой «равными», является вычисление того, находятся ли они близко друг к другу, с учетом некоторого допуска. Посмотрите на этот пример:
>>> tolerance = 0.00001 >>> x = 1.1 + 2.2 >>> abs(x - 3.3) < tolerance True
Функция возвращает абсолютное значение. Если абсолютное значение разности между двумя числами меньше указанного допуска, они достаточно близки друг к другу, чтобы считаться равными.
Приоритеты
В списке приведены операторы и выражения, отсортированные по приоритету выполнения от меньшего к большему.
Операторы в Python и их приоритет выполнения:
- Лямбда выражения.
- Python.
- Булевое ИЛИ.
- Булевое И.
- Булевое НЕ.
- Операторы тождественности, принадлежности, операторы присваивания.
- Битовый ИЛИ.
- Битовый НЕ.
- Битовый И.
- Битовый оператор сдвига битов.
- Сложение и вычитание.
- Умножение и деление, включая операцию получения остатка деления и целого числа.
- Битовое НЕ.
- Возведение в степень.
- Обращение к элементу массива по индексу, слайсинг, обращение к объекту класса, вызов функции с аргументами.
Первый пункт в списке — лямбда-выражение. Lambda expression используется для создания анонимных функций. Лямбда ведет себя как обычная функция, и объявляется в виде
Def (arguments):
return expression
После лямбда-выражения следуют операции, выполняемые тернарным оператором Python.
В конце списка располагаются методы манипуляции массивом и функциями. Обращение к элементу массива по индексу выглядит так:
В рассматриваемом случае а — это массив, i — это индекс элемента.
Слайсинг означает передачу полной копии массива или выборочную последовательность из членов списка. Диапазон желаемых значения указывается в . В качестве аргументов x представляется начало отсчета, y — конец, а z — шаг прохождения по элементам массива при каждой итерации. X по умолчанию обозначает начало списка, y — конец, z равняется единице. Если указать z как отрицательное число, значения списка передаются в обратном порядке с конца к началу.
О
ператоры являются конструкциями, которые могут манипулировать значением операндов. Рассмотрим выражение 4 + 5 = 9. Здесь, 4 и 5 называются операндами и + называется оператором.
Операторы:
Самое первое и самое главное что нужно знать, так это операторы, для сравнения и логические.
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 на нём, оно будет равен .
Логические операторы
Если мы хотим проверить два или более условий за раз, мы можем воспользоваться операторами , или . Вот как они работают:
(логическое И) возвращает истину () только в случае если оба условия по отдельности верны (тоже возвращают ) (логическое ИЛИ) вернет истину в случае, если хотя бы одно из условий верно. (логическое НЕТ) возьмет результат условия и “обратит” его. То есть, если результат условия , то примененный к этому условию вернет и наоборот.
Давайте посмотрим как это работает на примере. Код ниже проверяет, что хотя бы одно число из двух нацело делится на 10 (кончается на 0) и если так, то печатает YES, а если нет, то печатает NO:
Пусть теперь мы хотим проверить, что числа a и b должны быть еще и обязательно больше нуля:
Как видите, мы можем не только использовать и в одном , но и группировать условия скобками для того, чтобы явно обозначить приоритет вычисления условий.
Посмотрим пример с . Пусть мы хотим проверить, что число a — положительное, а число b — неотрицательное.
Это можно проверить вот таким условием:
Кстати, можно было бы и заменить на и код бы работал точно так же.
Операторы else и elif
Теперь вы знаете, как использовать оператор для условного выполнения одного оператора или блока из нескольких операторов. Пришло время выяснить, что еще вы можете сделать.
Иногда вы хотите оценить условие и выбрать один путь, если это истина и указать альтернативный путь, если это не так. Это делается с помощью предложения :
if <expr>: <statement(s)> else: <statement(s)>
Если имеет значение true, то выполняется первый набор, а второй пропускается. Если имеет значение false, то первый набор пропускается, а второй выполняется. В любом случае, выполнение затем возобновляется после второго набора. Оба набора определяются отступом, как описано выше.
В этом примере x меньше 50, поэтому выполняется первый набор (строки 4-5), а второй набор (строки 7-8) пропускается:
x = 20 if x < 50: print('(первый набор)') print('x is small') else: print('(второй набор)') print('x is large')
Здесь, с другой стороны, x больше 50, поэтому первый набор передается, а второй выполняется:
x = 120 if x < 50: print('(первый набор)') print('x is small') else: print('(второй набор)') print('x is large')
Существует также синтаксис для выполнения ветвления, основанный на нескольких альтернативах. Для этого используйте одно или несколько предложений (сокращение от else if). Python вычисляет каждый по очереди и выполняет набор, соответствующий Первому, который является истинным. Если ни одно из выражений не является истиной и указано предложение else
, то выполняется этот набор:
if <expr>: <statement(s)> elif <expr>: <statement(s)> elif <expr>: <statement(s)> ... else: <statement(s)>
Можно указать произвольное количество предложений . Предложение является необязательным. Если есть, то он должен быть указан последним:
name = 'Joe' if name == 'Fred': print('Hello Fred') elif name == 'Xander': print('Hello Xander') elif name == 'Joe': print('Hello Joe') elif name == 'Arnold': print('Hello Arnold') else: print("I don't know who you are!")
По большей мере, будет выполнен один из указанных блоков кода. Если предложение не включено и все условия ложны, то ни один из блоков не будет выполнен.
Примечание: использование длинного ряда может быть немного неудобным, особенно когда действия представляют собой простые операторы, такие как .
Вот одна из возможных альтернатив приведенному выше примеру с использованием метода dict. get() :
names = { 'Fred': 'Hello Fred', 'Xander': 'Hello Xander', 'Joe': 'Hello Joe', 'Arnold': 'Hello Arnold' } print(names.get('Joe', "I don't know who you are!")) print(names.get('Rick', "I don't know who you are!"))
Вспомните из статьи про словари Python, что метод dict. get () ищет в словаре указанный ключ и возвращает соответствующее значение, если оно найдено, или заданное значение по умолчанию, если его нет.
Оператор с предложениями использует оценку короткого замыкания, аналогичную тому, что вы видели с операторами и . Как только одно из выражений оказывается истинным и его блок выполняется, ни одно из оставшихся выражений не проверяется. Это показано ниже:
var # Not defined if 'a' in 'bar': print('foo') elif 1/0: print("This won't happen") elif var: print("This won't either")
Второе выражение содержит деление на ноль, а третье ссылается на неопределенную переменную var. Любой из них вызовет ошибку, но ни один из них не будет вычислен, поскольку первое указанное условие истинно.
Ввод данных и преобразования типов
На прошлом занятии мы научились выводить данные с помощью функции . Например, чтобы вывести число 5 на экран нужно написать в интерпретаторе , и он сделает свое дело.
Но что, если нужно что-то ввести в программу из внешнего мира? Например, если наш самописный калькулятор умеет складывать 2 числа и выводить ответ, то как ввести эти самые 2 числа? На помощь придет функция . Попробуем написать вышеописанный калькулятор.
Как видно из примера, что-то пошло не так. Вместо заветных 46 после сложения 12 и 34 мы получили 1234. Все дело в типах данных. Функция всегда считывает данные в виде строки. Так и в примере она считала 12 и 34 как 2 строки и просто «слепила» их вместе. Мы же хотим складывать числа. Чтобы все работало хорошо, нужно выполнить преобразование типов данных.
В данном случае можно сделать вот так:
То, чего мы и хотели.
Преобразовывать можно не только строку в целое число, но и наоборот. Вот несколько допустимых преобразований:
Как вы уже поняли, чтобы преобразовать что-то во что-то, надо взять и вызвать функцию, совпадающую по имени с названием типа данных. В нашем примере это , и .
Операторы сравнения
В программировании операторы сравнения используются при оценке и сравнении значений для последующего сведения их к одному логическому значению (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
Понятие об операторе if statement
Данное выступление посвящено оператору как показателю плохого кода (code smell). Начну с того, что не собираюсь ругать ничей код. Просто хочу поделиться опытом, благодаря которому могу использовать схему написания немного более понятного и подходящего для тестов кода.
Итак, что такое оператор . Это элемент языка программирования, который помогает нам контролировать, какие выражения следует исполнять.
Обычно, когда мы запускаем программу, она исполняется сверху вниз построчно. Когда она добирается до условного оператора, то, если условие выполняется (то есть, оно дает ответ ), находящийся под ним блок кода исполняется. Если условие не выполняется (оно дает ответ ), то этот блок кода пропускается, и программа продолжает исполнение, как будто его вообще не существует.
Давайте перейдем к конкретике. Вот немножко питона.
Наш код проверяет будет ли переменная равна дню рождения пользователя. Если условие выполняется, мы выводим (print) сообщение с поздравлением. Если нет, то пропускаем его и продолжаем исполнение программы, как будто этого кода не существует.
С помощью оператора у нас есть возможность давать компьютеру указания о том, что следует делать при выполнении заданного условия. Соединив условные операторы в цепочку, можно выполнить любую задачу. Это очень сильная концепция. Не зря условные операторы стали фундаментальным строительным блоком в большинстве языков программирования.
Заключение
Давайте кратко повторим изученный материал. Мы можем использовать выражения с оператором для решения любых задач. Однако если их становится слишком много, то код станет трудно читать и еще труднее обновить.
Мы рассмотрели процесс рефакторинга дублирующихся условных выражений в полиморфные классы, состоящий из пяти этапов: 1. Определить дублирующиеся условные блоки. 2. Определить функционал каждого блока кода. 3. Создать базовый класс для моделирования. 4. Вывести функционал условных блоков в дочерние классы. 5. Обновить код для реализации процесса.
Мы помним, что нужно определиться с наличием реальной необходимости в рефакторинге.