Числа и строки
Числа
Больше математики!
Датасатанизм: Pandas, TensorFlow, scikit-learn
Псевдослучайные числа
random (и 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"..." — вариант без спецсимволов
Д/З
Во всех домашних заданиях нашего курса используются только стандартные модули Python.
Прочитать и прощёлкать про строки в учебнике, в документации, а также про форматирование строк в учебнике и в документации.
EJudge: TriangleSquare 'Площадь треугольника'
Ввести через запятую шесть чисел: x1, y1, x2, y2, x3, y3 и вывести точное значение площади треугольника (x1, y1), (x2, y2), (x3, y3). Обратите внимание на то, что числа могут быть как целые, так и с фиксированной точкой, а количество пробелов-разделителей между числами не определено.
1.1, 1, 6,4 , 8, 2
7.9
EJudge: TrimImage 'Обрезать картинку'
Вводятся строки, содержащие четыре целых числа и символ, разделённые пробелами. Код символа 33 ⩽ c ⩽ 127. Это абсцисса, ордината (ось ординат направлена вниз) некоторых точек, а также длина и ширина построенных на них прямоугольников, «нарисованных» с помощью указанных символов. Последняя строка пустая. Вывести наименьшую область, содержащую все раскрашенные точки, нарисованные в порядке ввода прямоугольников. Область также прямоугольна и изначально заполнена символами '.'. Координаты и размеры могут быть отрицательны или равны нулю. В случае отрицательного размера прямоугольник откладывается от исходной точки в противоположную сторону, а сама точка в него не попадает.
1 2 10 10 * -2 -1 10 10 # 3 4 -10 10 @ 5 6 10 -10 %
............%%%%%%%%%% ............%%%%%%%%%% ............%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% @@@@@@@@@@##%%%%%%%%%% @@@@@@@@@@##%%%%%%%%%% @@@@@@@@@@#####***.... @@@@@@@@@@#####***.... @@@@@@@@@@#####***.... @@@@@@@@@@********.... @@@@@@@@@@********.... @@@@@@@@@@********.... @@@@@@@@@@............ @@@@@@@@@@............
EJudge: RandBitsm 'Случайное с битами'
Написать функцию randbits(a, b, n), параметры которой — натуральные числа, причём a меньше b. Функция должна возвращать случайное натуральное число из диапазона от a до b включительно, в двоичном представлении которого присутствует ровно n единиц. Если таких чисел нет, возвращается 0.
- Тесты будут проверять статистическую корректность и быстродействие, пример ниже в них не входит; он приведён только для понятности.
1 print(*[randbits(2, 66, i) for i in range(1, 10)])
4 40 25 15 55 63 0 0 0
EJudge: PascalTriangle 'Треугольник Паскаля'
Написать функцию pastri(n, filler), которая возвращает строку, содержащую Треугольник Паскаля из n уровней, используя строку filler из одного символа в качестве разделителя. Строки треугольника должны быть выравнены по центру, а если это невозможно, в начале строки должно быть на один разделитель меньше. Лишних разделителей в конце строки быть не должно.
_______1________ ______1_1_______ _____1_2_1______ ____1_3_3_1_____ ___1_4_6_4_1____ _1_5_10_10_5_1__ 1_6_15_20_15_6_1 _________1_________ ________1_1________ _______1_2_1_______ ______1_3_3_1______ _____1_4_6_4_1_____ ___1_5_10_10_5_1___ _1_6_15_20_15_6_1__ 1_7_21_35_35_21_7_1