Числа и строки
Числа
Больше математики!
Датасатанизм: 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 >>> choices(range(10,100), [1]*90, k=20) # равные веса 2 [94, 50, 52, 78, 38, 95, 22, 18, 24, 32, 25, 92, 48, 42, 62, 49, 97, 95, 55, 59] 3 >>> choices(range(10,100), range(90,0,-1), k=20) # малые числа тяжелее 4 [20, 18, 45, 85, 45, 41, 30, 72, 58, 18, 20, 43, 20, 10, 44, 21, 22, 64, 25, 39] 5 >>> choices(range(10,100), cum_weights=range(90), k=20) # равные кумулятивные веса 6 [28, 94, 61, 21, 48, 43, 13, 53, 49, 31, 94, 99, 84, 39, 13, 52, 43, 11, 98, 79] 7 >>> choices(range(10), cum_weights=[c for c in range(15) if c%3], k=20) 8 [6, 2, 4, 2, 8, 6, 8, 3, 6, 8, 9, 8, 8, 1, 6, 2, 2, 0, 4, 9] 9 >>> from collections import Counter as C 10 >>> S = choices(range(10), cum_weights=[c for c in range(15) if c%3], k=1000) 11 >>> Counter(S) # 2,4,6,8 — в два раза чаще остальных 12 Counter({6: 165, 4: 152, 2: 145, 8: 127, 9: 83, 0: 70, 7: 69, 1: 68, 3: 66, 5: 55}) 13 >>> choices("qwe", (1,2,3), k=16) 14 ['e', 'q', 'e', 'e', 'w', 'e', 'w', 'q', 'e', 'e', 'w', 'e', 'q', 'e', 'e', 'q'] 15 >>> for i in range(7): 16 ... print(C(choices("qwe", (1,2,3), k=16))) 17 Counter({'e': 10, 'w': 5, 'q': 1}) 18 Counter({'e': 9, 'w': 4, 'q': 3}) 19 Counter({'e': 6, 'w': 6, 'q': 4}) 20 Counter({'e': 9, 'w': 5, 'q': 2}) 21 Counter({'w': 6, 'q': 5, 'e': 5}) 22 Counter({'w': 9, 'e': 7}) 23 Counter({'e': 8, 'q': 4, 'w': 4}) 24 >>> for i in range(7): 25 ... print(C(choices("qwe", cum_weights=(1,2,3), k=16))) 26 Counter({'e': 8, 'w': 6, 'q': 2}) 27 Counter({'w': 7, 'q': 6, 'e': 3}) 28 Counter({'q': 6, 'w': 5, 'e': 5}) 29 Counter({'w': 10, 'q': 4, 'e': 2}) 30 Counter({'w': 8, 'e': 5, 'q': 3}) 31 Counter({'q': 8, 'e': 6, 'w': 2}) 32 Counter({'q': 8, 'w': 4, 'e': 4}) 33
Строки
- Внутреннее 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"{выражение=}" 3.8+)
Метод .format() (например, в случае, когда строка прдварительно формируется)
Lecacy "строка-с-%" % последовательность (похожая на Си)
Спецсимволы и необработанные строки
Зачем нужны спецсимволы
\b, \t, \b, \r; \xчисло, … остальное
r"..."
Д/З
Во всех домашних заданиях нашего курса используются только стандартные модули Python.
Прочитать и прощёлкать про строки в учебнике, в документации, а также про форматирование строк в учебнике и в документации.
EJudge: TrimImage 'Обрезать картинку'
Вводятся строки, содержащие четыре целых числа и символ, разделённые пробелами. Код символа 33 ⩽ c ⩽ 127. Это абсцисса, ордината (ось ординат направлена вниз) некоторых точек, а также длина и ширина построенных на них прямоугольников, «нарисованных» с помощью указанных символов. Последняя строка пустая. Вывести наименьшую область, содержащую все раскрашенные точки, нарисованные в порядке ввода прямоугольников. Область также прямоугольна и изначально заполнена символами '.'. Координаты и размеры могут быть отрицательны или равны нулю. В случае отрицательного размера прямоугольник откладывается от исходной точки в противоположную сторону, а сама точка в него не попадает.
1 2 10 10 * -2 -1 10 10 # 3 4 -10 10 @ 5 6 10 -10 %
............%%%%%%%%%% ............%%%%%%%%%% ............%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% .....#######%%%%%%%%%% @@@@@@@@@@##%%%%%%%%%% @@@@@@@@@@##%%%%%%%%%% @@@@@@@@@@#####***.... @@@@@@@@@@#####***.... @@@@@@@@@@#####***.... @@@@@@@@@@********.... @@@@@@@@@@********.... @@@@@@@@@@********.... @@@@@@@@@@............ @@@@@@@@@@............
EJudge: ZenLeaders 'Чемпионы дзена'
Ввести построчно список участников некоторого соревнования на скорость неизвестно чего в виде Имя Фамилия Название команды часы:минуты:секунды (последняя строка пустая), и вывести всех, кто занял первые три места (минимальное затраченное неизвестно на что время; одно место может занять несколько человек, если время совпадает), в порядке возрастания времени, а внутри одного времени — лекcикографически: фамилия, имя, команда. Дополнительное условие: таблица чемпионов должна быть аккуратной: поля «Имя», «Фамилия», «Название команды» и «Время» должны начинаться в одном столбце, между ними должен быть минимум один пробел, при этом строки должны иметь минимально возможную длину.
Модест Камноедов НИИЧАВО 10:0:0 Николай Долгоносиков Телепаты и спириты 5:3:31 Рудольф Хлебовводов ТПРУНЯ 5:43:55 Лавр Вунюков ТПРУНЯ 6:12:12 Эдельвейс Машкин Пенсионеры-изобретатели 5:43:55 Анатолий Скворцов Золотые руки Китежграда 2:14:3 Амвросий Выбегалло НИИЧАВО 6:12:12
Анатолий Скворцов Золотые руки Китежграда 2:14:3 Николай Долгоносиков Телепаты и спириты 5:3:31 Эдельвейс Машкин Пенсионеры-изобретатели 5:43:55 Рудольф Хлебовводов ТПРУНЯ 5:43:55
EJudge: ExactFraction 'Точная дробь'
Вводится строка, содержащая вычислимое арифметическое выражение. Выражение может содержать пять арифметических операций (+ - / * %), скобки, вещественные числа и пробелы. Вычислить точное значение в виде натуральной дроби и вывести его. Для представления чисел использовать тип fractions.Fraction.
(11/345 + (5.56+32.30)/2.) / 7
18691/6900
EJudge: ArbitPrec 'Произвольная точность'
Вводится две строки: произвольная функция над x, содержащая операции, применимые к типу decimal.Decimal, имеющая единственный корень на интервале (-1.5, 1.5), непрерывная на нём и принимающая значения разных знаков на концах интервала, и натуральное число D. Вывести корень данной функции с точностью ровно D знаков после запятой (нули тоже выводятся). Воспользоваться десятичным контекстом для задания точности (см. примеры выше на странице документации).
1+x*3 20
-0.33333333333333333333