Differences between revisions 1 and 50 (spanning 49 versions)
Revision 1 as of 2017-06-29 12:53:27
Size: 3470
Comment: first mockup
Revision 50 as of 2017-07-10 10:43:10
Size: 31562
Editor: FrBrGeorge
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
== День 1 ==
 - Орг: конспекты (c двух строрнон: Linux+Python), практика обязательна
 - FOSS: сообщество и ПО, Linux, Python
 - Linux: «цветочек»+
   ⇒ командная строка
   - команды
   - программа
   - интеграция
   - переменные
   - где лежат команды (пространство имён)
     - PATH
     - ls -l / chmod
 - Python:
   - командная строка
   - объекты, их типы
   - действия над объектами
   - неявная динамическая типизация
   - программа на Python
   - Сценарий Linux, shebang
   - Использование geany
   - преобразование типов, type() (в т. ч. type(a)(b)) и простейший ввод-вывод
   - связывание объектов именами, dir()
 - Практика:
   - примитивный сценарий на shell
   - вычисление формул
   - ручное развёртывание бинарного возведения в степень
   - *TODO*

== День 2 ==
 - Python
   - условные операторы и выражения
   - условное выражение a if b else c
   - базовый if, форматирование отступами
   - if / elif / else
   - примеры
   - пустой объект, примеры
   - ⇒ _любое_ выражение в условии
   - операции сравнения
   - алгебра логики, таблицы истинности
   - логические операции Python, их таблицы истинности
   - примеры
   - цикл while (простой вариант)
   - использование math
 - Практика
   - нер-во тр-ка
   - биквадратное уравнение с ненулевым a
   - условные формулы
   - таблица умножения на N
   - цикл по вводу
   - *TODO*

== День 3 ==
Примерный распорядок дня
 * 10:00-10:30 — повторение и ответы на вопросы
 * 10:30-14:00 — лекции+семинары
 * 14:00-14:30 — обед
 * 14:30-16:00 — практика

== Тематический план ==
Предполагается последовательно проходить этот план, расставляя пометки, сколько удалось сделать за день.
 * {*} — лабораторные работы / семинары (воспроизведение доски или тривиальные упражнения)
 * {i} — практические задания
Рекомендации по самостоятельному изучению
 * Д/З: установить [[http://python.org|Python]] и [[http://geany.org|Geany]] (можно другие IDE) дома, если есть цель научиться чему-то ненулевому
 * Д/З: Щёлкать [[py3tut:|tutorial]] (определяем, кому интересно)
== День 1 (3 июля) ==
 * Знакомство, определение уровня знаний и глубины изложения (утро)
 * Орг: конспекты (c двух сторон: Linux+Python), практика обязательна
 * FOSS: сообщество и ПО, Linux, Python
 * Linux и командная строка:
  * «цветочек»+
   * Ядро, программный интерфейс
   * Утилиты, командный интерфейс
   * ФС, пространство имён, файловые объекты
  * ⇒ командная строка (введение)
   * КС как диалог
   * shell: интерпретатор командной строки, ЯП, оболочка надо другими программами
   * договорённости о командной строке (ключи)
   * переменные, где лежат команды (пространство имён), PATH
   * Примеры команд: - ls, cp, rm, mv, mkdir, echo, перенаправление В/В
   * имена файлов, ln, ls -i
   * Встроенная помощь man
  * {*}
   * посмотреть содержимое корня
   * посмотреть все файлы в текущем каталоге
   * посмотреть документацию к известным командам
   * создать файл, переименовать
   * создать каталог, скопировать туда файл, удалить каталог
 * Python
  * Командная строка
   * объекты, их типы
   * действия над объектами
   * неявная динамическая типизация
   * преобразование типов, type() (в т. ч. type(a)(b)) и простейший ввод-вывод
   * пространства имён, связывание объектов именами, dir()
   * множественное связывание, id()
   * help()
  * {*}
   * вычисление формул
   * поэтапное вычисление формул с использованием имён
   * online python tutor: демонстрация связывания
 * Сценарии
  * Текстовый редактор vs IDE
  * Linux, shebang
  * программа на Python
  * {*}
   * Использование geany
   * примитивный сценарий на shell
   * сделать сценарий исполняемым и переместить в каталог `$HOME/bin/`
   * примитивный сценарий на Python

== День 2 (4 июля) ==
 * Python
  * понятие о модулях, `from math import *`
  * {i}
   * ручное развёртывание бинарного возведения в степень (например, как получить 3^21^?)
   * [[http://narhoz-chita.ru/zadachnik/Glava01/index01.htm|вычисление формул]]
  * условные операторы и выражения
   * логический тип, операции сравнения
   * условное выражение a if b else c
   * базовый if
   * форматирование отступами
   * if / elif* / else
  * {*}
   * ввести два числа, вывести наибольшее
    * условным выражением
    * условным оператором
   * ввести два числа, вывести, больше, меньше или равно первое второму
   * ввести три числа, проверить неравенство треугольника (вложенный if)
  * {i}
   * ввести три числа, найти наибольшее (вложенный if)
    * условным выражением
    * условным оператором
  * алгебра логики
   * пустой объект, примеры
   * ⇒ ''любое'' выражение в условии
   * таблицы истинности
   * логические операции Python, их таблицы истинности
   * примеры
  * {*}
   * ввести три числа, проверить неравенство треугольника (с помощью `or`)
  * {i}
   * квадратное уравнение с ненулевым '''a'''
   * [[http://narhoz-chita.ru/zadachnik/Glava02/index02.htm|условные формулы №57]]
  * цикл while
   * каноническая схема цикла: инициализация, проверка условия, тело, изменение
   * пример: цикл по вводу
  * {*}
   * подсчёт произведения (ввод до 0)
   * сумма N элементов арифметической прогрессии (циклом)
   * факториал

  * {i}
   * с какого элемента сумма арифметической прогрессии превысит N?
   * таблица умножения на N (в столбик)
   * подсчёт среднего (ввод до 0)

 * Python
  * Циклы (более сложные случаи)
   * условия внутри циклов, break, continue
   * поиск первого, else
   * вложенные циклы
  * {*}
   * Сумма только положительных (ввод до 0)
   * одновременный подсчёт суммы и произведения положительных чисел (используется continue для отрицательных)
   * ввести ненулевые числа, проверить, есть ли среди них отрицательные
    * без else (с break)
    * с else
   * большая таблица умножения в столбик
  * {i}
   * таблица умножения в виде матрицы ''по столбцам'' (без форматирования)

== День 3 (5 июля) ==
  * Последовательности (введение)
   * Хранимые (строки, кортежи, списки)
    * индексирование, в т. ч. отрицательное
    * операции поэлементного сравнения
     * операция `is` на примере списков
    * операции `+` и `*`
    * секционирование
     * обычное
     * с шагом
     * умолчания
    * {*}
     * какая последовательность больше и почему?
     * начальный, средний и конечный элемент
     * элементы, стоящие на 1,4,7, и т. д. местах (NB off by 1)
    * {i}
     * сначала элементы, стоящие на нечётных местах, затем — на чётных, задом наперёд
  * цикл прохода по последовательности for
   * break, '''continue''', else
   * {*}
    * выбор максимума
    * поиск 0

  * Вычисляемые (range(), enumerate())
   * типичный for
   * {*}
    * переписать на for кое-какие примеры с while
   * {i}
    * ввести последовательность чисел, вывести ''второй максимум'', то есть элемент, больше которого в последоватнльности только одно значение, например, для 1,1,2,2,7,7,3,3,5,5 второй максимум — это 5
  * Конструктор списка
  * Конструктор генератора, работа генератора, цикл for и генераторы
  * Как работает множественное связывание
   * распаковка последовательностей при связывании
   * в цикле for (последовательность последовательностей)
   * `a,b,*c,d = "Qwertyuiop"`
 * Кратко о строках
  * +, *
  * {{{"".format()}}}
 * {i}
  * Вывести все стороны и площади треугольников, стороны которых — однозначные положительные целые числа (не надо использовать конструктор, это жесть!)
   * использовать формулу Герона
   * не забыть, что 1 2 3, 1 3 2 и прочие перестановки — один и тот же треугольник, выводить один раз1
  * вывести таблицу умножения от 1 до 12 (сначала без {{{"".format()}}}, потом (''если успеете'') с ним):
    {{{
    1*1 = 1 2*1 = 2 3*1 = 3
    1*2 = 2 2*2 = 4 3*2 = 6
    ...
    1*12 = 12 2*12 = 24 3*12 = 36
    4*1 = 4 5*1 = 5 6*1 = 6
    4*2 = 8 5*2 = 10 6*2 = 12
    ...
    4*12 = 48 5*12 = 60 6*12 = 72
    7*1 = 7 8*1 = 8 9*1 = 9
    7*2 = 14 8*2 = 16 9*2 = 18
    ...
    }}}
  * Ввести строку, вывести, сколько в ней гласных (подсказка: `c in "aeoiu"` :) ), ''методами не пользоваться''
  * Ввести список запрещённых слов в формате "слово1","слово2",..., затем вводить строки до тех пор пока последняя не окажется пустой (это так же, как ввод до 0). Вывести, сколько строк содержали запрещённые слова

== День 4 (6 июля) ==
=== Функции (введение) ===
 * Задача повторного использования кода — макросы и подпрограммы
 * Функции в Python
  * Функция — это запись алгоритма обработки данных, а не преобразование
  * ''duck typing''
  * вызов функции — выражение, всегда есть возвращаемое значение — любой объект (например, None)
  * возвращаемое значение можно не использовать
  * Определение функции, формальные параметры
   * {*} простые примеры
  * Локальное пространство имён функции
   * просто вывод `dir()`
   * независимость имён
   * `locals()` и `globals()`
    * {*} просто вывод
   * порядок просмотра пространств
   * автоопределение локальных имён; global
    * {*}
  * {i}
   * '''''с этого момента и до конца курса каждые модуль/функция/класс в заданиях {i} должны содержать docstring с пояснением, что они делают'''''
   * ''(задания в этом'' {i} ''-блоке оформить в виде интерактивной программы и в виде модуля)''
   * Функция — сумма цифр
    * Ввести последовательность, вывести элемент с минимальной суммой цифр
     * <!> можно с помощью `min()` — как?
   * функция — расстояние между точками ( <!> на самом деле есть :) )
    * Ввести список пар вида `(1,2), (3,4), (100,100) …`, найти самый удалённые точки
 * Распаковка и запаковка параметров функций
  * ничего и нет, только списки
  * Функции с переменным количеством параметров
   * {*}
  * Распаковка последовательности при вызове
   * {*}, в т. ч. `print(*seq)`
 * {i}
  * функция, возвращающая ''список'' только целочисленных из всех параметров
 * ''Всё остальное про функции — потом, не сегодня''

=== Методы объектов; модули ===
 * Поля объектов, инкапсуляция
  * `dir(объект)`
  * `объект.имя_поля`
  * методы и … поля
 * Модули, `sys.path`
  * программа на Python как модуль
  * встроенная и в среду Python, и в язык Python документация
   * `help()`
   * документирование собственного кода
    * docstring
    * `object.__doc__`
  * {*}

=== Строки и их методы ===
 * Строковые методы
  * все (в т. ч. `in`)
  * `replace()`
   * {*}
  * `split()` и `join()`
   * {*}
 * {i}
  * Ввести строку, заменить в ней последовательности "-" на один минус
  * Ввести запрещённое сочетание букв и строку. Вывести строку, в которой запрещённое сочетание букв не встречается (например, "ab" и "aabbcaabbb" → "cb")
  
=== Списки и их методы ===
 * все методы
 * стек, суть pop()/push(), эффективность
 * очередь и deque()
 * {i} ''Функция: список -> список''
  * Список всех делителей числа
  * Убрать из списка подряд идущие одинаковые элементы
   * <!> Для уверенных в себе: То же, но повторять, пока таких групп не останется.

== День 5 (7 июля) ==

=== Ещё немного обо всём ===
 * `zip(последовательность, последовательность, ...)`
  * удобнее всего одинаковой длины
  * столько же элементов, сколько в аргументе ''наименьшей'' длины, остальные отбрасываются
  * {*}
   * (07.02) Ввести матрицу N*M, выдать транспонированную матрицу
  * {i}
   * Ввести N строк, проделать то же самое
 * `lambda arguments: returnexpr`
 * `python3 matrix_generator.py | python3 another_program.py`
  * работает везде: Linux, Windows, OS X, any other Unix
  * в т. ч. возможность писать самые настоящие автоматические тесты для своих программ!

=== Про random ===
 * Случайное и неслучайное, зачем нужно
 * Датчик случайных чисел
  * неслучайность
  * воспроизводимость, seed()
 * Модуль `random`
  * `random()` , `randint()`, `randrange()`
  * `choice()`, `shuffle()`, `sample()`
  * `seed()`
 * {*}
  * Случайное число на отрезке A…B
   * Гистограмма (список частот для возможных значений)
  * Перемешать строку
  * Случайные слова случайной длины
  * Генератор значений для 07.02 (транспонирование матрицы)
 * {i}
  * ''в каждой функции, которую пишете, краткий docstring, к хорошему тону надо привыкать''
  * Функция, с вероятностью 1/3 выдающая `"yes"`, с 2/3 `"no"`. (без модуля `random`, кроме `random.random`)
   * Программа, выводящая выборку из N вызовов такой функции и гистограмму (кол-во "yes" и кол-во "no")
  * Функция, выдающая случайные '''произносимые''' слова случайной длины (запихать в модуль)
   * `if __name__ == "__main__":` краткое демо
  * Используя модуль произносимых слов: функция, генерирующая несколько предложений из нескольких случайных слов.
  * Используя модуль-генератор предложений: ввести слово; посчитать, сколько раз оно встретилось в сгенерированных предложениях.
   * ''можно не слово, а букву или комбинацию букв, с точки зрения Python одно и то же''
  * В первой программе сгенерировать двумерный список чисел случайно и вывести на экран
   * в другой: среди всех минимумов в строчках полученной матрицы найти максимум
   * ''тестируем при помощи конвейера (что-то сродни `python3 gen.py | python3 program.py`)''
   * ''обратите внимание, что по pipe между программами проходит текст, т. е. строчки символов''


=== Про черепаху ===
 * Модуль `turtle`
 * Основные команды
 * Как закрасить область
 * {i}
  * Функция, рисующая домик размера N пикселей.
  * Функция, рисующая ёлочку из n треугольников размера от k до l
  * лес с разными ёлочками
   * <!> немного не параллельными
 * ''дальше не успеем''

== День 6 (10 июля) ==

 * Q: был вопрос о разнице между `"` и `'` в Python.
  * A: Разницы нет никакой, кроме стилистической: хорошим тоном считается использовать для docstring двойные кавычки.
  * см. [[https://www.python.org/dev/peps/pep-0257/|PEP 257]] на эту тему
=== Работа с файлами ===
 * Текстовые файлы
  * open(), read() / write() / close()
  * readlines() он же сам файл, print(.. file=)
  * "b/t" — str или bytes
 * {i}
  * отсортировать текстовый файл по длине строк
 * файлы с данными
  * если данные наши: сериализация/десериализация, `pickle` (json, xml, …)
   * dump[s]()/load[s]()
  * если данные готовы: `struct`
   * byte order :(
   * pack()/unpack()
 * {i}
  * Ввести имя, фамилию, возраст и средний балл, сериализовать в файл; в другой программе прочесть из этого файла
  * То же, что и выше, но с помощью struct
  
=== Понятие оценки сложности алгоритма ===
 * Оценка сложности: количество операция на единицу обрабатываемых данных
  * насколько замедляется алгоритм при количестве данных
   * +1
   * *2
   * → производная!
 * Индексирование
 * Поиск
 * все возможные сочетания
=== Бинарный поиск и сортировка ==
 * Бинарный поиск и оценка его сложности
 * Примитивная сортировка и оценка её сложности
 * Сортировка слиянием
 * «Быстрая» сортировка, худший случай
 * Сортировка кучей
 * {i}
  * бинарный поиск строк в файле
  * сортировка файла слиянием
=== Словари и множества ===
 * Задача хранения и индексирования
  * сложных данных
  * просто слишком больших данных
  * +невосстановимое хеширование
 * Свойстсва хеш-функции
  * неоднозначность
  * распределённость по ОЗ (на конкретных данных!)
   * разброс для почти похожих
  * невосстановимость объекта (сравнение без раскрытия)
⇒ Возможности
 * индексирование
 * сортировка и поиск
Примеры
 * a % b
 * int(sin(b)*100)
 * `hash()`, какие объекты хешируются
 * ...
Множество — просто хеш-таблица
 * Задание, в т. ч. циклический конструктор
 * Операции над множествами, методы
 * Типичное использование
 * {*}
  * каких букв не хватает
 * {i}
  * вводятся предложения, проверить, есть ли общее слово (регистр букв игнорировать)
Словарь — множество с атрибутами, т. е. соответствие множества хешируемых ключей множеству произвольных объектов
 * Задание, в т. ч. циклический конструктор
 * Операции над множествами, методы
 * Типичное использование:
  * ...
  * globals()/locals()
  * именные параметры функции
 * {*}
  * Словари и счётчики
   * ручная реализация счётчика
   * collections
 * {i}
  * генератор файла со случайными словами
   * +неравномерное распределение слов (как?)
  * подсчёт слов в файле, гистограмма
-----
=== turtle ===
 * {*}
  * Попробовать нарисовать черепахой график функции y=sin(x) в диапазоне -4<=x<=5 (использовать абсолютные координаты, то есть функцию goto(x,y))
  * Осознать, что:
   * График — это не кривая, а ломаная (передвижение черепашки от точки к точке по прямой)
   * Чем больше точек в этой ломаной, тем более она похожа на график, пускай точек будет N=100
   * Если рисовать синус, как он есть, получается еле заметный червячок
   * Чтобы график было хорошо видно, y-координаты надо как-то увеличивать, например, умножать на 100, а x-коордмнаты — на 50
 * {*}
  * Нарисовать черепахой график функции y=sin(x) из ста точек в диапазоне A<=x<=B, где A и B вводятся и поначалу равны, как и раньше, -4 и 5
  * Осознать, что
   * У забора 100 досок и 99 щелей (N и N-1). У графика N точек и N-1 отрезок. Это значит, что в цикле, который генерирует очередное X для того, чтобы вычислить sin(x), самое первое значение должно быть A, а самое последнее — B, и всего таких значений должно быть N
 * Написать для этого функцию diap(N,i,A,B):
  * A и B — диапазон
  * N — общее количество точек, включая первую и последнюю.
  * i — номер очередной точки
  * возвращать функция должна число в диапазоне от A до B, причём при i==0 — A, а при i==N-1 (да-да, не N же!) — B
 * Нарисовать черепахой график функции y=sin(x) из ста точек в диапазоне A<=x<=B, где A и B вводятся, и график получается разумный при abs(B-A)<200 (дальше частокол выйдет)

=== Немного про eval() ===
Осознать природу функции eval()
https://docs.python.org/3/library/functions.html?highlight=eval#eval

 * {*} Упражнение: ввести *в виде строки* произвольную формулу от x (в ней могут встречаться функции из math), ввести x, вывести (с помощью eval()) результат её вычисления
 * Решить предыдущее упражнение, написав *функцию* f(x): , при этом сама программа должна выглядеть примерно так:
{{{
formulae = input()
x = float(input())
print(f(x))
}}}
(очевидно, в этой функции будет исполозовано глобальное имя formulae и eval())

=== Рисуем график дальше ===
 * Вспомнить про аффинные преобразования координат. Из них нам нужно движение и перенос, а поворот не нужен. Если не вспоминается — не страшно. Общая идея
  * Есть вещественное число X на отрезке A…B. Нам нужно получить число P на отрезке Q…R, которое делит это отрезок в той же пропорции
  * Записать пропорцию и вывести из неё формулу P=что-то-там-от-X
 * Написать функцию scale(L,M,X,Q,R), которая по числу X на отрезке L…M вычисляет число P на отрезке Q…R, делящее этот отрезок в той же пропорции
 * scale(L,M,L,Q,R) == Q, scale(L,M,M,Q,R) == R, (подсказка) scale(L,M,(L+M)/2,Q,R) == (Q+R)/2
  * (спойлер!) вычесть начало старого отрезка (получится что-то от 0), поделить на длину отрезка (получится что-то от 0 до 10), умножить на длину нового отрезка, прибавить его начало
 * Осознать, что это более общий вариант функции diap()
  * Переписать «график синуса» с использованием scale() вместо diap()
  * Переписать его далее, с использованием scale() вместо тупого умножения X и Y кооринат (размер экрана мы, допустим, знаем, что-то типа -400,400/-300,300 или как-то так, проверить)
    * график наконец-то будет располагаться по центру
    
 * Попробовать вводить не только диапазон, но и саму формулу (см. выше упражнение про функцию f()), поначалу эта формула == "f(x)", с ней должно работать хорошо
 * Осознать, что
  * Область значений sin(x) — -1…1, а других формул — нет :)
  * Для того, чтобы нарисовать график произвольной функции на отрезке, надо знать диапазон её значений на этом отрезке
    * этот диапазон использовать в scale() при вычислении y-координаты очередной точки на экране
    * Можно, например, запустить цикл с вычислением функции на всех точках, но не рисовать ничего, а только искать минимум и максимум значений (Q и R), а потом уже запустить его ещё раз и рисовать, зная Q и R
 * Переписать программу так, чтобы
  * В цикле создавался список значений функции на отрезке (назовём его g[])
  * Тогда минимум и максимум — это просто min(g) и max(g) (спасибо, Питон!)
  * Можно и список x-ов тоже генерировать, чобы два раза не вычислять
 * Украсить
  * Нарисовать оси координат
  * Написать, где X, где Y
  * Написать, что за функция

=== О рекурсии ===
 * Определение рекурсии
 * прямая и непрямая
 * рекурсия — это цикл, но
  * своё пространство имён
  * ''рост'' пространств имён
 * Почему не факториал
 * {*}
  * '''TODO'''


-----
''TODO'' Здесь пока не разобрано

- СЛОВАРИ!
Line 54: Line 464:
  - Последовательности (введение)
  - Хранимые (строки, кортежи, списки)
    - индексирование, в т. ч. отрицательное
    - секционирование всякое
  - Вычисляемые (range(), enumerate())
  - цикл прохода по последовательности for
  - Каноническая схема цикла
  - break, continue
  - поиск первого, else
  - вложенные циклы
  - ленивый ввод с помощью eval(input())
  - методы объектов, dir(объект) — введение
  - форматирование строк
- Практика
  - Таблица умножения
  - *TODO*!

== День 4 ==
 * словари
Line 73: Line 467:
  - Функции

== День 5 ==
 * Генераторы, конструкторы генераторов
Line 77: Line 470:
  - объекты и методы
  - списки и их методы
   - a is b

== День 6 ==
 * Модули как пространства имён
 . - Классы, …, перегрузка операций
Line 83: Line 474:
  - строки
  - словари

== День 7 ==
- Python
  - Классы

== День 8 ==
- Python
  - Ещё классы и примеры

== День 9 ==
- Какой-нибудь фреймворк

== День 10 ==
- Использование этого фреймворка

 . - Ещё классы, объектное планирование и ООП

- Python / OS

 . - модули os, sys; написание кроссплатформенных приложений

- Python / OS

 . - модуль subprocess

Примерный распорядок дня

  • 10:00-10:30 — повторение и ответы на вопросы
  • 10:30-14:00 — лекции+семинары
  • 14:00-14:30 — обед
  • 14:30-16:00 — практика

Тематический план

Предполагается последовательно проходить этот план, расставляя пометки, сколько удалось сделать за день.

  • {*} — лабораторные работы / семинары (воспроизведение доски или тривиальные упражнения)

  • {i} — практические задания

Рекомендации по самостоятельному изучению

  • Д/З: установить Python и Geany (можно другие IDE) дома, если есть цель научиться чему-то ненулевому

  • Д/З: Щёлкать tutorial (определяем, кому интересно)

День 1 (3 июля)

  • Знакомство, определение уровня знаний и глубины изложения (утро)
  • Орг: конспекты (c двух сторон: Linux+Python), практика обязательна
  • FOSS: сообщество и ПО, Linux, Python
  • Linux и командная строка:
    • «цветочек»+
      • Ядро, программный интерфейс
      • Утилиты, командный интерфейс
      • ФС, пространство имён, файловые объекты
    • ⇒ командная строка (введение)
      • КС как диалог
      • shell: интерпретатор командной строки, ЯП, оболочка надо другими программами
      • договорённости о командной строке (ключи)
      • переменные, где лежат команды (пространство имён), PATH
      • Примеры команд: - ls, cp, rm, mv, mkdir, echo, перенаправление В/В
      • имена файлов, ln, ls -i
      • Встроенная помощь man
    • {*}

      • посмотреть содержимое корня
      • посмотреть все файлы в текущем каталоге
      • посмотреть документацию к известным командам
      • создать файл, переименовать
      • создать каталог, скопировать туда файл, удалить каталог
  • Python
    • Командная строка
      • объекты, их типы
      • действия над объектами
      • неявная динамическая типизация
      • преобразование типов, type() (в т. ч. type(a)(b)) и простейший ввод-вывод
      • пространства имён, связывание объектов именами, dir()
      • множественное связывание, id()
      • help()
    • {*}

      • вычисление формул
      • поэтапное вычисление формул с использованием имён
      • online python tutor: демонстрация связывания
  • Сценарии
    • Текстовый редактор vs IDE
    • Linux, shebang
    • программа на Python
    • {*}

      • Использование geany
      • примитивный сценарий на shell
      • сделать сценарий исполняемым и переместить в каталог $HOME/bin/

      • примитивный сценарий на Python

День 2 (4 июля)

  • Python
    • понятие о модулях, from math import *

    • {i}

      • ручное развёртывание бинарного возведения в степень (например, как получить 321?)

      • вычисление формул

    • условные операторы и выражения
      • логический тип, операции сравнения
      • условное выражение a if b else c
      • базовый if
      • форматирование отступами
      • if / elif* / else
    • {*}

      • ввести два числа, вывести наибольшее
        • условным выражением
        • условным оператором
      • ввести два числа, вывести, больше, меньше или равно первое второму
      • ввести три числа, проверить неравенство треугольника (вложенный if)
    • {i}

      • ввести три числа, найти наибольшее (вложенный if)
        • условным выражением
        • условным оператором
    • алгебра логики
      • пустой объект, примеры
      • любое выражение в условии

      • таблицы истинности
      • логические операции Python, их таблицы истинности
      • примеры
    • {*}

      • ввести три числа, проверить неравенство треугольника (с помощью or)

    • {i}

    • цикл while
      • каноническая схема цикла: инициализация, проверка условия, тело, изменение
      • пример: цикл по вводу
    • {*}

      • подсчёт произведения (ввод до 0)
      • сумма N элементов арифметической прогрессии (циклом)
      • факториал
    • {i}

      • с какого элемента сумма арифметической прогрессии превысит N?
      • таблица умножения на N (в столбик)
      • подсчёт среднего (ввод до 0)
  • Python
    • Циклы (более сложные случаи)
      • условия внутри циклов, break, continue
      • поиск первого, else
      • вложенные циклы
    • {*}

      • Сумма только положительных (ввод до 0)
      • одновременный подсчёт суммы и произведения положительных чисел (используется continue для отрицательных)
      • ввести ненулевые числа, проверить, есть ли среди них отрицательные
        • без else (с break)
        • с else
      • большая таблица умножения в столбик
    • {i}

      • таблица умножения в виде матрицы по столбцам (без форматирования)

День 3 (5 июля)

  • Последовательности (введение)
    • Хранимые (строки, кортежи, списки)
      • индексирование, в т. ч. отрицательное
      • операции поэлементного сравнения
        • операция is на примере списков

      • операции + и *

      • секционирование
        • обычное
        • с шагом
        • умолчания
      • {*}

        • какая последовательность больше и почему?
        • начальный, средний и конечный элемент
        • элементы, стоящие на 1,4,7, и т. д. местах (NB off by 1)
      • {i}

        • сначала элементы, стоящие на нечётных местах, затем — на чётных, задом наперёд
  • цикл прохода по последовательности for
    • break, continue, else

    • {*}

      • выбор максимума
      • поиск 0
  • Вычисляемые (range(), enumerate())
    • типичный for
    • {*}

      • переписать на for кое-какие примеры с while
    • {i}

      • ввести последовательность чисел, вывести второй максимум, то есть элемент, больше которого в последоватнльности только одно значение, например, для 1,1,2,2,7,7,3,3,5,5 второй максимум — это 5

  • Конструктор списка
  • Конструктор генератора, работа генератора, цикл for и генераторы
  • Как работает множественное связывание
    • распаковка последовательностей при связывании
    • в цикле for (последовательность последовательностей)
    • a,b,*c,d = "Qwertyuiop"

  • Кратко о строках
    • +, *
    • "".format()

  • {i}

    • Вывести все стороны и площади треугольников, стороны которых — однозначные положительные целые числа (не надо использовать конструктор, это жесть!)
      • использовать формулу Герона
      • не забыть, что 1 2 3, 1 3 2 и прочие перестановки — один и тот же треугольник, выводить один раз1
    • вывести таблицу умножения от 1 до 12 (сначала без "".format(), потом (если успеете) с ним):

      •     1*1 = 1   2*1 = 2   3*1 = 3
            1*2 = 2   2*2 = 4   3*2 = 6
            ...
            1*12 = 12 2*12 = 24 3*12 = 36
            4*1 = 4   5*1 = 5   6*1 = 6
            4*2 = 8   5*2 = 10  6*2 = 12
            ...
            4*12 = 48 5*12 = 60 6*12 = 72
            7*1 = 7   8*1 = 8   9*1 = 9
            7*2 = 14  8*2 = 16  9*2 = 18
            ...
    • Ввести строку, вывести, сколько в ней гласных (подсказка: c in "aeoiu" :) ), методами не пользоваться

    • Ввести список запрещённых слов в формате "слово1","слово2",..., затем вводить строки до тех пор пока последняя не окажется пустой (это так же, как ввод до 0). Вывести, сколько строк содержали запрещённые слова

День 4 (6 июля)

Функции (введение)

  • Задача повторного использования кода — макросы и подпрограммы
  • Функции в Python
    • Функция — это запись алгоритма обработки данных, а не преобразование
    • duck typing

    • вызов функции — выражение, всегда есть возвращаемое значение — любой объект (например, None)
    • возвращаемое значение можно не использовать
    • Определение функции, формальные параметры
      • {*} простые примеры

    • Локальное пространство имён функции
      • просто вывод dir()

      • независимость имён
      • locals() и globals()

        • {*} просто вывод

      • порядок просмотра пространств
      • автоопределение локальных имён; global
        • {*}

    • {i}

      • с этого момента и до конца курса каждые модуль/функция/класс в заданиях {i} должны содержать docstring с пояснением, что они делают

      • (задания в этом {i} -блоке оформить в виде интерактивной программы и в виде модуля)

      • Функция — сумма цифр
        • Ввести последовательность, вывести элемент с минимальной суммой цифр
          • <!> можно с помощью min() — как?

      • функция — расстояние между точками ( <!> на самом деле есть :) )

        • Ввести список пар вида (1,2), (3,4), (100,100) …, найти самый удалённые точки

  • Распаковка и запаковка параметров функций
    • ничего и нет, только списки
    • Функции с переменным количеством параметров
      • {*}

    • Распаковка последовательности при вызове
      • {*}, в т. ч. print(*seq)

  • {i}

    • функция, возвращающая список только целочисленных из всех параметров

  • Всё остальное про функции — потом, не сегодня

Методы объектов; модули

  • Поля объектов, инкапсуляция
    • dir(объект)

    • объект.имя_поля

    • методы и … поля
  • Модули, sys.path

    • программа на Python как модуль
    • встроенная и в среду Python, и в язык Python документация
      • help()

      • документирование собственного кода
        • docstring
        • object.__doc__

    • {*}

Строки и их методы

  • Строковые методы
    • все (в т. ч. in)

    • replace()

      • {*}

    • split() и join()

      • {*}

  • {i}

    • Ввести строку, заменить в ней последовательности "-" на один минус
    • Ввести запрещённое сочетание букв и строку. Вывести строку, в которой запрещённое сочетание букв не встречается (например, "ab" и "aabbcaabbb" → "cb")

Списки и их методы

  • все методы
  • стек, суть pop()/push(), эффективность
  • очередь и deque()
  • {i} Функция: список -> список

    • Список всех делителей числа
    • Убрать из списка подряд идущие одинаковые элементы
      • <!> Для уверенных в себе: То же, но повторять, пока таких групп не останется.

День 5 (7 июля)

Ещё немного обо всём

  • zip(последовательность, последовательность, ...)

    • удобнее всего одинаковой длины
    • столько же элементов, сколько в аргументе наименьшей длины, остальные отбрасываются

    • {*}

      • (07.02) Ввести матрицу N*M, выдать транспонированную матрицу
    • {i}

      • Ввести N строк, проделать то же самое
  • lambda arguments: returnexpr

  • python3 matrix_generator.py | python3 another_program.py

    • работает везде: Linux, Windows, OS X, any other Unix
    • в т. ч. возможность писать самые настоящие автоматические тесты для своих программ!

Про random

  • Случайное и неслучайное, зачем нужно
  • Датчик случайных чисел
    • неслучайность
    • воспроизводимость, seed()
  • Модуль random

    • random() , randint(), randrange()

    • choice(), shuffle(), sample()

    • seed()

  • {*}

    • Случайное число на отрезке A…B
      • Гистограмма (список частот для возможных значений)
    • Перемешать строку
    • Случайные слова случайной длины
    • Генератор значений для 07.02 (транспонирование матрицы)
  • {i}

    • в каждой функции, которую пишете, краткий docstring, к хорошему тону надо привыкать

    • Функция, с вероятностью 1/3 выдающая "yes", с 2/3 "no". (без модуля random, кроме random.random)

      • Программа, выводящая выборку из N вызовов такой функции и гистограмму (кол-во "yes" и кол-во "no")
    • Функция, выдающая случайные произносимые слова случайной длины (запихать в модуль)

      • if __name__ == "__main__": краткое демо

    • Используя модуль произносимых слов: функция, генерирующая несколько предложений из нескольких случайных слов.
    • Используя модуль-генератор предложений: ввести слово; посчитать, сколько раз оно встретилось в сгенерированных предложениях.
      • можно не слово, а букву или комбинацию букв, с точки зрения Python одно и то же

    • В первой программе сгенерировать двумерный список чисел случайно и вывести на экран
      • в другой: среди всех минимумов в строчках полученной матрицы найти максимум
      • тестируем при помощи конвейера (что-то сродни python3 gen.py | python3 program.py)

      • обратите внимание, что по pipe между программами проходит текст, т. е. строчки символов

Про черепаху

  • Модуль turtle

  • Основные команды
  • Как закрасить область
  • {i}

    • Функция, рисующая домик размера N пикселей.
    • Функция, рисующая ёлочку из n треугольников размера от k до l
    • лес с разными ёлочками
      • <!> немного не параллельными

  • дальше не успеем

День 6 (10 июля)

  • Q: был вопрос о разнице между " и ' в Python.

    • A: Разницы нет никакой, кроме стилистической: хорошим тоном считается использовать для docstring двойные кавычки.
    • см. PEP 257 на эту тему

Работа с файлами

  • Текстовые файлы
    • open(), read() / write() / close()
    • readlines() он же сам файл, print(.. file=)
    • "b/t" — str или bytes
  • {i}

    • отсортировать текстовый файл по длине строк
  • файлы с данными
    • если данные наши: сериализация/десериализация, pickle (json, xml, …)

      • dump[s]()/load[s]()
    • если данные готовы: struct

      • byte order :(

      • pack()/unpack()
  • {i}

    • Ввести имя, фамилию, возраст и средний балл, сериализовать в файл; в другой программе прочесть из этого файла
    • То же, что и выше, но с помощью struct

Понятие оценки сложности алгоритма

  • Оценка сложности: количество операция на единицу обрабатываемых данных
    • насколько замедляется алгоритм при количестве данных
      • +1
      • *2
      • → производная!
  • Индексирование
  • Поиск
  • все возможные сочетания

=== Бинарный поиск и сортировка ==

  • Бинарный поиск и оценка его сложности
  • Примитивная сортировка и оценка её сложности
  • Сортировка слиянием
  • «Быстрая» сортировка, худший случай
  • Сортировка кучей
  • {i}

    • бинарный поиск строк в файле
    • сортировка файла слиянием

Словари и множества

  • Задача хранения и индексирования
    • сложных данных
    • просто слишком больших данных
    • +невосстановимое хеширование
  • Свойстсва хеш-функции
    • неоднозначность
    • распределённость по ОЗ (на конкретных данных!)
      • разброс для почти похожих
    • невосстановимость объекта (сравнение без раскрытия)

⇒ Возможности

  • индексирование
  • сортировка и поиск

Примеры

  • a % b
  • int(sin(b)*100)
  • hash(), какие объекты хешируются

  • ...

Множество — просто хеш-таблица

  • Задание, в т. ч. циклический конструктор
  • Операции над множествами, методы
  • Типичное использование
  • {*}

    • каких букв не хватает
  • {i}

    • вводятся предложения, проверить, есть ли общее слово (регистр букв игнорировать)

Словарь — множество с атрибутами, т. е. соответствие множества хешируемых ключей множеству произвольных объектов

  • Задание, в т. ч. циклический конструктор
  • Операции над множествами, методы
  • Типичное использование:
    • ...
    • globals()/locals()
    • именные параметры функции
  • {*}

    • Словари и счётчики
      • ручная реализация счётчика
      • collections
  • {i}

    • генератор файла со случайными словами
      • +неравномерное распределение слов (как?)
    • подсчёт слов в файле, гистограмма


turtle

  • {*}

    • Попробовать нарисовать черепахой график функции y=sin(x) в диапазоне -4<=x<=5 (использовать абсолютные координаты, то есть функцию goto(x,y))

    • Осознать, что:
      • График — это не кривая, а ломаная (передвижение черепашки от точки к точке по прямой)
      • Чем больше точек в этой ломаной, тем более она похожа на график, пускай точек будет N=100
      • Если рисовать синус, как он есть, получается еле заметный червячок
      • Чтобы график было хорошо видно, y-координаты надо как-то увеличивать, например, умножать на 100, а x-коордмнаты — на 50
  • {*}

    • Нарисовать черепахой график функции y=sin(x) из ста точек в диапазоне A<=x<=B, где A и B вводятся и поначалу равны, как и раньше, -4 и 5

    • Осознать, что
      • У забора 100 досок и 99 щелей (N и N-1). У графика N точек и N-1 отрезок. Это значит, что в цикле, который генерирует очередное X для того, чтобы вычислить sin(x), самое первое значение должно быть A, а самое последнее — B, и всего таких значений должно быть N
  • Написать для этого функцию diap(N,i,A,B):
    • A и B — диапазон
    • N — общее количество точек, включая первую и последнюю.
    • i — номер очередной точки
    • возвращать функция должна число в диапазоне от A до B, причём при i==0 — A, а при i==N-1 (да-да, не N же!) — B
  • Нарисовать черепахой график функции y=sin(x) из ста точек в диапазоне A<=x<=B, где A и B вводятся, и график получается разумный при abs(B-A)<200 (дальше частокол выйдет)

Немного про eval()

Осознать природу функции eval() https://docs.python.org/3/library/functions.html?highlight=eval#eval

  • {*} Упражнение: ввести *в виде строки* произвольную формулу от x (в ней могут встречаться функции из math), ввести x, вывести (с помощью eval()) результат её вычисления

  • Решить предыдущее упражнение, написав *функцию* f(x): , при этом сама программа должна выглядеть примерно так:

formulae = input()
x = float(input())
print(f(x))

(очевидно, в этой функции будет исполозовано глобальное имя formulae и eval())

Рисуем график дальше

  • Вспомнить про аффинные преобразования координат. Из них нам нужно движение и перенос, а поворот не нужен. Если не вспоминается — не страшно. Общая идея
    • Есть вещественное число X на отрезке A…B. Нам нужно получить число P на отрезке Q…R, которое делит это отрезок в той же пропорции
    • Записать пропорцию и вывести из неё формулу P=что-то-там-от-X
  • Написать функцию scale(L,M,X,Q,R), которая по числу X на отрезке L…M вычисляет число P на отрезке Q…R, делящее этот отрезок в той же пропорции
  • scale(L,M,L,Q,R) == Q, scale(L,M,M,Q,R) == R, (подсказка) scale(L,M,(L+M)/2,Q,R) == (Q+R)/2
    • (спойлер!) вычесть начало старого отрезка (получится что-то от 0), поделить на длину отрезка (получится что-то от 0 до 10), умножить на длину нового отрезка, прибавить его начало
  • Осознать, что это более общий вариант функции diap()
    • Переписать «график синуса» с использованием scale() вместо diap()
    • Переписать его далее, с использованием scale() вместо тупого умножения X и Y кооринат (размер экрана мы, допустим, знаем, что-то типа -400,400/-300,300 или как-то так, проверить)
      • график наконец-то будет располагаться по центру
  • Попробовать вводить не только диапазон, но и саму формулу (см. выше упражнение про функцию f()), поначалу эта формула == "f(x)", с ней должно работать хорошо
  • Осознать, что
    • Область значений sin(x) — -1…1, а других формул — нет :)

    • Для того, чтобы нарисовать график произвольной функции на отрезке, надо знать диапазон её значений на этом отрезке
      • этот диапазон использовать в scale() при вычислении y-координаты очередной точки на экране
      • Можно, например, запустить цикл с вычислением функции на всех точках, но не рисовать ничего, а только искать минимум и максимум значений (Q и R), а потом уже запустить его ещё раз и рисовать, зная Q и R
  • Переписать программу так, чтобы
    • В цикле создавался список значений функции на отрезке (назовём его g[])
    • Тогда минимум и максимум — это просто min(g) и max(g) (спасибо, Питон!)
    • Можно и список x-ов тоже генерировать, чобы два раза не вычислять
  • Украсить
    • Нарисовать оси координат
    • Написать, где X, где Y
    • Написать, что за функция

О рекурсии

  • Определение рекурсии
  • прямая и непрямая
  • рекурсия — это цикл, но
    • своё пространство имён
    • рост пространств имён

  • Почему не факториал
  • {*}

    • TODO


TODO Здесь пока не разобрано

- СЛОВАРИ!

- Python

  • словари

- Python

  • Генераторы, конструкторы генераторов

- Python

  • Модули как пространства имён
  • - Классы, …, перегрузка операций

- Python

  • - Ещё классы, объектное планирование и ООП

- Python / OS

  • - модули os, sys; написание кроссплатформенных приложений

- Python / OS

  • - модуль subprocess

Python/Summer2017 (last edited 2021-04-27 20:23:39 by FrBrGeorge)