Числа и строки
Числа
Больше математики!
Датасатанизм: 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 "строка-с-%" % последовательность (похожая на Си)
NEW Python3.12: Syntactic formalization of f-strings
Можно попробовать тут: a="QQQ"; print(f"{a + "!"}")
Спецсимволы и необработанные строки
Зачем нужны спецсимволы
\b, \t, \b, \r; \xчисло, … остальное
r"..."
Д/З
Во всех домашних заданиях нашего курса используются только стандартные модули Python.
Прочитать и прощёлкать про строки в учебнике, в документации, а также про форматирование строк в учебнике и в документации.
EJudge: MaxInt 'Поиск наибольшего числа в тексте'
Ввести текст, состоящий из нескольких строк (заканчивается пустой строкой). Каждая строка состоит из «слов» (последовательностей непробельных символов), разделённых пробелами или табуляциями. Некоторые слова — целые числа, состоящие из цифр и необязательного знака минус в начале, другие числами не являются (хотя могут содержать цифры). Найти и вывести наибольшее из этих чисел или 0, если в тексте чисел не было.
enemies -565 glanduliform h2502Tbeaic -tv5naa2re4 55 silicamortar eared ra50ertc-8 -4 94 ohgutyd38 163 -562 u8e8qisn handout crossword 22s4cico -v80s6eessl beaning en1A1i-2l 545 december flo ch00a0-h1t vignettist
545
EJudge: ConvexPolygon 'Выпуклый мнгогоугольник'
Ввести построчно 300 ⩾ N > 2 пар целых чисел, разделённых запятой (ввод оканчивается пустой строкой). Считая пары координатами точек, проверить, могут ли эти точки в определённом порядке быть вершинами выпуклого N-угольника. Вывести True, если могут, или False, если нет.
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 'Рисуем квадраты'
Написать функцию 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,'/'))
.................... .@@@@@.............. .@@@@@.............. .@!@@@.............. .@@@@@.............. .@@@###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....###########..... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ....####/////////... ......../////////... ......../////////... ......../////////... ......../////////... .................... .................... ....................
Ввести числа: рациональное A (целое или десятичная дробь) — угол из диапазона от 1 до 99 градов (метрических градусов), и натуральное 4 ⩽ E ⩽ 1000 — точность вычисления (в терминах контекста вычислений модуля Decimal — поле perc). Вычислить значение тангенса с указанной точностью. Число Пи (если оно вам понадобится) тоже надо вычислять!
50 7
1.000000