diff --git a/README.md b/README.md new file mode 100644 index 0000000..75fa4b7 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Программное обеспечение автоматизированных систем + +* Методические указания и варианты заданий — в списке файлов выше. +* [Журнал](https://docs.google.com/spreadsheets/d/1uGsxa_9xjY6y4EMA6FA5owEf-m1H638FbAx5oAga84k) +* [Комментарии к методическим указаниям](comments.md) diff --git a/comments.md b/comments.md new file mode 100644 index 0000000..39d158a --- /dev/null +++ b/comments.md @@ -0,0 +1,169 @@ +--- +title: Комментарии к пособию +author: Дмитрий Козлюк +date: 2022-11-28 +--- + +## Тема 4 + +### 2.4, 2.5 + +> Похожая на eval функция exec – чтение и выполнение объекта-аргумента функции. +> +> exec(input('введите инструкции=')) + +Вопреки написанному, `exec()` не занимается считыванием ввода пользователя. +Вместо `input()` аргумент `exec()` мог бы быть переменной +или фиксированной строкой; +и наоборот, аргументом `eval()` мог бы быть пользовательский ввод. + +Отличие `eval()` от `exec()` в том, +что `eval()` вычисляет выражение (expression), +а `exec()` выполняет инструкции (statements). +Выражения — подмножество инструкций, отличающееся наличием результата. +Например, `1`, `1+2`, `a+3` — выражения, +а присваивание или условный оператор — инструкции. + +Единственное адекватное использование `eval()` на практике — +вычисление по выражению, заданному пользователем. +[Никогда][kungfu] не используйте `exec()` в реальных задачах (пока эти советы вам нужны). +На занятиях используйте `exec()` только если задание явно это подразумевает, +например, требуется создать заранее неизвестное количество переменных. + +[kungfu]: http://rsdn.org/forum/info/FAQ.philosophy.kungfu + +### 5 + +Функция `random.seed()` инициализирует начальное состояние генератора +псевдослучайных чисел. + +В обычном компьютере нет ничего случайного. +Как же работает `random.random()`? +Используется генератор *псевдослучайных* чисел (ГПСЧ): +есть скрытое состояние (переменная в модуле `random`), +на основе которого генерируется очередной результат `random.random()`, +а само состояние обновляется. +Генерация устроена так, что распределение результатов близко к равномерному. +Очевидно, что последовательность полностью определяется начальным состоянием. +Оно и называется seed (англ. «семечко»), по-русски — затравка. +Если вызвать `random.seed()` без параметров или не вызывать ее, +начальное состояние будет зависеть от текущего времени +или от времени запуска программы. + +Зачем задавать начальное состояние, иначе говоря, зачем может понадобиться +зафиксировать последовательность, которую выдает `random.seed()`? + +* **Воспроизводимость результатов.** + Если программа моделирует что-то, используя случайные числа, + то желательно, чтобы результаты были одинаковы при каждом запуске. + Тогда исследователи могут повторять и проверять эксперименты друг друга. + Например, статьи по машинному обучению часто начинаются с задания seed. + +* **Компактное представление случайных параметров.** + Если программа генерирует что-либо с большим количеством случайных + параметров, она может не сохранять их все, а сохранить только seed, + параметры же сгенерировать снова при следующем запуске. + Так генерируются игровые миры в Minecraft и Dwarf Fortress. + +[Аналогичное объяснение, которое иногда находят и присылают.][random.seed] + +[random.seed]: https://docs-python.ru/standart-library/modul-random-python/initsializatsija-sostojanie-generatora + +## Тема 5 + +### 3.5 + +Такая конструкция называется list comprehension, а не «запись цикла в строке». +Внутри квадратных скобок записано выражение-генератор (см. тему 4). + +## Тема 6 + +### 2.2 + +Насчет псевдокомментария `# -*- coding: utf-8 -*-` + +Как и любой текст, код в файле `*.py` может быть в разных кодировках. +По умолчанию Python ожидает кодировку UTF-8. +Таким образом, указывать псевдокомментарий выше бессмысленно — +он требует от Python сделать то, что делается и без псевдокомментариев. +Имеет смысл использовать UTF-8 для своих программ. +Если же по какой-то причине файл сохранен, например, в кодировке Windows-1251, +псевдокомментарий будет `# -*- coding: windows-1251 -*-`. +Если его не поставить, а в коде есть символы кириллицы, +интерпретация завершится с ошибкой: + +``` +SyntaxError: Non-UTF-8 code starting with '\x...' in file ... +``` + +Кодировка программы не влияет на ее возможность работы с кириллицей, +только на использование кириллицы в коде программы, в том числе в комментариях. + +### 2.3 + +Обратите внимание, что при вызове `sys.stdout.write()` +печатается не только аргумент функции, но и некоторое число. +Разберитесь, что это за число и почему оно печатается. + +### 4.4 + +Частая ошибка: `fp.close` вместо `fp.close()`. +Первое выражение не вызывает метод `close()`, поэтому файл остается открытым. + +На практике для работы с файлами рекомендуется конструкция `with`: + +```python +with open('path', 'r') as fp: + ... # работа с fp +# блок with окончен, fp автоматически закрыт +``` + +### ОКЗ + +В последнем пункте каждый список должен быть занесен в отдельную переменную, +имя которой формируется динамически. + +## Тема 7 + +### 4.8, 4.8 + +О синтаксисе аргументов с одной (`*args`) или двумя (`**kwargs`) звездочками +можно найти сведения по запросу «keyword arguments». + +### 6 + +Никогда не используйте глобальные переменные, кроме констант. +Иначе ни про какой вызов функции нельзя будет сказать, что он сделает, +ориентируясь на аргументы, потому что еще может быть зависимость +от текущего значения глобальной переменной. +Это крайне затрудняет понимание и отладку программ. + +### ОКЗ, пункт 2 + +Рекомендуется проверить построение гистограммы на таких списках: + +* `list(range(1, 8))` +* `list(range(1, 9))` + +## Тема 8 + +### 2.3 + +При использовании `import` Python по умолчанию считает, +что файл имеет кодировку UTF-8, а также учитывает псевдокомментарии. +При использовании `open()` Python считает, что у файла «системная» кодировка, +которая в Linux обычно UTF-8, а в Windows — UTF-16. +Поэтому, если файл в UTF-8, то нужно передать `open()` дополнительный аргумент +для указания кодировки (найдите его в справке), иначе код модуля будет выполнен, +но вместо кириллицы будут кракозябры. + +### 3.3 + +Обратите внимание: нужно именно изменить `Mod1.perm1`, +а не взять ее значение, умножить на три и вывести либо присвоить +новой переменной. + +## Тема 9 + +Будьте готовы объяснить, что дает программисту использование классов +по сравнению с использованием функций. diff --git a/Методические указания по ПО АС.doc b/Методические указания по ПО АС.doc new file mode 100644 index 0000000..bb2880a Binary files /dev/null and b/Методические указания по ПО АС.doc differ diff --git a/Тест по модулю 1 ПО АС.doc b/Тест по модулю 1 ПО АС.doc new file mode 100644 index 0000000..986ec50 Binary files /dev/null and b/Тест по модулю 1 ПО АС.doc differ diff --git a/Тест по модулю 2 ПО АС.doc b/Тест по модулю 2 ПО АС.doc new file mode 100644 index 0000000..ad0c4f4 Binary files /dev/null and b/Тест по модулю 2 ПО АС.doc differ diff --git a/Тест по модулю 3 ПО АС.doc b/Тест по модулю 3 ПО АС.doc new file mode 100644 index 0000000..ba90251 Binary files /dev/null and b/Тест по модулю 3 ПО АС.doc differ