Множества, словари, строки и функции
Дополнение к предыдущей лекции:
«Неочевидная» работа конструкции типа [(i,j) for i in xrange(3) if j!=1 for j in xrange(3)]: как читать вложенные циклические выражения
Множества
- Зачем множества?
- Константные множества
- Выражение-генератор множества
Словари
- Хешируемые объекты и (видимо) поиск по хешу ⇒ хеш == индекс словаря
- ⇒ не требуется сохранение порядка
- Задание словаря
в виде {ключ:значение, …}
в виде циклического конструктора типа {выражение:выражение for имя in последовательность}
с помощью именованных параметров функции: dict(key=val, …) (см. далее)
из списка пар dict(список_пар)
BTW: функции zip() и enumerate()
Dict[key] и Dict[key]=значение: автодобавление ключа
итератор и проверка in по ключу
keys()/values()/items()
BTW типы view<что-нибудь>, например, viewkeys() (поддерживает алгебру множеств)
pop(), popitem(); update(), get() и sedtefault()
JT: В питоне вообще много сделано на словарях
Функции
JT: «Побочный эффект» — ересь, мелочь или строгая теория?
Вызываемый объект «fun(arg1, arg2, ...) is a shorthand for fun.__call__(arg1, arg2, ...)»
Передача по ссылке (википедия: по соиспользованию)
- Отсутствие проверки вплоть до вызова (динамическая типизация)
- Пространство имён и локальные переменные
Локальность переменных (по первой встрече в LHS или RHS), global
- Умолчания для параметров (присваивание во время определения) и пропуск параметров
- ⇒ Позиционные и именованные параметры
- Строки документации
Функции-выражения (lambda)
JT: Краешек бездны: функционалы
Краешек оврага: «таблицы эмуляции» и передача функции в качестве параметра (например, sorted()/max() и cmp()/key())
- Свёртка позиционных и именованных параметров
* и ** в списке формальных параметров
* и ** при вызове функции
- ⇒ переменное количество параметров
⇒ произвольные именованные параметры
Строки
Напоминалка: строки — необычные последовательности (.index(), .count(), in и т. п. работают по подстрокам)
- Строковые методы
- Полезные и не очень (обзор)
Разбор ввода и склейка вывода с помощью .split() и .join()
Форматирование строки с помощью .format()
Старый C-like стиль: строка%послдедовательность
- Кодировка, строки, u-строки и их преобразование
однобайтовый UTF в Python2
chr()/ord()
unicode() (нужна кодировка), обратное (используется LOCALE)
# coding: UTF в файле
Д/З
- Прочитать в учебнике
про множества и словари (datastructures.html), и про них же в документации
про форматирование строк (inputoutput.html) и про это же в документации
Прочитать в документации про строковые методы
(ReqSum) Сумма подпоследовательности
Ввести число N, а на следующей строке — последовательность натуральных чисел через запятую. Проверить, является ли N суммой не более, чем 10 каких-либо элементов последовательности, и вывести YES или NO в зависимости от результата.
21 1,2,3,4,5,6,7
YES
(DiffLet) Количество разных символов
Ввести строку (слова, разделённые пробелами), и вывести через пробел вначале слова, состоящие из повторения единственного символа (если таковые имеются), затем — слова, образованные всего из двух символов в любом количестве и сочетании, затем — из трёх и т. д. Слова с одинаковым количеством символов выводить в порядке их появления в строке.
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
--> new list sorted key=None, cmp=None, reverse=False) sorted(iterable,
(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
(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