Лекция 2
Лекция 2¶
Сравнение чисел и не только.¶
Можно почитать тут.
In [ ]:
11 > 11
Out[ ]:
In [ ]:
11 >= 11
Out[ ]:
In [ ]:
11 < 11
Out[ ]:
In [ ]:
11 <= 11
Out[ ]:
In [ ]:
11 == 11
Out[ ]:
In [ ]:
11 != 11
Out[ ]:
In [ ]:
var = 5 > 3
var
Out[ ]:
In [ ]:
5.0 > 5
Out[ ]:
In [ ]:
5.0 >= 5
Out[ ]:
In [ ]:
In [ ]:
True + 1
Out[ ]:
In [ ]:
False + 1
Out[ ]:
In [ ]:
True + True
Out[ ]:
In [ ]:
False + False
Out[ ]:
In [ ]:
In [ ]:
var_complex_1 = 1 + 1j
var_complex_2 = 2 + 2j
In [ ]:
var_complex_1 == var_complex_2
Out[ ]:
In [ ]:
var_complex_1 != var_complex_1
Out[ ]:
In [ ]:
var_complex_2 >= var_complex_1 # тут будет ошибка :(
In [ ]:
А что с буквами и словами?
Строки сравниваются по лексикографическому порядку — как в словаре, но с учетом ASCII / Unicode кодов.
In [ ]:
'y' > 'a'
Out[ ]:
In [ ]:
'a' > 'c'
Out[ ]:
In [ ]:
'A' < 'a'
Out[ ]:
In [ ]:
'ab' >= 'ab'
Out[ ]:
In [ ]:
'ab' >= 'abc'
Out[ ]:
In [ ]:
'15' > '3' # как так? :)
Out[ ]:
In [ ]:
In [ ]:
't' > 'c'
Out[ ]:
In [ ]:
't' > 'tc'
Out[ ]:
In [ ]:
print("apple" < "banana") # True (a < b)
print("cat" < "dog") # True (c < d)
print("abc" < "abd") # True (c < d)
print("abc" < "abcd") # True (более короткая строка меньше)
print("10" < "2") # True (1 < 2 в лексикографическом порядке)
In [ ]:
'''
Сравнение работает следующим образом:
Сравниваются первые символы строк
Если они разные - определяется какая строка "больше" или "меньше" на основе кодов символов
Если первые символы одинаковые - переходим к следующим символам
Если одна строка заканчивается, а другая нет - более короткая строка считается "меньшей"
''';
In [ ]:
print(len("apple") < len("banana")) # False (5 < 6)
In [ ]:
In [ ]:
# Списки
print([1, 2, 3] < [1, 2, 4]) # True
print([1, 2] < [1, 2, 3]) # True (короче значит меньше)
# Кортежи
print((1, 2) == (1, 2)) # True
print((1, 2, 3) > (1, 2)) # True
# Строки (посимвольно)
print("abc" < "abd") # True
In [ ]:
In [ ]:
# В современных версиях Python (3.7+) словари можно сравнивать только на равенство:
dict1 = {"a": 1, "b": 2}
dict2 = {"a": 1, "b": 2}
dict3 = {"b": 2, "a": 1}
print(dict1 == dict2) # True
print(dict1 == dict3) # True (порядок не важен для равенства)
# А вот это не работает:
# print(dict1 > dict2) # TypeError!
In [ ]:
'''
# В Python 3.6 это работало:
dict1 = {'a': 1, 'b': 2}
dict2 = {'a': 1, 'b': 3}
print(dict1 < dict2) # True (сравнение по содержимому)
print(dict1 > dict2) # False
''';
In [ ]:
# Но если нужно сравнивать элементы словарей, то вот:
'''
# Сравнение по ключам
sorted(dict1.keys()) < sorted(dict2.keys())
# Сравнение по значениям
sorted(dict1.values()) < sorted(dict2.values())
# Или написать свою функцию сравнения
''';
In [ ]:
In [ ]:
# Тут нужно быть очень внимательными.
# Кажется, что должно быть True, но...
print(0.1 + 0.2 == 0.3) # False!
# Причина: неточность представления
print(0.1 + 0.2) # 0.30000000000000004
# Правильный способ сравнения
import math
def almost_equal(a, b, tolerance=1e-9):
return abs(a - b) < tolerance
print(almost_equal(0.1 + 0.2, 0.3)) # True
In [ ]:
In [ ]:
# Python 3 строже своего предшественника:
# В Python 3 это вызовет ошибку:
try:
print(5 > "hello")
except TypeError as e:
print(f"Ошибка: {e}")
# Но равенство разных типов всегда False
print(5 == "5") # False
print([] == 0) # False
print(None == 0) # False
In [ ]:
Логические операторы.¶
In [ ]:
# Логическое И
x = True
y = False
print(x and y) # False (оба должны быть True)
In [ ]:
# Логическое И
x = True
y = True
print(x and y) # False (оба должны быть True)
In [ ]:
In [ ]:
# Логическое ИЛИ
x = True
y = False
print(x or y) # True (хотя бы один True)
In [ ]:
# Логическое ИЛИ
x = False
y = False
print(x or y) # True (хотя бы один True)
In [ ]:
In [ ]:
# Логическое НЕ
x = True
print(not x) # False
In [ ]:
# Логическое НЕ
x = False
print(not x) # False
In [ ]:
In [ ]:
# Ленивое вычисление
# short-circuit evaluation
# вычисления по короткой схеме # вычисления Маккарти
Ссылка на Вики.
In [ ]:
print('hello') # просто пример функции, функция может быть любой
In [ ]:
# and: если первый операнд False, второй не вычисляется
False and print('hello')
Out[ ]:
In [ ]:
# and: если первый операнд False, второй не вычисляется
True and print('hello')
In [ ]:
# or: если первый операнд True, второй не вычисляется
True or print('hello')
Out[ ]:
In [ ]:
# or: если первый операнд True, второй не вычисляется
False or print('hello')
In [ ]:
In [ ]:
print('hello') and print('hello')
In [ ]:
print('hello') or print('hello')
In [ ]:
# and возвращает последний True или первый False
print(5 and 3) # 3
print(0 and 3) # 0
# or возвращает первый True или последний False
print(5 or 3) # 5
print(0 or 3) # 3
print(0 or False) # False
In [ ]:
In [ ]:
age = 25
name = "Anna"
if age >= 18 and name: # оба условия True
print("Доступ разрешен")
if not name: # если name пустая строка/None
print("Имя не указано")
In [ ]:
In [ ]:
my_list = [1, 2, 3]
if my_list:
print(my_list)
else:
print(None)
In [ ]:
my_list = []
if my_list:
print(my_list)
else:
print(None)
In [ ]:
In [ ]:
# Можно заполнять значения по умолчанию
config = None
# Если config не None, используем его, иначе создаем новый
var = config or {1, 2, 3}
var
Out[ ]:
In [ ]:
# Можно заполнять значения по умолчанию
config = [1, 2, 3, 4, 5]
# Если config не None, используем его, иначе создаем новый
var = config or {1, 2, 3}
var
Out[ ]:
In [ ]:
In [ ]:
x = 10
y = 20
if (x > 5 and y < 30) or not x:
print("Условие выполнено")
In [ ]:
Про приоритеты рекомендуем прочитать тут.
По всем операторам, а не только по сравнению.
In [ ]:
'''
Приоритет операторов:
not - высший приоритет
and - средний
or - низший
''';
In [ ]:
x = y = z = 1
# Эквивалентные выражения:
result = not x and y or z
print(result)
result = ((not x) and y) or z
print(result)
Важно: Используйте скобки для явного указания порядка вычислений, если есть сомнения!
In [ ]:
x = 5
y = 3
print(x, y)
y, x = x, y
print(x, y)
# Сможете ли вы сделать тоже самое в C / C++? так быстро и удобно :)
In [ ]:
Коллекции.¶
In [ ]:
my_list = [-5, 0, 9, 2.1, 1+1j, 'string', True]
my_list
Out[ ]:
О методах списков написано здесь.
In [ ]:
my_list.append(False)
In [ ]:
my_list
Out[ ]:
In [ ]:
var = my_list.append('False')
var
In [ ]:
print(var)
In [ ]:
my_list
Out[ ]:
In [ ]:
my_list.append([-1, -2])
In [ ]:
my_list
Out[ ]:
In [ ]:
my_list = [1, 2, 3, 4, 5]
my_list
Out[ ]:
In [ ]:
my_list.append([1, 2, 3, 4, 5])
In [ ]:
my_list
Out[ ]:
In [ ]:
my_list[5]
Out[ ]:
In [ ]:
my_list[5][0]
Out[ ]:
In [ ]:
my_list = [1, 2, 3, 4, 5]
my_list
Out[ ]:
In [ ]:
my_list.append(my_list)
In [ ]:
my_list
Out[ ]:
In [ ]:
my_list[5]
Out[ ]:
In [ ]:
my_list[5][5]
Out[ ]:
In [ ]:
my_list[5][5][5]
Out[ ]:
In [ ]:
In [ ]:
my_list = [1, 2, 3, 4, 5]
my_list
Out[ ]:
In [ ]:
my_list.clear()
In [ ]:
my_list
Out[ ]:
In [ ]:
In [ ]:
my_list = [1, 2, 3, 4, 5]
my_list
Out[ ]:
In [ ]:
my_list_2 = my_list
my_list_2
Out[ ]:
In [ ]:
my_list_3 = my_list.copy()
my_list_3
Out[ ]:
In [ ]:
my_list.append('hello :)')
In [ ]:
print(my_list)
print(my_list_2)
print(my_list_3)
# Почему это так? Есть предположения?
# Узнаете на следующих лекциях ;)
In [ ]:
In [ ]:
my_list = [1, 2, 1, 'a', 'b', 'b']
my_list
Out[ ]:
In [ ]:
my_list.count(7)
Out[ ]:
In [ ]:
my_list.count(1)
Out[ ]:
In [ ]:
my_list.count('b')
Out[ ]:
In [ ]:
In [ ]:
my_list = [1, 2, 3]
my_list
Out[ ]:
In [ ]:
my_list.append(5)
In [ ]:
my_list
Out[ ]:
In [ ]:
my_list.append(6, 7) # печалька...
In [ ]:
my_list.append((6, 7))
In [ ]:
my_list
Out[ ]:
In [ ]:
my_list.extend([6, 7])
In [ ]:
my_list
Out[ ]:
In [ ]:
my_list.extend((8, 9))
In [ ]:
my_list
Out[ ]:
In [ ]:
In [ ]:
my_list = [1, 2, 1, 'a', 'b', 'b']
my_list
Out[ ]:
In [ ]:
my_list.index(1)
Out[ ]:
In [ ]:
my_list.index(2)
Out[ ]:
In [ ]:
my_list.index('b')
Out[ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]: