Числа и строки
Числа
- массив 2³⁰-ричных цифр (не 2³¹ из-за особенностей аппаратных платформ; на некоторых платформах используются 2¹⁵-ричные цифры)
- заранее заданные -5…256
- -2³⁰…2³⁰ — обычные целые
Вычисления в рациональных числах с помощью decimal и fractions
Про math
Про функцию atan2(y, x) (= arctg y/x) — см. Atan2:
область значений arctg — -π/2 … π/2, как ни крути, т. е. из atan2(θ) получить угол нельзя; а из координат вектора — можно!
Больше математики!
Датасатанизм: Pandas, TensorFlow, scikit-learn
Псевдослучайные числа
для «настоящей» случайности есть secrets, а также os.getrandom random()/randrange()
Управление датчиком: seed(), getstate()
- Воспроизводимость псевдослучайной последовательности
1 >>> seed(100500) 2 >>> [randrange(10) for i in range(20)] 3 [8, 6, 2, 0, 2, 3, 8, 8, 8, 1, 7, 8, 1, 3, 4, 0, 3, 4, 4, 0] 4 >>> [randrange(10) for i in range(20)] 5 [5, 7, 4, 3, 0, 9, 4, 3, 2, 2, 1, 8, 4, 3, 2, 5, 5, 2, 5, 2] 6 >>> [randrange(10) for i in range(20)] 7 [6, 6, 6, 4, 9, 6, 9, 0, 6, 4, 4, 6, 1, 0, 8, 3, 7, 8, 6, 7] 8 >>> seed(100500) 9 >>> [randrange(10) for i in range(20)] 10 [8, 6, 2, 0, 2, 3, 8, 8, 8, 1, 7, 8, 1, 3, 4, 0, 3, 4, 4, 0] 11 >>> [randrange(10) for i in range(20)] 12 [5, 7, 4, 3, 0, 9, 4, 3, 2, 2, 1, 8, 4, 3, 2, 5, 5, 2, 5, 2] 13 >>> [randrange(10) for i in range(20)] 14 [6, 6, 6, 4, 9, 6, 9, 0, 6, 4, 4, 6, 1, 0, 8, 3, 7, 8, 6, 7] 15 >>> [randrange(10) for i in range(20)] 16 [0, 2, 3, 6, 2, 1, 6, 3, 5, 8, 5, 6, 5, 7, 3, 1, 0, 6, 3, 5] 17
choice()/shuffle() простые
sample() (без повторений)
choices() похитрее
1 >>> def two(s): 2 print(s, sorted(s), sep="\n") 3 >>> two(choices(range(1, 5), k=20)) # Равные веса 4 [4, 4, 3, 2, 2, 4, 3, 4, 4, 4, 1, 1, 3, 2, 1, 4, 3, 3, 1, 2] 5 [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4] 6 >>> two(choices(range(1, 5), range(1, 5), k=20)) # Чем больше, тем вероятнее 7 [3, 2, 4, 4, 3, 2, 3, 3, 4, 1, 3, 4, 4, 3, 4, 4, 4, 4, 4, 2] 8 [1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] 9 >>> two(choices(range(1, 5), cum_weights=range(1, 5), k=20)) # Равные кумулятивные веса 10 [1, 1, 2, 3, 1, 2, 3, 1, 4, 3, 4, 1, 3, 3, 2, 4, 4, 1, 2, 4] 11 [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4] 12 >>> two(choices(range(1, 5), cum_weights=[1, 2, 5, 6], k=20)) # 3 в три раза чаще 13 [2, 1, 1, 3, 1, 2, 3, 3, 1, 3, 3, 2, 4, 4, 2, 3, 4, 3, 3, 1] 14 [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4] 15 >>> two(choices("aoenlt", (2, 2, 2, 1, 1, 1), k=17)) 16 ['t', 'n', 'a', 'l', 'a', 'a', 'a', 'n', 'e', 'e', 'e', 'o', 'o', 'e', 'o', 'a', 't'] 17 ['a', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e', 'l', 'n', 'n', 'o', 'o', 'o', 't', 't'] 18
Строки
- Внутреннее unicode-представление
- Ещё более внутреннее — переход от ASCII в Unicode и обратно, но нам этого не видно!
- На самом деле видно:
1 >>> import sys 2 >>> a ="qwerty" 3 >>> print(len(a), sys.getsizeof(a)) 4 6 55 5 >>> b = a + "!" 6 >>> print(len(b), sys.getsizeof(b)) 7 7 56 8 >>> b = a + "SDF" 9 >>> print(len(b), sys.getsizeof(b)) 10 9 58 11 >>> b = a + "ы" 12 >>> print(len(b), sys.getsizeof(b)) 13 7 88 14 >>> b = a + "ыы" 15 >>> print(len(b), sys.getsizeof(b)) 16 8 90 17
4 способа задания строк («'», «"», «'''» и «"""»)
- строки как последовательности: особенности:
Строка — это последовательность строк
a[5] === a[5:6] (так ли это?
)
- Поиск подстроки: "asd" in "qwasdgfh"
линейный
Алгоритм Кнута — Морриса — Пратта
Строковые методы
endswith(), startswith(),
find(), index(), count(),
isalnum(), isalpha(), isdecimal(), isdigit(), isidentifier(), islower(), isnumeric(), isprintable(), isspace(), istitle(), isupper(),
center(), rjust(), ljust(),
lower(), upper(), swapcase(), title(), capitalize(), casefold(),
replace(),
strip(), expandtabs(), removeprefix(), removesuffix()
zfill(),
rfind(), rindex(), rpartition(), rsplit(), rstrip(), lstrip(),
split() и join()
split(), splitlines(), join()
Форматные строки
Общий формат: f"…{выражение}…"
- Типизация и форматирование по ширине
- Плюшки
Хитрое форматирование f / g / e / …
f"{выражение=}"
- Выравнивание и заполнители:
Вложенные {}:
- …
Метод .format(*args, **kwargs) (например, в случае, когда строка предварительно формируется)
Автонумерация args с помощью "{}" или явная нумерация {0}, {1}
kwargs как пространство имён
Lecacy "строка-с-%" % последовательность (похожая на Си)
Syntactic formalization of f-strings
Например (посчитайте кавычки!): тут: a="QQQ"; print(f"{a + "!"}")
Спецсимволы и необработанные строки
Зачем нужны спецсимволы
\b, \t, \b, \r; \uчисло, … остальное
- '\u2713'
r"..." — вариант без спецсимволов
Шаблоны
T-строки — это вообще не строки, это шаблоны
- Синтаксис — такой же, как у f-строк
Результат — объект типа string.templatelib.Template
- Содержит:
- Строки
Значения выражений в {}
- Способ представления и формат выражений
А потом сам форматируй!
- Заодно можно проверить допустимость значений
- ⇒ более безопасный ввод
- ⇒ операции над шаблонами
Примерно так:
1 from string.templatelib import Template, Interpolation, convert
2
3 def render(template: Template) -> str:
4 parts = []
5 for part in template:
6 if isinstance(part, Interpolation):
7 value = convert(part.value, part.conversion)
8 formatted_value = format(value, part.format_spec)
9 parts.append(formatted_value)
10 else:
11 parts.append(part)
12 return "".join(parts)
Д/З
Во всех домашних заданиях нашего курса используются только стандартные модули Python.
Прочитать и прощёлкать про строки в учебнике, в документации, а также про форматирование строк в учебнике и в документации.
EJudge: AlmostRandom 'Почти случайное'
Input:Написать функцию divrandom(a, b, s, p), принимающую четыре целых ненулевых параметра. Функция должна возвращать случайно выбранное целое число, не кратное p, из диапазона от a до b (включительно; таким образом диапазоны a…b и b…a одинаковы и допустимы) с шагом s. Если такое число выбрать невозможно, функция возвращает 0.
Output:1 print(divrandom(10, 21, 5, 2))15
EJudge: ArbitPrec 'Произвольная точность'
Input:Вводится две строки: произвольная функция над x, содержащая операции, применимые к типу decimal.Decimal, имеющая единственный корень на интервале (-1.5, 1.5), непрерывная на нём и принимающая значения разных знаков на концах интервала, и натуральное число D. Вывести корень данной функции с точностью ровно D знаков после запятой (нули тоже выводятся). Воспользоваться десятичным контекстом для задания точности (см. примеры выше на странице документации).
Output:1+x*3 20
-0.33333333333333333333
EJudge: ConvexPolygon 'Выпуклый мнгогоугольник'
Input:Ввести построчно 300 ⩾ N > 2 пар целых чисел, разделённых запятой (ввод оканчивается пустой строкой). Считая пары координатами точек, проверить, могут ли эти точки в определённом порядке быть вершинами выпуклого N-угольника. Вывести True, если могут, или False, если нет.
Output:71, -93 19, -77 113, 0 -87, -10 -65, -28 132, -110 -8, -63 -27, 47 87, 15 170, -34 34, 30
True
EJudge: DrawSquare 'Рисуем квадраты'
Input:Написать функцию squares(w,h,(X,Y,s,c),...) со следующими параметрами: w и h — ширина и высота «экрана», за которыми следуют 0 или больше 4-элементных последовательностей вида (X,Y,s,c), где X и Y — координаты левого верхнего угла квадрата, s — длина его стороны (не меньше 1), а c — символ которым он заполняется на экране. Функция должна выводить прямоугольник из h×w точек, на котором соответствующими символами «нарисованы» квадраты соответствующих размеров в соответствующих местах. Координаты левого верхнего угла поля — 0,0; координаты растут вправо вниз. Проверять, что квадраты не выходят за границы поля, не надо.
Output:squares(20,23,(1,1,5,'@'), (2,3,1,'!'), (4,5,11,'#'), (8,11,9,'/'))
.................... .@@@@@.............. .@@@@@.............. .@!@@@.............. .@@@@@.............. .@@@###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ......../////////... ......../////////... ......../////////... ......../////////... .................... .................... ....................
