Модель данных Python
синтаксис, операторы и др.
Сегодня поговорим об этом:
Что такое тип данных?
“Переменная” в Python
Тип переменной определяется её текущим значением во время присваивания.
Типы, тоже являются объектами, тип которых - просто "тип".
Типы и утиная типизация
x = 1 # создается объект типа int со значением 1.
# объекту присваивается id. Переменная x ссылается на этот объект
# если объект по данному id изменит значение, то значение изменит и x, который ссылается на значение
print(x, type(x)) # 1 <class 'int'>
x = x * 1.5
print(x, type(x)) # 1.5 <class 'float'>
x = str(x)
print(x, type(x)) # 1.5 <class 'str'>
print(type(type(x))) # <class 'type'>
Присваивание
Если оператор присваивания используется для одиночных объектов, то его общая форма имеет вид:
label = object
где:
Типы делятся на изменяемые и неизменяемые
Целые - <class 'int'>
В Python 3 тип int неограниченной разрядности, а внутреннее представление зависит от величины числа.
x = 10**50
print(x, type(x))
print(x+1) # вычисления происходят без потери точности
print(5+3, 5*3, 5**3, 5-3, 3-5, 3**5) # обычная арифметика
print(5&3, 5|3, 5^3, ~5, 5<<3, 5>>3) # битовые операции
print(5//3, 5%3) # целочисленное деление, остаток от деления
print(5/3) # деление без остатка: если результат дробный, получаем вещественное число при выполнении этой операции
Целочисленные литералы
# Системы счисления
# 2-, 8-, 10- и 16-ричные литералы
print(0b11001100, 0o314, 204, 0xCC) # 204 204 204 204
# строковые представления
print(bin(204), oct(204), str(204), hex(204))# 0b11001100 0o314 204 0xcc
Вещественные - <class 'float'>
64-разрядные вещественные числа "двойной точности" (они же - double в языках семейства Си)
# фиксированная точка (внутреннее представление всё равно плавающее)
print(1., .1, 1.1) # 1.0 0.1 1.1
# экспоненциальная запись
print(.1e1, 1e-1, 1.1e0) # 1.0 0.1 1.1
# числа можно возводить в дробную степень
print(5.+.3, 5.-.3, 5.*.3, 5.**.3) # 5.3 4.7 1.5 1.6206565966927624
# деление без остатка, деление нацело и остаток от деления!
print(5./.3, 5.//.3, 5.%.3) # 16.666666666666668 16.0 0.20000000000000018
# как получить целую и дробную части числа?
print(123.45//1, 123.45%1) # 123.0 0.45000000000000284
Про точность
import sys
print(sys.float_info)
print(sys.float_info.max_10_exp)
print(sys.float_info.epsilon)
sys.float_info(
max=1.7976931348623157e+308,
max_10_exp=308,
min=2.2250738585072014e-308,
min_10_exp=-307,
epsilon=2.220446049250313e-16
)
Шпаргалка по операциям
Логический тип данных - <class 'bool'>
Bool содержит только два значения - True и False.
Операции and, or, not - ленивые.
print(True and False, True or False, not True) # False True False
print(True ^ False, True != False, True == False) # исключающее или, не равно, равно
print(True & False, True | False) # и, или
Сравнения
print(7 > 6) #строго больше
print(7 < 6)
print(7 < 7)
print(7 <= 7) #меньше или равно
print(6 >= 7)
print(6 != 7)
print(6 == 7)
a = 6
b = 9
print('max:', a if a > b else b) # Тернарный оператор
print (6 is a)
print (7 is not a)
Равенство и идентичность
Для проверки двух объектов в Python на “одинаковость” есть 2 метода:
В чем разница?
i, j = 100, 100 # маленькие числа
print('ints:', i == j, i is j, id(i), id(j)) # и равны, и идентичны (is сравнивает идентификаторы)
# >>> ints: True True 4531811472 4531811472
x, y = 10**100, 10**100 # большие числа
print('big ints:', x == y, x is y, id(x), id(y)) # равны, но не идентичны
# big ints: True False 4576818352 4576818496
Пустой тип - <class 'NoneType'>
Тип с названием NoneType и единственным значением None. Предназначен для указания отсутствия значений. Это аналог сишного типа void, но более полезный.
print(None) # None
print(type(None)) # <class 'NoneType'>
x = None
y = 123
print(x == None, x is None, x is not None) # True True False
print(y == None, y is None, y is not None) # False False True
Еще про bool
print('bool from pos int is ', bool(5)) # True
print('bool from zero is ', bool(0)) # False
print('bool from empty str is ', bool('')) # False
print('bool from empty list is ', bool([])) # False
print(True is 1) # False
print(True == 1) # True
print(True + False) # 1
print(True / False) # ZeroDivisionError: division by zero
Строки - <class 'str'>
Питон предоставляет много удобных средств для работы со строками.
В Python 3 два типа:
print(type('hello'), type(b'hello')) # префикс b - "байтовая строка"
print("hello 'stroke' inside") # одинарные и двойные кавычки идентичны, они позволяют не делать лишних экранирований
print('hello "quotes" inside')
print('hello \'stroke\' and "quotes" together, unicode char \u1234 or ascii char \x7E') # если сильно хочется экранирований…
# hello 'stroke' and "quotes" together, unicode char ሴ or ascii char ~
Многострочные тексты приведение к str
print('''First line
second line
third line
''')
print("""Первая строка
вторая строка
третья строка
""")
print(str(1 + 2j))
print(str(0x1234)) # число было записано в 16-ричном виде, но будет выведено в десятичном
Базовые операции со строками
s1 = 'I '
s2 = 'Love '
s3 = 'Python'
s4 = '\n'
some_str = s1 + s2 + s3 + s4
print(some_str * 5)
"""I Love Python
I Love Python
I Love Python
I Love Python
I Love Python"""
Перерыв
Ветвления
x = 0
print(x or 'default') # default
print(x and 'finally') # 0
print('one' if x == 1 else 'two' if x == 2 else 'otherwise') # otherwise
Условный оператор
x = 10
if x < 0:
print('negative')
else:
if x > 100:
print('out of range')
else:
if x < 50:
print('small')
else:
print('large')
Сократим PEP8
x = 10
if x < 0:
print('negative')
elif x > 100:
print('out of range')
elif x < 50:
print('small')
else:
print('large')
Про обязательность часть
x = 0
# ветка else необязательна
if x > 0:
print('then')
print('going on')
# ветка then - обязательна. Если там ничего нет, используем пустой стейтмент
if x < 0:
pass
else:
print('else')
print('going on')
Почему нет switch-case
x = 2*2-1 # запомним результат вычислений в переменную
# и далее - лесенка сравнений
if x==1:
print('one')
elif x==2:
print('two')
elif x==3:
print('three')
else:
print('unexpected')
Еще один вариант замены будет позже
Цикл с проверкой условия while
x = 100500
sum_of_digits = 0
while x != 0:
sum_of_digits += x % 10
x //= 10
print("сумма цифр равна", sum_of_digits)
# сумма цифр равна 6
Цикл с перебором значений for
for i in range(5): # в диапазоне [0,5)
print(i)
for c in 'abcde': #проходим по итерируемому объекту
print(c)
# Если нужен цикл, в котором есть индексы, - используется коллекция enumerate
for i, c in enumerate('abcde'):
print(i, c)
Ветка else
while CONDITION:
BODY
else: # если вышли по условию (а не по break)
FINISH
for VAR in DATASET:
BODY
else: # если исчерпали данные
FINISH
Ввод данных input()
Читаем строку из стандартного потока ввода (stdin) - т.е. из консоли.
line = input('введите любое число: ')
print(type(line)) # str - да, там строка
n = int(line) # понадеемся, что эту строку можно превратить в целое число
print('следующее число', n+1)
Решим задачку
Входные данные
На ввод подается 2 координаты точки на плоскости (каждая с новой строки) (сначала x - координата, затем – y -координата).
Выходные данные
Программа должна вывести слово 'YES', если точка попала в заштрихованную область, и слово 'NO', если не попала.
Решение
x = float(input())
y = float(input())
if x < 1 and y > 1-x and (y > 2 * x**2 or x > 0):
print("YES")
else:
print("NO")
Домашнее задание
Полезные ссылки