Перенаправление В/В, числа, словари, множества, функции (начало)
Остатки от прошлой лекции
Интерактивная HTML-документация
Перенаправление ввода-вывода в командной строке
«>», «<» и «|»
Генераторы входных данных для задач.
Скалярные типы данных
- Целые и длинные целые
- Вещественные и комплексные числа
о несуществовании вещественных чисел в цифровых ЭВМ (2.2 + 3.3)
⇒ модули decimal.html, fractions.ahtml
Булевский и типы-объекты (None, NotImplemented, Ellipsis и т. п.)
Модуль random и его возможности
(random)
Генератор ПСЧ: randrange()/randint() и seed()
choice(),sample() и shuffle()
Энтропия и random.random()
Последовательности
(в основном были на прошлом занятии)
- Кортежи (константные списки)
- со скобками и без, с запятой в конце и без неё
кортеж в левой части присваивания и цикла for
- секционирование последовательностей на примере кортежей
- отрицательные значения и умолчания
методы: count и index; функция len(), операция in
- перечисления и многоточие (Ellipsis) — для пользовательских объектов
- Списки
принципиальное отличие изменяемых структур от неизменяемых: non-hashable, скорость?
- секция в левой части присваивания
методы append/pop/extend; insert/remove; reverse/sort
- выражение-генератор списка
вложенное выражение-генератор (например, [x*y for x in xrange(5) for y in xrange(x)])
xrange, enumerate
Строки
двойственная сущность строки как константной последовательности однобуквенных строк же (.index(), .count(), in и т. п. работают по подстрокам)
- четыре способа закавычить строку
- Строковые методы
- Полезные и не очень (обзор)
Разбор ввода и склейка вывода с помощью .split() и .join()
управляющие символы и модификатор r"
Форматирование строки с помощью .format()
Старый C-like стиль: строка%послдедовательность
- Кодировка, строки, u-строки и их преобразование
однобайтовый UTF в Python2
chr()/ord()
unicode() (нужна кодировка), обратное (используется LOCALE)
# coding: UTF в файле
Другой тип данных:
bytearray, список однобайтовых целых, он же изменяемая строка
Множества
set() и frozenset()
- Выражение-генератор множества
Словари
- Хешируемые объекты и (видимо) поиск по хешу ⇒ хеш == индекс словаря
- ⇒ не требуется сохранение порядка
- Задание словаря
в виде {ключ:значение, …}
в виде циклического конструктора типа {выражение:выражение for имя in последовательность}
с помощью именованных параметров функции: dict(key=val, …) (см. далее)
из списка пар dict(список_пар)
BTW: функции zip() и enumerate()
Dict[key] и Dict[key]=значение: автодобавление ключа
итератор и проверка in по ключу
keys()/values()/items()
pop(), popitem(); update(), get() и sedtefault()
JT: В питоне вообще много сделано на словарях
Функции (введение)
Передача по ссылке (википедия: по соиспользованию)
- Отсутствие проверки вплоть до вызова (динамическая типизация)
- Пространство имён и локальные переменные
Локальность переменных (по первой встрече в LHS или RHS), global
Д/З
Прочитать:
В учебнике до пятой главы включительно и седьмую главу (есть на русском)
Прочитать про модули random.hmtl, decimal.html, fractions.ahtml
Задачи и упражнения:
- Все примеры попробовать не только на заданном В/В, но и на самостоятльно сгенерированном (если получится, написать генератор входных данных)
Рекурсия:
(domari:ReqSum) Сумма подпоследовательности
Ввести число N, а на следующей строке — последовательность натуральных чисел через запятую. Проверить, является ли N суммой не более, чем 10 каких-либо элементов последовательности, и вывести YES или NO в зависимости от результата.
21 1,2,3,4,5,6,7
YES
Передача функции в качестве параметра:
(domari:DiffLet) Количество разных символов
Ввести строку (слова, разделённые пробелами), и вывести через пробел вначале слова, состоящие из повторения единственного символа (если таковые имеются), затем — слова, образованные всего из двух символов в любом количестве и сочетании, затем — из трёх и т. д. Слова с одинаковым количеством символов выводить в порядке их появления в строке.
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
--> new list sorted key=None, cmp=None, reverse=False) sorted(iterable,
Словарь:
(domari:PopularWord) Самое популярное слово
Ввести построчно текст, состоящий из пробелов, переводов строки и латинских букв, и заканчивающийся пустой строкой. Вывести слово, которое чаще других встречается в тексте, если оно такое одно, и ---, если таких слов несколько.
Sed tempus ipsum quis eros tempus lacinia Cras finibus lorem ut lacinia egestas nunc nibh iaculis est convallis tincidunt mi mi sed nisl Sed porttitor aliquam elit ullamcorper tincidunt arcu euismod quis Mauris congue elit suscipit leo varius facilisis Cras et arcu sodales laoreet est vitae pharetra orci Integer eget nulla dictum aliquet justo semper molestie neque Maecenas bibendum lacus tincidunt auctor varius purus felis ullamcorper dui et laoreet ligula ex et risus Donec eget fringilla nibh Cras congue tincidunt accumsan Maecenas euismod eleifend elit ut rhoncus tortor sodales a Cras egestas finibus lorem non tempor tincidunt aera
tincidunt
Строки и random:
(domari:EasySentence) Произносимое предложение
Сгенерпровать предложение, состоящее из не более, чем 12 случайных хорошо произносимых сочетаний букв. Сочетание букв длины не больше 12 называется «хорошо произносимым», если в нём встречается не более двух гласных и не более трёх согласных подряд. Первое слово предложения наинается с большой буквы, в конце стоит случайный знак препинания. Вввод не используется, вывод даётся примерный.
<ВВОД НЕ ИСПОЛЬЗУЕТСЯ>
<ЭТО ПРИМЕР ВЫВОДА> Пе вожи ичумкяп леобсил ботрумч сбкясотно шфтулзоём аирба уотэлмя?
Форматирование строки:
(domari:MultTable) Таблица умножения на N
Ввести через запятую M и N и вывести таблицу умножения от M×1 до M×N в столбик, где K-я строчка имеет вид __P_=__K_*_M. Между элементами стоят символы подчёркивания, причём перед P может быть ноль или больше подчёркиваний, а перед K — одно или больше, в остальных случаях подчёркивание одно. В результате символы = и * должны стоять друг под другом.
7,11
_7_=__1_*_7 14_=__2_*_7 21_=__3_*_7 28_=__4_*_7 35_=__5_*_7 42_=__6_*_7 49_=__7_*_7 56_=__8_*_7 63_=__9_*_7 70_=_10_*_7 77_=_11_*_7
Использование eval()
(domari:GenMinMax) Найти минимум и максимум произвольной функции на целочисленном отрезке
Ввести строку — произвольное выражение Python, в котором могут дополнительно встречаться функции из модуля math и переменная x. На следующей строке ввести через запятую целые числа A и B (выражение должно быть определено как минимум на A или на B). Вывести через пробел минимальное и максимальное значение выражения на всех допустимых целых x, принадлежащих отрезку [A,B]. Точностью вычислений не управлять.
(x**5+1)/(factorial(x)-720) -10,10
-6 3
(domari:PaidStairs) Классическая задача динамического программирования «Платная лестница»
Наступить на k-ю ступень лестницы A стоит Ak монет. Ввести через запятую «цены» ступеней A, и на следующей строке — ширину шага S (все числа натуральные) и вывести минимальную стоимость пути с земли до последней ступени (на которую наступать обязательно), при условии, что идти можно только вверх и перешагивать можно не более, чем через S-1 ступень.
5, 3, 6, 1, 1, 2, 3, 4, 7, 5, 5, 7, 1, 1, 4, 6, 3, 4, 7, 4, 2 4
14