Числа и строки
Долги за прошлый раз:
sotred() и min()/max() с параметром «функция ключа»
Числа
вычисления в рациональных числах с помощью decimal и fractions
decimal.Decimal(1.1) vs. decimal.Decimal("1.1")
fractions.Fraction(1/3) vs. fractions.Fraction(1,3)
Псевдослучайные числа
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 и обратно, но нам этого не видно!
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()
Форматные строки
(3.8+) f"{выражение=}"
Метод .format() (например, в случае, когда строка формируется)
- Lecacy "строка-с-%" % последовательность (похожая на Си)
Спецсимволы и необработанные строки
- Специмволы
\b, \t, \b, \r, … остальное
r"..."
Д/З
Прочитать и прощёлкать про строки в учебнике, в документации, а также про форматирование строк в учебнике и в документации.
TODO
EJudge: PatternFind 'Поиск простого шаблона в строке'
Ввести строку, содержащую произвольные символы (кроме символа «@»). Затем ввести строку-шаблон, которая может содержать символы '@'. Проверить, содержится ли в исходной строке подстрока, совпадающая со строкой-шаблоном везде, кроме символов '@'; на месте '@' в исходной строке должен стоять ровно один произвольный символ. Вывести наименьшую позицию в строке, с которой начинается эта подстрока, или '-1', если её там нет. Использовать регулярные выражения нельзя! ☺
lorem ipsum, quia dolor sit, amet, consectetur dolor @it,@@met
18
EJudge: DrawSquare 'Рисуем квадраты'
Написать функцию squares(w,h,(X,Y,s,c),...) со следующими параметрами: w и h — ширина и высота «экрана», за которыми следуют 0 или больше 4-элементных последовательностей вида (X,Y,s,c), где X и Y — координаты левого верхнего угла квадрата, s — длина его стороны (не меньше 1), а c — символ которым он заполняется на экране. Функция должна выводить прямоугольник из h×w точек, на котором соответствующими символами «нарисованы» квадраты соответствующих размеров в соответствующих местах. Координаты левого верхнего угла поля — 0,0. Растут вправо вниз. Проверять, что квадраты не выходят за границы поля, не надо.
squares(20,23,(1,1,5,'@'), (2,3,1,'!'), (4,5,11,'#'), (8,11,9,'/'))
.................... .@@@@@.............. .@@@@@.............. .@!@@@.............. .@@@@@.............. .@@@###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ......../////////... ......../////////... ......../////////... ......../////////... .................... .................... ....................
EJudge: MultTable 'Таблица умножения'
Ввести два натуральных числа через запятую: N и M. Вывести таблицу умножения от 1 до N включительно в формате, представленном ниже, разделяя колонки, если они есть, тремя символами « | ». Количество столбцов в выводе должно быть наибольшим, но общая ширина строки не должна превышать M (предполагается, что M достаточно велико, чтобы вместить один столбец). Ширина колонок под сомножители и произведения должна соответствовать максимальной ширине соответствующего значения (даже если в данной колонке данного столбца эта ширина не достигается, см. пример). Таким образом все столбцы должны быть одинаковой ширины, без учёта пробелов в конце строк, которых быть не должно. Разделители вида "===…===" должны быть ширины M.
11, 62
============================================================== 1 * 1 = 1 | 2 * 1 = 2 | 3 * 1 = 3 | 4 * 1 = 4 1 * 2 = 2 | 2 * 2 = 4 | 3 * 2 = 6 | 4 * 2 = 8 1 * 3 = 3 | 2 * 3 = 6 | 3 * 3 = 9 | 4 * 3 = 12 1 * 4 = 4 | 2 * 4 = 8 | 3 * 4 = 12 | 4 * 4 = 16 1 * 5 = 5 | 2 * 5 = 10 | 3 * 5 = 15 | 4 * 5 = 20 1 * 6 = 6 | 2 * 6 = 12 | 3 * 6 = 18 | 4 * 6 = 24 1 * 7 = 7 | 2 * 7 = 14 | 3 * 7 = 21 | 4 * 7 = 28 1 * 8 = 8 | 2 * 8 = 16 | 3 * 8 = 24 | 4 * 8 = 32 1 * 9 = 9 | 2 * 9 = 18 | 3 * 9 = 27 | 4 * 9 = 36 1 * 10 = 10 | 2 * 10 = 20 | 3 * 10 = 30 | 4 * 10 = 40 1 * 11 = 11 | 2 * 11 = 22 | 3 * 11 = 33 | 4 * 11 = 44 ============================================================== 5 * 1 = 5 | 6 * 1 = 6 | 7 * 1 = 7 | 8 * 1 = 8 5 * 2 = 10 | 6 * 2 = 12 | 7 * 2 = 14 | 8 * 2 = 16 5 * 3 = 15 | 6 * 3 = 18 | 7 * 3 = 21 | 8 * 3 = 24 5 * 4 = 20 | 6 * 4 = 24 | 7 * 4 = 28 | 8 * 4 = 32 5 * 5 = 25 | 6 * 5 = 30 | 7 * 5 = 35 | 8 * 5 = 40 5 * 6 = 30 | 6 * 6 = 36 | 7 * 6 = 42 | 8 * 6 = 48 5 * 7 = 35 | 6 * 7 = 42 | 7 * 7 = 49 | 8 * 7 = 56 5 * 8 = 40 | 6 * 8 = 48 | 7 * 8 = 56 | 8 * 8 = 64 5 * 9 = 45 | 6 * 9 = 54 | 7 * 9 = 63 | 8 * 9 = 72 5 * 10 = 50 | 6 * 10 = 60 | 7 * 10 = 70 | 8 * 10 = 80 5 * 11 = 55 | 6 * 11 = 66 | 7 * 11 = 77 | 8 * 11 = 88 ============================================================== 9 * 1 = 9 | 10 * 1 = 10 | 11 * 1 = 11 9 * 2 = 18 | 10 * 2 = 20 | 11 * 2 = 22 9 * 3 = 27 | 10 * 3 = 30 | 11 * 3 = 33 9 * 4 = 36 | 10 * 4 = 40 | 11 * 4 = 44 9 * 5 = 45 | 10 * 5 = 50 | 11 * 5 = 55 9 * 6 = 54 | 10 * 6 = 60 | 11 * 6 = 66 9 * 7 = 63 | 10 * 7 = 70 | 11 * 7 = 77 9 * 8 = 72 | 10 * 8 = 80 | 11 * 8 = 88 9 * 9 = 81 | 10 * 9 = 90 | 11 * 9 = 99 9 * 10 = 90 | 10 * 10 = 100 | 11 * 10 = 110 9 * 11 = 99 | 10 * 11 = 110 | 11 * 11 = 121 ==============================================================
Ввести числа: рациональное A (целое или десятичная дробь) — угол из диапазона от 1 до 99 градов (метрических градусов), и натуральное 4 ⩽ E ⩽ 1000 — точность вычисления (в терминах контекста вычислений модуля Decimal — поле perc). Вычислить значение тангенса с указанной точностью. Число Пи (если оно вам понадобится) тоже надо вычислять!
50 7
1.000000