Числа и строки
Долги за прошлый раз:
- 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 'Поиск простого шаблона в строке' Input:- Ввести строку, содержащую произвольные символы (кроме символа «@»). Затем ввести строку-шаблон, которая может содержать символы '@'. Проверить, содержится ли в исходной строке подстрока, совпадающая со строкой-шаблоном везде, кроме символов '@'; на месте '@' в исходной строке должен стоять ровно один произвольный символ. Вывести наименьшую позицию в строке, с которой начинается эта подстрока, или '-1', если её там нет. Использовать регулярные выражения нельзя! ☺ Output:- lorem ipsum, quia dolor sit, amet, consectetur dolor @it,@@met - 18 
- 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,'/')) - .................... .@@@@@.............. .@@@@@.............. .@!@@@.............. .@@@@@.............. .@@@###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ......../////////... ......../////////... ......../////////... ......../////////... .................... .................... .................... 
- EJudge: MultTable 'Таблица умножения' Input:- Ввести два натуральных числа через запятую: N и M. Вывести таблицу умножения от 1 до N включительно в формате, представленном ниже, разделяя колонки, если они есть, тремя символами « | ». Количество столбцов в выводе должно быть наибольшим, но общая ширина строки не должна превышать M (предполагается, что M достаточно велико, чтобы вместить один столбец). Ширина колонок под сомножители и произведения должна соответствовать максимальной ширине соответствующего значения (даже если в данной колонке данного столбца эта ширина не достигается, см. пример). Таким образом все столбцы должны быть одинаковой ширины, без учёта пробелов в конце строк, которых быть не должно. Разделители вида "===…===" должны быть ширины M. Output:- 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 ============================================================== 
- Input:Ввести числа: рациональное A (целое или десятичная дробь) — угол из диапазона от 1 до 99 градов (метрических градусов), и натуральное 4 ⩽ E ⩽ 1000 — точность вычисления (в терминах контекста вычислений модуля Decimal — поле perc). Вычислить значение тангенса с указанной точностью. Число Пи (если оно вам понадобится) тоже надо вычислять! Output:50 7 1.000000 
