Различия между версиями 11 и 12
Версия 11 от 2015-03-04 01:50:54
Размер: 10122
Редактор: localhost
Комментарий:
Версия 12 от 2015-03-04 01:52:28
Размер: 9989
Редактор: localhost
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 111: Строка 111:
/!\ '''TODO'''
Строка 115: Строка 115:
Задачи и упражненя Задачи и упражненя:
Строка 122: Строка 122:
 * <<Homework(domari:,DoPolIZ,Вычислить выражение в польской инверсной записи)>>
 *
<<Homework(domari:,PaidStairs,Классическая задача динамического программирования «Платная лестница»)>>
 * <!> <<Homework(domari:,PaidStairs,Классическая задача динамического программирования «Платная лестница»)>>

Функции и генераторы; словари, множества; строки

Остатки от прошлой лекции

Интерактивная HTML-документация

Скалярные типы данных

  • Целые и длинные целые
  • Вещественные и комплексные числа
    • о несуществовании вещественных чисел в цифровых ЭВМ (2.2 + 3.3)

    • ⇒ модули decimal.html, fractions.ahtml

  • Булевский и типы-объекты (None, NotImplemented, Ellipsis и т. п.)

BTW: модуль 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()

    • 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())

  • Свёртка позиционных и именованных параметров
    • * и ** в списке формальных параметров

    • * и ** при вызове функции

    • ⇒ переменное количество параметров
    • ⇒ произвольные (!) именованные параметры

  • Рекурсия. Оценка необходимости рекурсии. Гвидо и хвостовая рекурсия.

Неявная динамическая типизация в Python

  • Любые функции (методы) применимы к любым объектам
    • Если в процессе выполнения происходит обращение к несуществующему объекту (полю), активизируется исключение
  • Проверка существования объекта (поля) происходит в момент обращения к енму
  • Все операции над объектами (типа +, [ , () и т. п.) — спецметоды объектов

Генераторы

  • Объекты-итераторы iter() из коллекции (.__iter__()) или из последовательности (.__getitem__())

    • .next() и StopIteration

    • Работа цикла for

  • Выражения-генераторы: для цикла лучше списков, но «одноразовые, что твои спорт-байкеры»
  • Генераторы: функции с yield вместо return

    • Параметрические: .send(par) вместо .next() ( ⇒ par = yield)

    • Управление: .close() и .throw(исключение)

JT: Отложенные вычисления и… «побочный эффект»

Д/З

Задачи и упражненя:

  • (domari:ReqSum) Сумма подпоследовательности

    Ввести число N, а на следующей строке — последовательность натуральных чисел через запятую. Проверить, является ли N суммой не более, чем 10 каких-либо элементов последовательности, и вывести YES или NO в зависимости от результата.

    Input:

    21
    1,2,3,4,5,6,7
    Output:

    YES
  • (domari:DiffLet) Количество разных символов

    Ввести строку (слова, разделённые пробелами), и вывести через пробел вначале слова, состоящие из повторения единственного символа (если таковые имеются), затем — слова, образованные всего из двух символов в любом количестве и сочетании, затем — из трёх и т. д. Слова с одинаковым количеством символов выводить в порядке их появления в строке.

    Input:

        sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
    Output:

    --> new list sorted key=None, cmp=None, reverse=False) sorted(iterable,
  • (domari:PopularWord) Самое популярное слово

    Ввести построчно текст, состоящий из пробелов, переводов строки и латинских букв, и заканчивающийся пустой строкой. Вывести слово, которое чаще других встречается в тексте, если оно такое одно, и ---, если таких слов несколько.

    Input:

    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
    Output:

    tincidunt
  • (domari:MultTable) Таблица умножения на N

    Ввести через запятую M и N и вывести таблицу умножения от M×1 до M×N в столбик, где K-я строчка имеет вид __P_=__K_*_M. Между элементами стоят символы подчёркивания, причём перед P может быть ноль или больше подчёркиваний, а перед K — одно или больше, в остальных случаях подчёркивание одно. В результате символы = и * должны стоять друг под другом.

    Input:

    7,11
    Output:

    _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
  • (domari:GenMinMax) Найти минимум и максимум произвольной функции на целочисленном отрезке

    Ввести строку — произвольное выражение Python, в котором могут дополнительно встречаться функции из модуля math и переменная x. На следующей строке ввести через запятую целые числа A и B (выражение должно быть определено как минимум на A или на B). Вывести через пробел минимальное и максимальное значение выражения на всех допустимых целых x, принадлежащих отрезку [A,B]. Точностью вычислений не управлять.

    Input:

    (x**5+1)/(factorial(x)-720)
    -10,10
    Output:

    -6 3
  • (domari:RandomGen) Найти число в псевдослучайной последовательности

    Ввести через запятую натуральные числа X0, a, c и m (c также может быть равно 0); на следующей строке ввести натуральное число Y. Использовать генератор последовательности псевдослучайных чисел линейным конгруэнтным методом и проверить, встречается ли Y в последовательности Xn+1 = (aXn + c) mod m (это и есть упомянутый метод :) ). Вывести YES, если встречается и NO, если нет.

    Input:

    7,7,7,10
    6
    Output:

    YES
  • <!>

    (domari:PaidStairs) Классическая задача динамического программирования «Платная лестница»

    Наступить на k-ю ступень лестницы A стоит Ak монет. Ввести через запятую «цены» ступеней A, и на следующей строке — ширину шага S (все числа натуральные) и вывести минимальную стоимость пути с земли до последней ступени (на которую наступать обязательно), при условии, что идти можно только вверх и перешагивать можно не более, чем через S-1 ступень.

    Input:

    5, 3, 6, 1, 1, 2, 3, 4, 7, 5, 5, 7, 1, 1, 4, 6, 3, 4, 7, 4, 2
    4
    Output:

    14


CategoryClass

Lectures/PythonIntro/2015-03-04 (последним исправлял пользователь Class1 2015-03-05 14:53:50)