Типы данных языка программирования python

Автор
Алан Г. Айзек
Организация
Факультет экономики. Американский университет
Контакты
aisaac@american.edu
Дата
2020-08-07

Алгоритм

Алгоритм-это процедура. Которая надежно выполняет хорошо заданную задачу за конечное число шагов. Алгоритм, который производит и выводит данные. Можно сравнить с функцией. В то время как функция определяет отношение между входами и выходами. А алгоритм определяет шаги. Связанные с преобразованием входов в выходы. Множество различных алгоритмов могут быть способны реализовать одну функцию. (Например. Факторная функция может быть реализована с помощью рекурсии или итерации.)

Утверждение

Утверждение среды выполнения требует. Чтобы программа прошла тест. Чтобы продолжить работу.

Тест-это предикат (т. е. утверждение истинно–ложно). Утверждение утверждает. Что программист считает. Что предикат (где он помещен) всегда будет вычисляться true. Если предикат терпит неудачу. Это означает. Что логика программиста потерпела неудачу и что код нуждается в отладке. Распространенной практикой является использование утверждений во время разработки кода. Но их отключение в выпущенном коде.

Подсказка

Чтобы создать утверждение времени выполнения в NetLogo. Используйте ifоператор an для проверки отказа предиката и при сбое поднимите an error. NetLogo не предоставляет встроенного механизма для отключения таких утверждений.

Ассоциативный массив

Ассоциативный массив-это набор пар ключ-значение. Каждый ключ встречается один раз. Значения связаны с ключами. Фактически, ключ служит индексом его ценности. Поскольку это похоже на то. Как настоящие словари используют слова для индексации определений. Ассоциативный массив часто называют словарем.

Как абстрактный типданных ассоциативный массив должен поддерживать определенные операции. Наиболее фундаментальной является операция поиска: доступ к значению с помощью ключа. Ассоциативные массивы обычно изменчивы: пары ключ-значение могут быть добавлены или удалены. А значение. Связанное с ключом. Может быть изменено (переназначено).

Например, ассоциативный массив может использовать имена художников в качестве ключей и связывать с каждым именем список известных работ. Новый художник может быть добавлен в массив, возможно. С изначально пустым списком работ. Создание художником новой работы требует. Чтобы одно и то же имя было связано с более длинным списком работ.

Термин хэш-таблица часто используется синонимично термину ассоциативный массив. Однако термин хэш-таблица более правильно обозначает конкретную реализацию абстрактного типа данных ассоциативного массива. Которая предназначена для особенно быстрой операции поиска.

Подсказка

tableРасширение обеспечивает реализацию ассоциативных массивов. table:makeКоманда создает новую таблицу. table:putКоманда добавляет новую пару ключ-значение (переопределяя любое существующее значение для ключа). Особенно полезна table:get-or-defaultкоманда. Которая сообщает связанное значение. Если ключ существует. Но в противном случае сообщает значение по умолчанию. Дополнительные сведения см. в документации по расширению.

Атрибут

Этот курс использует термин атрибут в очень общем и независимом от языка виде. С точки зрения концептуальной модели. Основанной на агенте. Агент имеет атрибуты данных и поведенческие атрибуты. Во многих настройках атрибуты данных называются просто атрибутами. А поведенческие атрибуты-методами или свойствами. В этой книге обычно используются термины атрибут и поведение.

Атрибуты данных агента характеризуют его текущее состояние. Это очень общее понятие. wealthАтрибут может хранить богатство агента в виде реального числа; friendsатрибут может хранить социальные контакты агента в виде списка агентов.

Поведенческие характеристики агента характеризуют его возможные варианты поведения. Это тоже очень общее понятие. Но обычно возможные варианты поведения зависят от типа агента. supplyПоведение может быть доступно только агентам-предпринимателям. В то время demandкак поведение может быть доступно только агентам-потребителям. В объектно-ориентированном языке программирования поведенческий атрибут агента может быть реализован как метод класса агента.

В процедурно-ориентированном языке программирования поведенческий атрибут агента может быть реализован как процедура, специфичная для определенного типа агента. Наше представление о поведенческом атрибуте не зависит от подобных соображений. Поведенческие характеристики определяются концептуальной моделью. А не программной реализацией.

Доступ к атрибутам

Некоторые языки программирования включают объекты с атрибутами. Доступ к которым осуществляется по имени. Синтаксис доступа к значению атрибута зависит от языка.

Подсказка

В NetLogo мы говорим. Что агенты владеют своими атрибутами данных. Поведенческий

Патчи, черепашки и ссылки имеют встроенные атрибуты. Например, патчи имеют pcolorатрибут. Патчи, черепашки и ссылки также могут иметь пользовательские атрибуты. Например. Мы можем добавлять атрибуты к патчам с patches-ownпомощью ключевого слова.

Получите доступ к ним вместе с ofоператором. (Например, [pcolor] of patch 0 0.) Возможно. Это удивительно. Но мы также можем использовать ofсписок значений атрибутов для всего набора агентов. (Например, [pcolor] of patches.) При этом доступ к набору агентов осуществляется в случайном порядке и создается список значений атрибутов.

Подсказка

Для доступа к атрибутам Python использует оператор точки, распространенный в объектно-ориентированных языках. Python предлагает механизмы управления получением и настройкой атрибутов. Таких как свойства. Которые мы не будем обсуждать.

Паутинный сюжет

Мы будем использовать термин Это иногда называют “схемой Верхульста” (подробнее см. статью Википедии о Паутинном участке.)

Кодовый блок

Блок кода-это единица исполнения. Грубо говоря. Весь блок кода можно абстрактно рассматривать как один оператор. Целая программа может рассматриваться как большой кодовый блок. Содержащий меньшие кодовые блоки. Ярким примером является тело функции. Другие примеры могут включать тело циклической конструкции и тело ifоператора. Во многих языках переменные. Введенные во внутренний кодовый блок. Не могут быть видны во внешних кодовых блоках. Такие языки предоставляют переменным область действия блока.

Командная оболочка

При использовании компьютера пользователи обычно используют периферийные устройства (например. Клавиатуру. Мышь или сенсорный экран) для предоставления инструкций программному приложению. Приложение взаимодействует с операционной системой. Которая взаимодействует с компьютером и его периферийными устройствами. Иногда пользователю требуется достаточно прямой доступ к службам операционной системы. Чтобы выполнить низкоуровневую задачу. Такую как переименование или удаление файла. Оболочка-это программное приложение. Которое предоставляет такие низкоуровневые услуги. Командная оболочка это программное приложение обеспечивает этот низкоуровневый доступ с помощью интерфейса командной строки (CLI). Использование CLI требует изучения набора команд. Которые могут быть введены. Как правило. С клавиатуры. В командную строку оболочки. Примеры включают OSX Terminal. GNU bash и Windows Powershell.

Условное ветвление

Условие-это выражение. Которое всегда вычисляется trueкак или false. (Такие выражения являются двоичными или булевыми.) Ветвь — это блок кода. Который может быть выполнен или пропущен. Термин условное ветвление указывает на то. Что выполнение ветви зависит от значения условия. Языки программирования обычно предоставляют ветвящиеся конструкции, которые позволяют реализовать условное ветвление.

Программисты часто хотят определить. Следует ли выполнять блок кода на основе условия. Например. Изменяет ли функция абсолютного значения значение ее входных данных. Зависит от того. Является ли это значение отрицательным. В качестве другого примера мы можем пожелать. Чтобы итерационная фаза моделирования продолжалась только в том случае. Если критерий остановки не был удовлетворен. В таких случаях мы можем использовать какое-то условное ветвление.

Условное Выражение

Мы оцениваем вычислительное выражение. Чтобы получить полезное значение. Условное выражение имеет значение. Которое зависит от условия. Это значение получается путем вычисления одного выражения. Если условие естьtrue, и другого. Если условие есть false. Важно отметить. Что языки. Поддерживающие условные выражения. Не оценивают обойденное выражение. Например, NetLogo предоставляет ifelse-valueпримитив для условных выражений и ifelse-value (x != 0) [(sin x() / x][1]безопасно вычисляет. Даже если x = 0. Аналогично. В Python math.sin(x) / x if x != 0 else 1вычисляется безопасно. Даже если x = 0.

оператор if

Наиболее известной условной конструкцией, вероятноif, является оператор. Который делает выполнение блока кода зависимым от значения логического условия. Зависимый блок кода будет выполнен . Если условие будет выполненоtrue, но в противном случае он не будет выполнен. Часто мы также предоставляем альтернативный блок кода. Который выполняется. Если условие равно false. Эту альтернативу часто называют elseклаузулой.

Возможны более сложные варианты. См. https://en.wikipedia.org/wiki/Conditional_%28computer_programming%29

Подсказка

В Словаре NetLogoпрочитайте документацию NetLogo для if,ifelse, и ifelse-value. Рассмотрим обсуждение условного ветвления в приложении NetLogo Programming. Хотя NetLogo не требует круглых скобок вокруг условия. Вы можете включить их в качестве вспомогательного средства для удобства чтения.

Разделение команд–запросов

Разделение команд–запросов (CQS) — это принцип. Согласно которому функция, возвращающая значение. Не должна вызывать изменения состояния. Этот принцип иногда называют разделением ответственности между командами и запросами (CQRS). Запрос возвращает значение и не имеет никаких побочных эффектов. Чистая функция, таким образом. Является запросом. Где все входные данные являются явными. Команда вызывает изменение состояния; соответственно. Она не должна возвращать значение.

CQS чаще всего реализуется соглашением. С различной степенью языковой поддержки. Даже языки, которые в основном чтят CQS. Обычно делают несколько исключений. Например. Изменяемый список может иметь popоперацию. Которая возвращает последний элемент списка и удаляет его из списка.

Подсказка

NetLogo различает командные процедуры и процедуры reporter. Что предполагает различие между командами и запросами. Тем не менее. Каждый программист NetLogo может создавать процедуры репортера. Которые не имеют побочных эффектов.

Подсказка

Python используется defдля определения как запросов. Так и команд. Отсутствие returnоператора сигнализирует об определении команды. Но Python все равно возвращается Noneв этом случае.

Тип данных

Тип данных предоставляет пользователю возможность использовать данные,определяя поведение (т. Е. Операции с данными). Абстрактный тип данных (ADT) — это абстрактное (например. Математическое) описание такого поведения. Абстрактный тип данных является чистым, если он не предоставляет никаких операций для изменения своих данных: пользователь может получить информацию о данных. Но не может изменить их.

Абстрактный тип данных дает абстрактную (например. Математическую) характеристику поведения структуры данных. Структура данных определяет конкретную реализацию поведения. Поэтому она должна включать сведения о хранении данных и операциях с данными. Которые скрыты за абстрактным типом данных. Например, в то время как ADT может определять концепцию индексированной коллекции элементов и поведение извлечения элемента по индексу. Структура данных будет определять. Как элементы размещаются в памяти и как. Соответственно. Должно быть реализовано поведение поиска. Грубо говоря. Структура данных определяет. Как ADT может быть реализован как конкретный тип данных. Или мы можем сказать. Что ADT-это абстракция структуры данных. Которая фокусируется на поведении. Наблюдаемом через простой интерфейс.

Различные структуры данных могут реализовать один и тот же ADT. Структура данных для чистого ADT должна быть без состояния.

Тип данных — это конкретная реализация структуры данных на языке программирования. К сожалению. Имена типов данных широко варьируются в разных языках. Как и разнообразие типов данных. Предоставляемых языком. В дополнение к простым типам данных (например. Типам чисел) большинство языков предоставляют некоторые структурированные типы данных (которые содержат коллекции других типов данных). Большинство языков предоставляют по крайней мере один структурированный тип данных. Где элементы могут быть получены путем предоставления целочисленного индекса.

В компьютерном программировании тип данных определяет. Как значение обрабатывается во время выполнения программы. Большинство языков программирования поддерживают простой тип. Обычно используемый для представления значений истинности. Простой тип. Обычно используемый для представления целых чисел. И простой тип. Обычно используемый для представления вещественных чисел. Для удобства мы будем называть эти типы данных логическими, целочисленнымии реальными. (Подробнее см. статью Википедии о типах данных.

Экземпляры типа данных идентифицируются только по их значению. Если два типа данных имеют одинаковое значение. Экземпляры считаются идентичными. Тип данных может содержать атрибуты. Но только для поддержки моделирования структурированных типов данных. Экземпляры структурированных типов данных считаются одинаковыми если выполняются следующие условия:

Структура типов данных идентична Значения соответствующих атрибутов идентичны

Как показано на следующем рисунке. Артефакт типа данных отображается в виде прямоугольника. Содержащего имя типа данных. Прямоугольник также содержит стереотип «тип данных» и значок типа данных.

Логический тип данных принимает одно из двух значений. Часто называемых trueили false. Целочисленный тип данных представляет только целочисленные значения. Реальный тип данных может дополнительно представлять дробные значения. Некоторые языки (например. Javascript или NetLogo) не имеют отдельного целочисленного типа.

Простой тип данных и структурированный тип данных имеют связанную структуру данных и. Следовательно. Связанный ADT. ADT для целых чисел может описывать бесконечный набор целых чисел и операции. Которые они поддерживают (например. Сложение или умножение). Структура данных для целочисленного типа должна будет прагматически справляться с ограничениями реализации. Большинство структур данных для целых чисел поддерживают (большое. Но) конечное число целочисленных значений. Однако относительно редко можно ссылаться на ADT или структуру данных простого типа данных. Например Целое число или логическое значение.

Языки имеют очень разные правила для обработки типов данных. В некоторых языках каждый идентификатор (то есть имя переменной) имеет ассоциированный тип. Присвоение этой переменной значения другого типа запрещено. Такие языки статически типизированы. В отличие от этого. Такие языки. Как NetLogo и Python. Динамически типизированы: мы можем присвоить любой тип значения любой переменной в любое время. В динамически типизированных языках постоянство типа значения. Присвоенного переменной. Не требуется языком.

Подсказка

NetLogo имеет только один числовой тип. Который используется для представления как целых. Так и действительных значений. Он также имеет логический тип со значениями trueи false. NetLogo динамически типизирован: новый тип может быть связан с существующим именем в любое время.

Подсказка

Python имеет ряд числовых типов. Включая стандартные представления целочисленных и вещественных значений. Эти два типа называются intи float. Он также имеет логический тип со значениями Trueи False. Python динамически типизирован: новый тип может быть связан с существующим именем в любое время.

Отладка

Трудно написать безошибочный код любой сложности. Поэтому отладка является частью жизни любого программиста. К сожалению. Не существует установленного процесса написания кода без ошибок или поиска ошибок. Когда они возникают. Однако мы можем предложить несколько полезных практик.

Подмости

Смотрите запись на подмостках.

Регистрация

Ведение журнала аналогично printпостроению шаблонов на основе: результаты и проверки ошибок можно “протоколировать”. Распечатав их в файл журнала. В отличие от лесов. Лесозаготовители часто остаются даже в завершенном коде.

Тестирование

Это такая хорошая идея. Чтобы протестировать ваши сценарии. Когда вы их разрабатываете. Что некоторые подходы к разработке (например. Разработка на основе тестов) требуют. Чтобы реализации и тесты разрабатывались вместе. При удалении из кода шаблонов. Предоставляющих полезные тесты. Рассмотрите возможность их превращения в тесты. А не отбрасывания. Тесты часто находятся в отдельном модуле.

Деление пополам

Независимо от того. Сколько утверждений. Регистраторов. Тестов и принудительных контрактов вы включаете в свой код. Иногда нет никакой замены поиску ошибок методом грубой силы. На этом этапе очень важно попытаться систематически изолировать ошибку. Если вы знаете. Что в вашем сценарии есть ошибка. Но не уверены. Где именно. Попробуйте разделить сценарий примерно пополам и поместить тест на ошибку в эту середину. Если вы сделаете это правильно. Он определит. Какая половина скрипта содержит ошибку. И затем вы сможете повторить этот процесс “деления пополам”. Это очень эффективный способ быстро находить ошибки даже в сложных скриптах.

Утверждения

Если вы считаете. Что в логике программы определенное условие никогда не должно возникать в вашем сценарии. Вы можете утверждать это. Вызывая ошибку во время выполнения. Если она возникает. Это простой и эффективный способ проверить наличие ошибки в логике программы. Утверждения могут присутствовать во всем коде. Особенно когда язык обеспечивает хороший механизм для их отключения.

Ошибки выполнения как Принудительное исполнение контракта

Вполне уместно настаивать на том. Чтобы аргументы. Предоставленные командной процедуре или функции, соответствовали аргументам. Разрешенным в документации. Это вопрос не логики программы. А правильного использования. Хотя мы должны неохотно вызывать ошибки времени выполнения. Которые раздражают и доставляют неудобства пользователям нашего кода. Иногда хорошей альтернативы нет. То есть мы должны информировать пользователей о том. Что наш код не приспособлен к неправильному его использованию. (К числу этих пользователей относимся и мы.) Обязательно предоставьте полезное сообщение об ошибке в этом случае.

Подсказка

Единственный механизм утверждения NetLogo — это использование ошибок времени выполнения. Вызовите ошибку времени выполнения с errorпомощью примитива.


NetLogo напрямую не поддерживает отключение этих проверок. Однако можно ввести глобальную логическую переменную с именем debugи использовать ее значение как часть теста. Возможность отключить отладочные тесты может быть особенно полезна. Когда код считается правильным. А некоторые тесты стоят дорого.


Подсказка

loggingМодуль Python предоставляет хорошую альтернативу строительным лесам. (Подробнее см. Документацию Python модуля ведения журнала.) Ведение журнала легко отключается и снова включается по мере необходимости.

unittestМодуль Python-это популярный подход к тестированию. (Подробнее см. Документацию Python по

uniestmode̲

_.)

Если вы считаете. Что с точки зрения логики программы в вашем сценарии никогда не должно возникать определенное условие. Вы можете добавить assertсоответствующее утверждение. Это простой и эффективный способ проверить логику вашей программы на наличие ошибок. Если возникнет такое условие. Ваш код вызовет ошибку an AssertionError. Это примерно эквивалентно

if (not expression): поднять AssertionError

Однако утверждения можно отключить. Если Python запускается с параметром -Oкомандной строки. Включение или выключение утверждений определяется встроенной переменной __debug__. (Подробнее см. Документацию Python

assertstatement

_ дополнительной информации.) Поэтому базовое утверждение assert может быть приравнено к следующему.

if __debug__: if (not expression): поднять AssertionError

Подходящим использованием assertоператоров является тестирование постусловий. Таких как тип любого результата, который. По вашему мнению. Всегда должен производить ваш код. Поскольку assertоператоры могут быть отключены любым человеком. Выполняющим ваш сценарий. Они должны тестироваться только на условия, которые. Как указывает логика программы. Никогда не возникнут. В частности, они не должны использоваться для принудительного применения между вашим кодом и пользователями вашего кода. Вместо этого вы можете raiseValueErrorответить на плохие аргументы. Как описано в разделе об исключениях. Еще одно следствие возможности того. Что assert операторы могут быть отключены только в том случае. Если они не должны вызывать никаких побочных эффектов (например. Изменение изменяемого объекта).

Разложение

Композиция-это соединение более простых частей в сложное целое. Разложение — это распад сложного целого на более простые составные части. (Декомпозицию иногда называют факторингом.)

Программа-это сложное целое. Многие программы чрезвычайно сложны. В качестве помощи для понимания и облегчения обслуживания программисты разлагают сложные программы на более простые для понимания части.

Например. Мы можем представить сложный алгоритм в виде последовательности легко понятных подпрограмм. Мы можем разложить сложную подпрограмму на последовательность вызовов гораздо более простых подпрограмм. Когда существующая подпрограмма оказывается слишком сложной или трудной для понимания. Мы ищем новые способы ее декомпозиции. Это один из видов рефакторинга.

Хорошие программисты предвидят сложность на этапе проектирования программы. Что облегчает проектирование сложной программы как взаимодействие между полезными. Простыми компонентами. Хороший дизайн программы. Как правило. Основан на многоразовых компонентах. Которые имеют ограниченные и прозрачные зависимости друг от друга. (Они слабо связаны.) Для хорошего программирования необходима соответствующая декомпозиция.

СУХОЙ

СУХОЙ — это инициализм для того. Чтобы не повторяться. Это обычно призыв к программистам заменить повторяющийся код вызовами подпрограмм. Когда это возможно. Это уменьшает дублирование кода и способствует повторному использованию кода. Следование принципу DRY имеет преимущества обслуживания кода. Гарантируя. Что одно изменение в дизайне или реализации не должно быть сделано в нескольких местах (некоторые из которых могут быть упущены из виду). Для получения дополнительной информации см. статью Википедии на DRY.

Исполнение

Выполнить компьютерный код-значит заставить компьютер следовать инструкциям. Содержащимся в коде. Запустить код-это синоним.

Контекст выполнения

Мы запускаем программу в определенном контексте выполнения. Который включает операционную систему и любые библиотеки. Предоставляемые используемым языком программирования. Во время выполнения программы она обычно выполняет вызовы подпрограмм. Которые вызывают выполнение подпрограмм. Подпрограммы выполняются в среде. Которая определяется общей программой. В этом курсе рассматриваются все аспекты среды выполнения. Которые влияют на подпрограмму. Чтобы составить контекст выполнения (или более кратко, контекст) вызовов подпрограммы. Например, подпрограмма может зависеть от значения глобальной переменной, который определяется по мере выполнения программы.

Грубо говоря. Контекст выполнения вызова подпрограммы-это среда. В которой выполняется подпрограмма. В моделировании на основе агентов эта среда часто предоставляется агентом. Чьим поведением она является. Агент, вызывающий подпрограмму. Определяет ее контекст. Например, готовность или способность агента играть в азартные игры может зависеть от его текущего уровня богатства.

Подсказка

Программисты NetLogo чаще всего устанавливают контекст. В котором процедура будет выполняться с askпомощью команды. NetLogo определяет необходимый контекст для процедуры по именам. Указанным в процедуре. Если процедура не ссылается ни на какие атрибуты агента. Она может выполняться в любом контексте. (Этим свойством обладает чистая функция.) Если мы ссылаемся на атрибуты черепахи (такие как color), процедура должна выполняться в контексте черепахи.

Если мы обратимся к атрибутам патча (например,pcolor), то процедура может быть запущена в контексте патча. Однако, что характерно для NetLogo. Эта процедура также может быть запущена в контексте черепахи. Поскольку черепаха имеет прямой доступ к атрибутам своего патча.

Формат файла

В вычислительной технике термин Этот курс в первую очередь касается удобочитаемых простых текстовых форматов. Но изображения обычно хранятся в двоичных форматах.

Обычный Текст

В вычислительной технике термин Обычный текстовый файл-это, по сути. Последовательность кодов символов (например. Кодировки символов. Используемых в письменных языках). Большая часть байтов данных. Хранящихся в обычных текстовых файлах. Соответствует символам. Которые могут быть использованы при создании печатных текстов. Файлы исходного кода компьютера обычно представлены в виде обычного текста. Некоторые форматы обмена данными являются обычными текстовыми. Включая популярный формат CSV.

Кодировка файлов

Исходный код компьютерных программ обычно хранится в виде обычного текста. Тем не менее. Компьютерный файл по сути представляет собой набор битов (“нулей и единиц”). Которые должны быть декодированы. Чтобы быть полезными. Кодирование файла-это спецификация того. Как информация хранится в файле. Эта спецификация позволяет извлекать информацию из файла (например. Чтобы иметь возможность читать его как набор символов).

Значение простого текста со временем изменилось. К началу 21 века обычный текст стал относиться к файлам с кодировкой на основе Unicode (например. UTF-8 или UTF-16). Unicode поддерживает все символы. Используемые в европейских языках. Большинство потребностей большинства других языков. И добавляет много специализированных символов (таких как математические символы). Более подробную информацию см. в статье Википедии о простом тексте.

Для файлов исходного кода широко используется стандартная кодировка Unicode UTF-8. Его часто просто называют Unicode. Все современные редакторы и языки программирования обеспечивают поддержку UTF-8, и начинающим программистам не нужно беспокоиться о кодировках файлов.

Формат CSV

Обмен данными часто осуществляется с использованием формата разделенных запятыми значений (CSV). Который является международно признанным форматом обмена данными (заданным RFC4180). Он поддерживается электронными таблицами. Статистическими пакетами и многими языками программирования.

Каждая строка CSV-файла-это запись. Состоящая из значений. Разделенных запятыми. Чтобы увидеть запятые. Вы должны открыть файл в текстовом редакторе. А не в электронной таблице. CSV-это обычный текстовый формат. Который может открыть и отобразить любой текстовый редактор. Однако электронные таблицы могут открывать CSV-файлы и давать им специальное отображение. Если вы откроете файл в электронной таблице, значения. Разделенные запятыми. Появятся в отдельных ячейках.

Каждая запись использует одни и те же поля. Поэтому столбец значений представляет значения одного поля во всех записях. Как правило. Первая строка файла-это строка заголовка. В которой перечислены имена полей. Вариации этого базового описания часто. Тем не менее. Называются CSV-файлами. Дополнительные сведения о значениях. Разделенных запятыми. См. в статье Википедии.

Расширение файла

Имена файлов часто включают в себя часть. Известную как расширение именифайла . (В некоторых операционных системах могут потребоваться расширения.) Обычно расширение-это последние 3 или 4 буквенно-цифровых символа имени. Следующие за точкой. Расширение должно быть своего рода метаданными: оно должно предоставлять информацию о том. Как информация хранится в файле. Например, имя файла . Оканчивающееся на .txtобычный текст, а имя файла. Оканчивающееся на .csvобычный текст в формате CSV.

Хотя использование расширений файлов для предоставления метаданных обычно необязательно. Некоторые операционные системы обрабатывают файлы по-разному в зависимости от их расширения. Кроме того, в некоторых версиях операционной системы Windows по умолчанию файловый менеджер GUI не отображает известные расширения файлов. Помимо самых обычных пользователей компьютеров. Большинство пользователей получают информацию. Выбирая для просмотра эти расширения. (В Интернете полно советов о том. Как включить такое поведение. В Windows 10 перейдите на Viewвкладку Проводника и File name extensionsустановите флажок.)

Подсказка

Программные файлы NetLogo должны иметь .nlogoрасширение. NetLogo также предоставляет __includesкоманду для включения “внешних” исходных файлов NetLogo. Которым следует дать .nlsсуффикс. Эти файлы могут содержать определения типов. Переменных и процедур. Каждый программный файл может использоваться __includesтолько один раз. Но один __includesоператор может включать в себя несколько файлов.

Подсказка

Файл программы Python обычно имеет .pyрасширение. Программа Python. Реализующая графическое приложение. Обычно находится в файле с .pywрасширением. Исходный файл Python также называется “модулем”. Особенно если он предназначен для импорта другими исходными файлами.

Подсказка

Файл программы Haskell обычно имеет .hsрасширение. (Грамотные программы используют .hslрасширение.)

Фиксированная точка

Фиксированная точка функции

f

является значением

x

такие. Что

x=f[x]

. То есть выходное значение совпадает с входным. (Краткий элементарный обзор понятия функции см. в главе 3 [Feldman-2012-OxfordUP].)

Функция

Этот курс использует функцию термина для любой вызываемой подпрограммы, которая явно возвращает значение. (В отличие от командной процедуры, которая не возвращает значение.) Функция очень похожа на формулу электронной таблицы: она использует существующие значения для получения нового значения. Подумайте о функциях как о преобразовании допустимых входов в выходы.

Математика дает базовое понятие функции как отображения входных значений на выходные. Например. Функция возведения

xxx

В этом определении имя xявляется параметром функции ; оно не имеет никакого значения вне определения функции. (Специальная стрелка произносится как maps to.) Эта функция сопоставляет действительные числа с действительными числами. Допустимые входные значения называются областью действия функции; соответствующие выходные значения называются диапазоном действия функции.

Присвоение функции имени облегчает ее обсуждение. Одна общая математическая нотация. Чтобы дать имя

f

к функции

xxx

является

f=xxx

; другой-

f(x)=xx

; еще один-

f[x]=xx

(В этом курсе обычно используется первая нотация.) Нотация (синтаксис) для определения вычислительных функций имеет еще большее разнообразие.

Каждый язык программирования предоставляет свой собственный синтаксис для определения функций. Как и математические функции. Вычислительные функции преобразуют входные значения в выходные. В вычислительной установке входное значение обычно называется аргументом, а выходное-возвращаемым значением. Тип допустимых аргументов называется входным типом функции. (Например, isPrimeфункция может принимать только целочисленные аргументы.) Тип значений. Которые функция выдает в качестве выходных. Называется возвращаемым типом функции. (Например, isPrime функция всегда может возвращать логическое значение—true или false.) Мы применяем функцию к аргументу. Чтобы получить возвращаемое значение. Синтаксис применения функций существенно различается в разных языках программирования.

Подсказка

Python предлагает два способа создания функций: с defпомощью ключевого слова или в виде литерала функции (using lambda). Для получения более подробной информации см. Учебник по Python.

Подсказка

Создайте именованную функцию с помощью оператора присваивания (=). Создайте анонимную функцию с оператором обратной косой черты (

). Параметры функции разделяются пробелом и не заключаются в круглые скобки. То же самое верно и при применении функции: аргументы разделены пробелами и не заключены в круглые скобки. Для получения более подробной информации см. Учебник Haskell.

Чистая Функция

В принципе, замена всех приложений чистой функции на предварительно вычисленные выходные значения не изменит смысла программы. Чистая функция закрыта и без побочных эффектов. (Эта комбинация свойств гарантирует. Что наше использование функции удовлетворяет ссылочной прозрачности: поведение программы не должно изменяться. Если мы заменяем каждое применение функции ее значением.)

Закрытый:

Возвращаемое значение (т. Е. Значение. Которое выводит функция) зависит только от значений явных входов. А не от любого другого состояния программы.

Без побочных эффектов:

Функция не изменяет среду. В которой она выполняется. Функция не имеет никаких побочных эффектов, даже печати.

Примеры побочных эффектов включают изменение значения нелокальной переменной. Запись данных в файл или связь с периферийным устройством компьютера. Если выполнение функции изменяет глобальную переменную, функция не является свободной от побочных эффектов. Поэтому она не является чистой.

Если выполнение функции зависит от глобальной переменной. То она не замкнута, а значит. Не является чистой. Чистая функция взаимодействует с остальной частью программы. Только принимая аргументы (которые она не изменяет) и возвращая значение (которое зависит только от аргументов). В этом смысле функция. Выходные данные которой полностью определяются ее аргументами, закрыта для влияния контекста. В котором она работает.

Предупреждение

Наличие глобальных переменных в определении функции обычно означает. Что функция нечиста: возвращаемое значение функции зависит от глобального состояния. Чаще всего такая зависимость-плохая идея!

Подсказка

Если функция содержит команду print. То она не является чистой. Поскольку имеет побочный эффект. Если функция возвращает значение. Зависящее от глобальной переменной. То функция не является чистой. Поскольку она не закрыта.

Литерал функции

Программисты используют термин Мы можем грубо сказать. Что значение литерала всегда имеет фиксированное значение в языке. Литерал функции-это синтаксис для представления функции в виде фиксированного значения. Литерал функции выражает функцию. Не называя ее. И ее значение (то есть функция) может быть впоследствии присвоено или не присвоено имени. Термин немедленно вызываемое функциональное выражение (IIFE) относится к литералу функции. За которым немедленно следует применение к аргументу.

Подсказка

Примеры литералов в NetLogo включают5,"abc", и true, которые являются числовым литералом. Строковым литералом и логическим литералом. NetLogo также поддерживает функциональные литералы. Используя синтаксис стрелки. Например. Функция возведения в квадрат может быть записана следующим [x -> x * x]образом .

Литералы функций могут называться анонимными функциями. Лямбда-кодами или задачами репортера. Используйте runresultпримитив для применения литерала функции к аргументу. (Например, (runresult [x -> x * x] 2)применяет функцию [x -> x * x]к аргументу 2для получения результата 4.) Аргументы функции не заключаются в круглые скобки.

Подсказка

Примеры литералов в Python включают 5, "abc", и True, которые являются целочисленным литералом. Строковым литералом и логическим литералом. Python включает в lambdaсебя ключевое слово для литералов функций. Например. Функция возведения в квадрат может быть записана следующим lambda x: x * xобразом .

Программисты Python часто ссылаются на литерал функции как на лямбда-выражение. Термин анонимная функция также распространен. Хотя это более точно относится к значению лямбда-выражения. Так же, как и с обычно определенными функциями. Мы используем скобки для применения анонимной функции к аргументу. (Например, (lambda x: x * x)(2)применяет функцию lambda x: x * xк аргументу 2для получения результата 4.)

Функция Более Высокого Порядка

Функции считаются первоклассными гражданами языка программирования. Если они представляют собой значения. Которые можно рассматривать как любые другие значения: присваивать именам. Передавать в качестве аргументов или возвращать в качестве значений из функций. Функция называется более высоким порядком, если она ожидает функцию в качестве аргумента или выдает возвращаемое значение. Которое является функцией. Языки, рассматривающие функции как первосортные граждане. Обычно также предоставляют синтаксис для литералов функций.

Закрытие функции

Функция более высокого порядка может возвращать замыкание функции. Которая является новой функцией. Которая несет с собой часть среды. В которой она была создана. Обычно новое определение функции включает свободную переменную. Значение которой задается функцией более высокого порядка. Дополнительные сведения см. в статье Википедии о закрытии функций.

Подсказка

Рассмотрим следующую двумерную функцию.

to-report incrementBy [#x #y] отчет #x + #y конец

Используйте это для создания фабрики функций. Которая возвращает функции. Увеличивающиеся на указанную величину.

to-report incrementer [#y]

конец

incrementerФункция более высокого порядка. Потому что ее возвращаемое значение является функцией-репортерской задачей. Выражаясь общепринятой терминологией NetLogo. В этом примере incrementer 1возвращает задачу reporter. Которая увеличивает свой аргумент 1. Аналогично, incrementer 2возвращает задачу reporter. Которая увеличивает свой аргумент 2. Например,

карта (инкремент 1) [0 1 2] ; [1 2 3] карта (инкремент 2) [0 1 2] ; [2 3 4]

Функции инкремента называются замыканиями: они захватывают (т. Е. запоминают) значение приращения. Используемое при их создании. И это значение закрывается от внешних воздействий.

Функциональное программирование

Программирование называется декларативным, когда оно состоит из инструкций. Которые говорят компьютеру. Какие выходные данные производить. А не как их производить. Декларативное программирование называется функциональным, когда эти инструкции обычно объединены в полезные подпрограммы. Известные как функции Функции производят значения. Которые могут служить входными данными для других функций. Функциональные программы. По существу. Связывают воедино функции. Чтобы произвести интересующую ценность. Функции-это основные объекты. Управляемые функциональной программой. Чисто функциональная программа не имела бы понятия об изменениях в состоянии компьютера. Даже в периферийных устройствах (таких как монитор или принтер). Поскольку такие изменения состояния часто желательны. Функциональный язык программирования приспосабливается к ним (ограниченными способами). Многие языки поддерживают некоторые функции функционального программирования. Включая Python и NetLogo.

Итерация функций

Напомним, что повторять-значит повторять действие. С помощью итерации функциимы многократно применяем функцию для получения последовательности значений , каждый раз используя выходные данные функции (из предыдущей итерации) в качестве новых входных данных (для текущей итерации). (Краткий, элементарный обзор концепции итерации функций см. в главах 2 и 5 [Feldman-2012-OxfordUP].) Учитывая функцию

f

и начальное значение

x0

, мы можем повторно применить функцию. Чтобы получить

x1=f[x0]x2=f[x1]=f[f[x0]]=f2[x0]x3=f[x2]=f[f[f[x0]]]=f3[x0]

Мы можем написать

fn

для обозначения функции. Производящей

nth

повторите. То есть

fn(x0)

возвращает результат итеративно (

n

раз) применение функции

f

, начиная с начального значения

x0

Дополнительные сведения см. в статье Википедии об итерационных функциях.

Примечание

В этой записи мы используем скобки для обозначения вызова функции. Которая является наиболее распространенной математической нотацией. Это также распространенный синтаксис в языках программирования. Производных от Cнего . Однако языки программирования следуют многим различным соглашениям. Например, язык Wolfram использует квадратные скобки. А языки NetLogo и haskell вообще не требуют скобок.

Вывоз мусора

Языки более низкого уровня часто требуют. Чтобы программист явно выделял и освобождал память для любых созданных объектов. Утечки памяти-распространенная проблема в таких языках. Даже для опытных программистов. Другие языки строят автоматическое управление памятью. Называемое автоматической сборкой мусора. Это гарантирует. Что память. Выделенная объекту. Будет освобождена после того. Как объект больше не будет нужен. Автоматическая сборка мусора может включать в себя некоторую жертву скорости и использования памяти. Но выигрыш в удобстве значителен. Большинство исследователей социальных наук оценят это удобство. И большинство студентов. Изучающих социальные науки. Найдут автоматический сбор мусора незаменимым.

Примеры языков. Которые не строятся в автоматической сборке мусора. Включают C и C++. Примерами языков. Использующих автоматическую сборку мусора. Являются Python. Java и Haskell. NetLogo работает на виртуальной машине Java. Которая обеспечивает автоматическую сборку мусора.

Графический Интерфейс Пользователя

Пользовательский интерфейс для компьютерного приложения — это точка взаимодействия между пользователем и приложением. Пользовательский интерфейс командной строки (CLI) типичен для ранних компьютерных приложений. Но CLI часто требуют тайного знания команд. Управляющих приложением. В настоящее время типичное ориентированное на потребителя приложение будет полагаться на голосовой пользовательский интерфейс (VUI) или графический пользовательский интерфейс (GUI). Или и то, и другое. Которые обычно предназначены для того. Чтобы быть более интуитивными и требовать от пользователя меньше тайных знаний. Как правило. Пользователь графического приложения взаимодействует с этим приложением манипулируя графическими элементами. Называемыми виджетами.

Графический виджет виджета

Виджет (гаджет окна)-это элемент пользовательского интерфейса в графическом интерфейсе пользователя (GUI). Создание коллекции полезных виджетов называется построением графического интерфейса. Виджеты могут быть элементами управления. Которые позволяют пользователю взаимодействовать с графическим интерфейсом или элементами отображения. Которые просто отображают информацию в графическом или текстовом форматах. Мы можем свободно классифицировать их как виджеты управления и виджеты отображения. (Для получения более подробной информации и предыстории,

контрольные виджеты

Элементы управления действиями (кнопки) и параметрами (ползунки. Переключатели. Селекторы и поля ввода).

отображение виджетов

Графические дисплеи (графики) и текстовые дисплеи (мониторы).

ползунок

задайте числовой переменной значение в диапазоне

переключатель

установите логическую переменную в trueзначение или false

выбирающий

задайте переменной значение в фиксированном списке

поле ввода

установите переменную в значение введенное пользователем

ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ

Интегрированная среда разработки (IDE) облегчает разработку кода. Объединяя ключевые функции. Необходимые программистам. IDE будет включать в себя редактор кода. Который позволяет легко создавать и изменять исходный код. Обычно редактор IDE включает подсветку синтаксиса. Которая отображает синтаксическую информацию об исходном коде на основе конкретного языка программы. (Например. Ключевые слова языка будут специально окрашены.) Подсветка synatx предоставляется редактором на лету и не является частью исходного кода.

IDE обычно предоставляет какие — то средства отладки. Современные IDE предоставляют графический пользовательский интерфейс. Некоторые языки распространяются с помощью IDE; примеры включают NetLogo и Python. (Подробнее см. статью Википедии об IDE.)

Индексация

Большинство языков программирования предоставляют один из более численно индексированных типов данных. Существует два общих соглашения об индексации: индексация на основе нуля (которая начинается с 0) и индексация на основе единиц (которая начинается с 1).

Индексирование на основе нуля может показаться странным для тех. Кто не имеет опыта программирования (хотя мы часто используем его, например. Когда ссылаемся на чей-то возраст или пол). На практике это оказывается чрезвычайно удобным.

Подсказка

NetLogo использует индексирование на нулевой основе. Если lstэто список, то item 0 lstвозвращается первый элемент lst. Чтобы более подробно проиллюстрировать индексацию на основе нуля. Рассмотрим оператор NetLogo let payoffmat [ [[3 3] [0 5]] [[5 0] [1 1]] ]. Это многоуровневый список: внешний список содержит два списка. Каждый из которых содержит два списка кортежей.

NetLogo обращается к элементам списка с itemпомощью команды. Мы должны применять это многократно. Чтобы получить доступ к внутренним элементам. Например, item 0 payoffmatесть [[3 3] [0 5]]. Точно item 1 item 0 payoffmatтак же и есть [0 5]. (Этот двухэлементный список может представлять два выигрыша игрока при ходах 0 и 1.)

Подсказка

Python использует нулевую индексацию. Если lstэто список, то lst[0]возвращается первый элемент lst. Чтобы более подробно проиллюстрировать индексацию на основе нуля. Рассмотрим оператор payoffmat = [ [(3,3),(0,5)] . [(5,0),(1,1)] ](который встречается в приведенных ниже примерах кода). Это список из двух списков по два кортежа в каждом. Поскольку мы индексируем элементы последовательности. Постфиксируя целое число в скобках, payoffmat[0]то есть [(3,3),(0,5)]. Точно payoffmat[0][1]так же и есть (0,5). (Этот кортеж будет представлять собой выигрыш двух игроков при ходах 0 и 1.)

Инициализация

Инициализация переменной — это установка начального значения переменной. Инициализация объекта-это установка начального состояния объекта. Особенности инициализации зависят от языка. В этом курсе термин Для получения более подробной информации,

Подсказка

Глобальные переменные, объявленные на Codeвкладке. Автоматически инициализируются до 0 при объявлении (с помощью globalsкоманды). Все они могут быть сброшены до нуля в любой момент. Позвонив reset-globals(или позвонив clear-all, который. В свою очередь. Звонит reset-globals).

Этот курс включает в себя все компоненты настройки модели в рамках концепции инициализации. Например, типичное моделирование NetLogo будет включать этап настройки. Который (среди прочего) явно устанавливает начальные значения для этих глобальных переменных. (Это часто делается в рамках setupпроцедуры.) Несмотря на то. Что это технически сбрасывает значения переменных. Этот курс рассматривает этот шаг как часть инициализации модели.

Локальные переменные NetLogo должны быть инициализированы при их объявлении (с помощью letкоманды).

Подсказка

Переменные Python должны быть инициализированы при их создании: новому имени должно быть присвоено значение. Типичная агент-основанная программа Python будет включать в себя setupпроцедуру. Которая может (среди прочего) явно инициализировать глобальные переменные. (Это часто делается путем вызова специальной setupGlobalsпроцедуры.)

Итерация

Термин итерировать означает повторять. Итерация-это повторное действие. Если мы можем выяснить. Как дать компьютеру команду выполнить действие один раз. Становится очень легко дать ему команду выполнить действие повторно. Мы можем выполнить это с помощью циклической конструкции.

Одно общее использование итерации для доступа к членам коллекции. В традиционном императивном программировании было очень распространено обращение к каждому члену последовательной структуры данных путем многократного увеличения индекса и последующего обращения к члену. Обозначенному этим индексом. Это называется перебором (или перебором) структуры данных.

Ключевое слово

Зарезервированному слову языка программирования не может быть присвоено новое значение пользователем этого языка. Грубо говоря, ключевое слово языка программирования-это встроенная часть поведенческого определения основного языка. (Таким образом. Если trueи falseявляются логическими литералами. Мы не считаем их ключевыми словами. Поскольку они определяют буквальные значения. А не основное поведение языка.) Ключевое слово выглядит как обычный пользовательский идентификатор. Но его значение в основном языке примитивно. Мы будем считать. Что любое ключевое слово также является зарезервированным словом. Так что его значение не может быть переопределено.

Численное Сравнение

Числовые сравнения (равенства или относительного размера) обычно реализуются в виде инфиксных двоичных булевых реляционных операторов. То есть они делают сравнение двух числовых квантитов и производят логическое значение (например, trueили false). Например,

12

оценивает до true.

Тип объекта

При программировании мы манипулируем различными типами объектов (например. Числами и строками). Для безопасности программы мы должны оперировать объектами только теми способами. Которые соответствуют их типу. Это можно сделать двумя способами: статическим и динамическим.

Некоторые языки проверяют соответствие типов объектов только во время выполнения программы. Это называется динамической типизацией. В таких языках создание объектов включает в себя спецификацию типа. Которая проверяется. Когда программа манипулирует объектом. Языки динамического типа часто позволяют переназначать одно имя переменной объектам разных типов. Поскольку тип объекта проверяется во время выполнения.

Другие языки накладывают проверки во время компиляции (то есть перед запуском программы). Это называется динамической типизацией и выполняется путем анализа кода перед его компиляцией. В статически типизированном языке. Грубо говоря. Имя переменной имеет тип. Связанный с ней. И только объекты этого типа могут быть назначены этому имени. В некоторых языках тип объекта должен быть определен программистом. В то время как другие языки полагаются на анализ кода для определения типа объекта.

Во многих статически типизированных языках вывод типа отсутствует или ограничен. Поэтому программы могут быть загромождены объявлениями типов и явными приведениями. Некоторые исследователи оправдывают эту стоимость утверждением. Что статическая типизация обеспечивает критическую проверку на ошибки программирования. Другие утверждают. Что ошибки типа редки. И динамическая типизация оправдана ее удобствами. Попытки разрешить этот компромисс между затратами и выгодой были в центре многих спорных споров. Которые мы здесь не рассматриваем.

Примерами динамически типизированных языков являются NetLogo и Python. Примерами статически типизированных языков являются C и C++. Haskell-это пример статически типизированного языка. Где объявления типов обычно необязательны из-за использования вывода типов.

Оператор

Оператор, предоставляемый языком программирования. Ведет себя как функция. Но часто имеет специальный синтаксис. Арифметические операторы+, -,*, и /наиболее знакомы. Мы используем их для построения арифметических выражений. В большинстве языков программирования это infixоператоры. Что означает. Что синтаксически они находятся между своими аргументами знакомым образом. Например, в выражении 1 + 2оператор plus находится между двумя входными аргументами. Это дает оценку 3.

Операторы логического сравнения также обычно являются инфиксами. Например, в выражении 2 оператор less-than находится между двумя входными аргументами. В большинстве языков логические сравнения производят особый тип значения. Представляющего истинность или ложность. Который известен как логическое значение. По этой причине операторы логического сравнения часто называются булевыми операторами.

Рефактор

Напомним, что разложение-это разбиение сложного целого на более простые составные части. Разложение иногда называют факторингом. Мы рефакторизуем код. Когда разрабатываем новую декомпозицию кода.

Код, который работает. Часто может быть улучшен. Он может быть переработан. Чтобы работать быстрее. Использовать меньше памяти. Исключить дублирование кода. Иметь лучшее разделение проблем или быть проще для понимания. Такой редизайн называется рефакторингом. Общим примером является декомпозиция сложной функции на простые. Легко понятные компонентные функции.

График последовательности выполнения

Chambers et al (1983) описывают график последовательности выполнения как удобное резюме одномерных наборов данных. (Одномерные данные-это записи результатов одной переменной.) Выбросы легко обнаруживаются. Если порядок последовательности имеет присущее ему значение (например. Последовательные точки во времени или пространстве). То существенные сдвиги в масштабе и местоположении также легко заметны. Когда последовательность выполнения представляет наблюдения в последовательные моменты времени. Мы часто используем термин график временных рядов.

Рекомендации:

Сюжет временного ряда

Мы будем использовать термин график временных рядов для любого графика последовательности выполнения. Где значения абсцисс каким-то образом указывают на течение времени (например. Даты). (Элементарный обзор концепции графика временных рядов см. в главе 4 книги [Feldman-2012-OxfordUP].) Эти временные значения могут быть не более чем индексами ряда. Часто мы соединяем нанесенные точки с отрезками линий. Создавая линейную диаграмму. В этом курсе используется термин диаграмма временных рядов для обозначения диаграммы. Содержащей один или несколько графиков временных рядов. Независимо от того. Нанесены ли точки отдельно или соединены линейными сегментами.

Матричный график

Матричный график отображает матрицу цветов для представления матрицы чисел. Когда цвета передают значения чисел. Матричный график часто называют тепловой картой. Электронные таблицы могут создавать грубые тепловые карты с условным форматированием ячеек электронных таблиц. Приложения, поддерживающие статистическую графику. Часто включают в себя хорошую поддержку тепловых карт. См. [Уилкинсон.Friendly-2009-AmStat] для некоторых предшественников и расширений подхода тепловой карты к визуализации данных.

Модуль

Этот курс использует термин модуль для любого файла исходного кода может быть каким-то образом импортирован другим файлом исходного кода. Модуль-это отдельный файл. Содержащий код для использования программой. Модули-это способ разбить большую программу на составные части. Состоящие из отдельных файлов. Это называется модульным программированием.

Мы используем очень слабое понятие модуля: он не требует разделения проблем. Спецификации интерфейса или сокрытия информации. В этом курсе основной интерес к модулям заключается в том. Что они позволяют повторно использовать код в разных моделях.

Подсказка

NetLogo обеспечивает ограниченную поддержку модульного программирования с помощью исходных файлов NetLogo (в отличие от файла модели). Они должны иметь .nls расширение именифайла . Исходные файлы NetLogo могут быть импортированы моделью NetLogo с помощью __includesключевого слова. Которое должно быть помещено в самом верху вкладки моделиCode. Это дает доступ (в общем пространстве имен) к объявлениям и определениям процедур в исходных файлах.

Ресурсы документации:

Подсказка

Файл исходного кода Python может использовать importоператор Python для доступа к другим файлам исходного кода Python. (Python использует термин модуль в более широком смысле. Чем этот курс.)

Ресурсы документации:

Соседство

Пространственные модели часто используют понятие окрестности агента. Которая представляет собой набор положений относительно текущего положения агента. Обычно соседство предназначено для воплощения некоторой концепции соответствующей близости. Понятие близости может быть распространено на не пространственные отношения. Такие как сети.

Двумерные модели с прямоугольным рельефом. Состоящим из участков или ячеек, особенно распространены в агентном моделировании и моделировании. В этом случае двумя наиболее распространенными типами окрестностей являются боксовые (Moore) окрестности и перекрестные окрестности. Хотя алмазные (von Neumann) окрестности также являются общими. См. главу о клеточных автоматах для обсуждения.

Параметр

В вычислениях параметр термина имеет несколько применений и значений. Этот глоссарий различает параметры модели и параметры подпрограмм (например. Параметры функций).

Параметр модели

При имитационном моделировании параметр модели определяет ключевое влияние на поведение модели. Чтобы можно было экспериментировать. Фокальные параметры обычно являются переменными в модели. Другие параметры могут быть обработаны жестким кодированием. Особенно на ранних стадиях разработки модели. Параметризация модели, или сценарий, присваивает значение каждому параметру модели.

Параметры модели часто влияют на первоначальную настройку модели. Например, начальное число агентов обычно является параметром модели. Параметры модели остаются постоянными во время выполнения моделирования. Некоторые языки позволяют объявить это постоянство. Так что оно навязывается языком. В других языках именно исследователь должен обеспечить это постоянство.

Набор значений для всех параметров имитационной модели представляет собой сценарий моделирования. Изменение сценария обычно приводит к изменению результатов моделирования. Совокупность всех возможных сценариев называется пространством параметров. В большинстве моделей невозможно рассмотреть все пространство параметров. Исследователи используют экстремальные границы. Развертки параметров или другие методы для исследования пространства параметров. Перечисляемая развертка явно перечисляет значения параметра (например. В виде списка). Дальнобойная развертка задает диапазон значений параметра. Обычно предоставляя начальные. Конечные и инкрементные значения для этого диапазона.

Параметр подпрограммы

Параметр подпрограммы-это имя. Используемое в определении подпрограммы для обозначения возможных входных данных подпрограммы. Фактические значения. Передаваемые подпрограмме. Называются ее аргументами.

Подпрограмма применяется к своим аргументам; эквивалентно. Она вызывается с этими аргументами. Параметры-это имена. Используемые при описании того. Как подпрограмма будет манипулировать аргументами. Например. Если функция с параметром xвозвращает квадрат своего аргумента. Мы можем сказать. Что функция вернетсяx * x, даже если мы заранее не знаем действительного аргумента.

Большинство языков программирования эффективно изолируют параметры подпрограммы от окружающего кода. Поэтому параметр подпрограммы имеет значение только в определении подпрограммы. Чтобы уловить эту изоляцию. Программисты часто говорят. Что параметр связан определением. В которое он введен. Аналогично, мы говорим, что область действия имени ограничена его подпрограммой.

Мы можем провести сравнение с определениями функций в математике. Предположим что мы определяем функцию

xx2

. Если вместо этого мы скажем что

zz2

, это определяет точно такую же функцию. Не имеет значения. Что мы называем формальным параметром (

x

или

z

), поскольку этот параметр не имеет никакого значения вне определения функции. Мы могли бы даже написать эту же функцию как

2

, за исключением того. Что это немного затрудняет упоминание параметра по имени. Мы говорим. Что параметр функции связан с определением. В котором он вводится.

Поскольку параметр процедуры или функции является локальным по отношению к ее подпрограмме, мы можем повторно использовать одни и те же имена в различных подпрограммах. Не опасаясь конфликта между используемыми именами. Это чрезвычайно важно для создания понятного кода. К сожалению, эта. Казалось бы. Простая концепция усложняется по мере того. Как мы углубляемся в детали. И разные языки по-разному справляются с этими сложностями. В качестве одного важного примера рассмотрим. Что происходит. Если глобальная переменная имеет имя. Которое мы хотим ввести в качестве параметра функции. Ответ зависит от языка.

Не объединяйте параметр функции с параметром модели. Значения параметров модели определяются во время настройки вашего моделирования. И они должны оставаться неизменными во время моделирования. Параметр функции-это имя. Которое мы связываем с входным аргументом. Поэтому он может представлять другое значение каждый раз. Когда мы вызываем функцию. Мы можем вызвать одну функцию много раз во время одного моделирования.

Кроме того, обратите особое внимание на разницу между параметрами функции и аргументами функции. Параметры функции-это переменные. Используемые при определении функции для представления любого возможного аргумента. Который может быть предоставлен функции. Учитывая, что функция определена. Мы можем применить ее к фактическим аргументам. Чтобы сообщить о выходе. Например, мы определяем функцию идентичности

xx

в терминах параметра

x

. Если мы применим эту функцию к аргументу of 2, она вернет то же значение (2).

Подсказка

Процедуры NetLogo могут включать параметры. Которые называют входные аргументы для процедуры. При необходимости ознакомьтесь с обсуждением процедур с параметрами в приложении NetLogo Programming. Простейшим примером является функция тождества. Которую мы можем представить математически как

xx

В NetLogo мы могли бы реализовать это как процедуру репортера:

to-report identity [#x] ;`#x` - это параметр. А НЕ аргумент report #x ;наше правило: сообщать то же значение. Которое передается в конце

Вот примеры приложений командной строки этой функции:

print identity 2 ;входной аргумент-2, а выходной-2 print identity 3 ;входной аргумент-3, а выходной-3

Глобальные переменные видны везде в программе NetLogo. Это означает. Что вы не должны повторно использовать имя глобальной переменной в качестве параметра процедуры. Мы собираемся избежать этой возможности с помощью простого соглашения: начинайте любой формальный параметр с хэш-метки (#) или двоеточия (:), а любую другую локальную переменную (объявленную с letпомощью ) начинайте с подчеркивания (_). Это просто условность. Она не требуется языком. В качестве простого примера:

to-report sq [#x] ;octothorpe запускает имя параметра let _xx (#x * #x) ;underscore запускает новое имя локальной переменной report _xx end

Обратите внимание. Что параметры вводятся в скобках во время определения функции. Однако не ставьте скобки вокруг аргументов при применении функции. Вот примеры приложений командной строки этой функции:

print sq 2 ;входной аргумент равен 2, а выходной-4 print sq 3 ;входной аргумент равен 3, а выходной-9

Просмотрите обсуждение в приложении к программированию NetLogo.

Применение Частичной Функции

Функция с одним параметром называется одномерной или унарной. Функция с двумя параметрами называется бивариантной или двоичной. Функция с тремя параметрами называется тернарной. Число параметров-это арность функции. Может быть полезно применить функцию с несколькими параметрами к меньшему числу или аргументам. Чтобы получить функцию более низкой арности. Предположим, например. Что у нас есть addфункция. Которая просто добавляет два аргумента. Это бивариантная функция. Мы можем создать одномерную add1функцию. Которая добавляет 1к своему аргументу. Частично применяя add функция. Для получения дополнительной информации см. статью Википедии о частичном применении.

Подсказка

Рассмотрим следующую двумерную функцию.

to-report biggest [#x #y] отчет ifelse-value (#x

Применяя частичную функцию. Используйте ее для замены отрицательных значений нулями.

Рефакторинг

Программисты разбивают большие сложные задачи на управляемые части—процесс. Известный как декомпозиция или факторинг. Часто первоначальная реализация программы выявляет преимущества альтернативной декомпозиции проблемы. Возможные преимущества разнообразны. Включая улучшенную читабельность. Более легкую ремонтопригодность или лучшую скорость выполнения. Изменение кода для реализации альтернативной декомпозиции называется рефакторингом кода.

Государство

Система. Которая изменяется с течением времени. Имеет определенную конфигурацию в каждый момент. Например, выключатель света может быть включен или выключен. Мы суммируем полную конфигурацию в данный момент времени как состояние системы в это время. Например, мы не многократно описываем всю структуру выключателя света; мы просто говорим. В каком положении он находится. В этом примере выключатель света имеет только два состояния: включено и выключено.

По мере выполнения компьютерной программы она производит изменения в состоянии компьютера. Например, программа может изменять значения переменных. Что изменяет состояние памяти компьютера. Состояние программы суммирует текущую конфигурацию состояния компьютера. Полученную в результате выполнения программы. В модели. Основанной на агентах. Каждый агент может рассматриваться как небольшая динамическая система. Которая взаимодействует с большим ssytem. Текущие значения его атрибутов данных составляют состояние агента.

Государственная машина

Простой конечный автомат может быть охарактеризован конечным набором состояний ( состояний

S

), конечное множество входных данных (

I

), а функция перехода состояния

(S×I)S

Запускаем машину в начальное состояние (

s0

), а последующие состояния являются ответами на входные данные. Итак

s1=n(s0,i0)

,

s2=n(s1,i1)

и так далее. Например, в простой СИ-модели вирусной инфекции есть два состояния: восприимчивое и зараженное. Каждый период имеет логический вход. Который является истинным. Если имело место воздействие болезни. И ложным в противном случае. Восприимчивый агент переходит в зараженное состояние. Когда входные данные верны.

Конечная машина может дополнительно включать выходную функцию,

S×IO

, где

O

— конечный набор возможных выходов. Выходы обычно обозначаются как

ot=ω(st,it)

. Здесь

t

не обозначает время; это просто счетчик для входной последовательности. Когда государственная машина производит выходы. Ее можно использовать в качестве преобразователя: преобразователя входной последовательности в последовательность выходов.

Жесткое кодирование

Жесткое кодирование включает в себя включение литерального значения непосредственно в исходный код программы. Изменение жестко заданного значения требует редактирования исходного кода.

Жесткое кодирование становится особенно проблематичным. Когда часто изменяемое значение встречается в нескольких местах исходного кода. Например. Если важный параметр модели жестко закодирован в нескольких местах. То при каждом изменении параметра он должен изменяться во всех этих местах. Это нарушение DRY и, соответственно. Подвержено ошибкам. Лучше ввести раздел конфигурации (или отдельный файл конфигурации). Который связывает параметр модели со значением. А затем использует имя параметра. А не жестко закодированное значение во всем исходном коде.

С другой стороны, значения. Которые встречаются в программе один раз и. Как ожидается. Будут меняться редко. Если вообще когда-либо. Могут быть разумно жестко запрограммированы. Введение именованного параметра модели для каждого возможного значения. Которое управляет поведением модели. Может быть неизмеримо запутанным. Поиск правильного баланса между жестким кодированием и конфигурацией-это часть искусства программиста. Внимание к СУХОМУ принципу обеспечивает хорошее руководство.

Логическая связка

Напомним, что логическим выражением является либо Trueили False. Языки программирования часто позволяют объединять логические выражения с логическими связями для формирования новых логических выражений. Они также называются булевыми операторами. Большинство языков программирования предоставляют двоичные булевы операторы по крайней мере для логического соединения (and) и логического дизъюнкции (or). Дополнительный унарный оператор обеспечивает логическое отрицание (not). Краткое введение см. в статье Википедии о логических связях. Более подробную информацию см. в главе 3 [Lehman.Лейтон.Meyer-2018-MathCompSci].

Распределение вероятностей

Распределение вероятностей характеризует вероятность возможных исходов. Простейшим примером является дискретное равномерное распределение. Где каждый из конечного набора исходов имеет равную вероятность. Простые примеры включают результат от подбрасывания честной монеты или результат от броска честного кубика. Генерация фактического значения из распределения вероятностей называется извлечением из распределения. Когда возможные исходы численны. Фактический результат называется случайной вариацией.

Грубо говоря. Функция распределения вероятностей (PDF) говорит нам. Насколько вероятно. Что мы получим определенные значения из этого распределения. Например, предположим. Что мы подбрасываем честную монету и записываем

0

если выпадет решка и

1

если он поднимет голову. PDF-файл для этого дискретного равномерного распределения определяется следующим образом. (В качестве альтернативы это называется вероятностной массовой функцией распределения.)

P[0]=0.5P[1]=0.5

Аналогично, предположим. Что мы бросаем кубиковую монету. А затем подсчитываем количество пипсов. Показанных на верхней грани. PDF-файл для этого дискретного равномерного распределения определяется следующим образом.

P[1]=1/6P[2]=1/6P[3]=1/6P[4]=1/6P[5]=1/6P[6]=1/6

Процедурное программирование

Программирование называется императивным, когда программист пишет инструкции. Которые говорят компьютеру. Как вносить изменения шаг за шагом. В определенной последовательности. Императивное программирование определяет. Как именно компьютер должен выполнять задачи. А не просто определяет. Какие задачи выполнять. Эти задачи могут быть такими же простыми. Как назначение нового значения переменной или печать значения переменной на выходной терминал.

Императивное программирование называется процедурным, когда блоки инструкций по программированию объединяются в именованные подпрограммы. Известные как процедуры. Многие языки поддерживают процедурное программирование. Включая Python и NetLogo. Как правило. Процедурные программы должны стремиться к разделению команд и запросов. Проще говоря. Обычно желательно отделять команды от функций. Командная процедура изменяет состояние компьютера или подключенных периферийных устройств. Но не возвращает значение для использования программой. Функция создает значение. Которое будет использоваться в другом месте программы.

Подсказка

NetLogo часто использует термин процедура репортера для функций. Python использует термин функция как для командных процедур. Так и для функций.

Программа

Современная компьютерная программа использует язык программирования для предоставления инструкций компьютеру. Языки программирования могут быть прочитаны и написаны программистами. Они превращаются в инструкции. Которые компьютер может понять с помощью компилятора или интерпретатора. По историческим причинам короткие программы на некоторых языках программирования иногда называют скриптами. Это особенно верно для языков. Которые предоставляют интерактивный переводчик. Термин сценарий первоначально подразумевалась короткая программа. Разработанная для выполнения простой задачи. Как правило. Путем управления функционированием других приложений. Это особенно верно для сценариев оболочки: сборников инструкций. Распознанных командной оболочкой операционной системы.

Псевдослучайные числа

Современные языки программирования часто предоставляют генераторы псевдослучайных чисел (PRNG). Которые обеспечивают потоки чисел. Которые ведут себя как реальные случайные числа. Наиболее распространенная установка PRNG генерирует число неинформативно на единичном интервале. Это вычислительная версия стандартного равномерного распределения. Такой возможности достаточно для того. Чтобы квалифицированный программист мог генерировать случайные переменные из различных распределений. Тем не менее. Многие современные языки обеспечивают гораздо более широкие возможности PRNG.

В качестве технической стороны. На самом деле невозможно сгенерировать все числа в единичном интервале. Численные вычисления обычно выполняются с числом. Которое использует ограниченный объем памяти. И соответственно только конечное число значений может быть точно представлено. В этом курсе конечная точность числовых типов данных обычно не касается нас.

Подсказка

NetLogo предоставляет множество примитивов для генерации псевдослучайных чисел. Возможно, наиболее часто используемый из нихrandom-float-это тот. Который возвращает равномерно распределенное число с плавающей запятой в вещественном (то есть плавающем) интервале. random-floatРепортер принимает один числовой аргумент и возвращает случайное значение между входным аргументом и нулем. Используя угловые скобки для указания того. Где нам нужно заменить код (число или выражение с числовым значением), synatx:


Например, random-float 1возвращает число в интервале

[0..1)

(В качестве технической детали обратите внимание. Что это полузакрытый интервал.) Именно так мы обычно выбираем образец из стандартного равномерного распределения в NetLogo. NetLogo также предоставляет randomкоманду для получения случайных целых чисел. Кроме того. NetLogo предоставляет случайные вариации из множества других распределений.

Подсказка

NetLogo обеспечивает равномерное распределение с помощью randomфункции в случайном модуле своей стандартной библиотеки. Например, import random; print(random.random())печатает число с плавающей запятой. Равномерно вычерченное из интервала

[0..1)

. (В качестве технической детали обратите внимание. Что это полузакрытый интервал.) Python также предоставляет случайные вариации из множества других дистрибутивов, а NumPy предоставляет множество дополнительных возможностей.

Случайное семя

До того. Как компьютеры стали широко доступны. Ученые получали случайные числа для экспериментов из книги случайных чисел. Они открывали книгу произвольно. Чтобы выбрать начальную страницу. Столбец и строку. А затем мы последовательно зачитывали цифры. Начиная с этой точки. В настоящее время весь этот процесс реализуется на компьютере с помощью генератора псевдослучайных чисел (PRNG_). Установка случайного семени для PRNG_ похожа на выбор столбца и строки страницы.

Подсказка

См. Документацию по этой random-seedкоманде. Имейте в виду. Что установка значения random-seedin BehaviorSpace приводит к его сбросу перед каждым запуском (а не один раз за эксперимент). Однако вы можете установить значение during setupкак функцию от behaviorspace-run-number. Самый простой пример random-seed behaviorspace-run-number.

С принтами

Большинство языков имеют один или несколько способов отображения значений в настройках командной строки. printКоманда или функция-это обычный способ обеспечить эту функциональность.

Подсказка

Графический интерфейс NetLogo предоставляет консоль командного центра. Вы можете использовать команду NetLogo printдля отображения значений в этой консоли. (Другими альтернативами являются show, type, и write.) (Различия немного тонкие; в словаре NetLogoсм. записи дляprint, show,type, и write.)

Пример: предположим. Что у нас есть глобальная переменная nHeads. Мы можем ввестиprint nHeads, чтобы напечатать значение этой переменной. Печать объекта печатает его строковое представление; явное преобразование в строку обычно не требуется. Когда мы хотим построить строку. Мы можем использовать wordпримитив. Например, print (word "heads: " nHeads ", tails: " nTails).

Подсказка

Python 3 предоставляет встроенную printфункцию. Печать объекта печатает его строковое представление; явное преобразование в строку обычно не требуется.

Оценка короткого замыкания

Логически мы знаем. Что не все лебеди белые. Как только мы встречаем черного лебедя. Поэтому, если мы хотим оценить утверждение о том. Что все лебеди белые. Мы можем оценить как ложное самый первый раз. Когда мы сталкиваемся с черным лебедем. Вместо того чтобы продолжать изучать всех лебедей. Мы можем “закоротить” нашу оценку. Многие языки программирования используют это наблюдение для быстрого вычисления.

Подсказка

all?Примитив обеспечивает кратковременную оценку. Как andи orоператоры and.

Подсказка

Функции alland anybuiltin обеспечивают кратковременную оценку. Как andи orоператоры and.

исходный код

Компьютерные программисты используют языки программирования для создания компьютерных программ. Программисты пишут исходный код. Который хранится в одном или нескольких файлах-обычно в виде обычного текста. Код представляет собой читаемый человеком набор компьютерных инструкций (на каком-либо языке программирования). Исходный код не может быть непосредственно выполнен компьютером. Человекочитаемые инструкции должны быть преобразованы (компилятором или интерпретатором) в инструкции. Понятные компьютеру.

Конкатенация строк

Конкатенация строк создает большую строку из меньших строк.

Подсказка

Используется wordдля объединения строк. Список строк может быть объединен с reduceними . Например, reduce word ["this" "that"].

Обратите внимание. Что wordэто автоматически преобразует другие значения в строки. Например, предположим. Что у нас есть глобальные переменные nHeadsи nTails. Мы можем напечатать информативную сводку их значений. Например, введя:

печать (слово 

Подсказка

Строки могут быть объединены со знаком плюс: "this" + "that". Список строк можно объединить. Соединив их с пустой строкой: "".join(["this", "that"])

Числа могут быть преобразованы в строки с strпомощью команды.

Список

В этом курсе термин list обычно может обозначать любой упорядоченный тип данных. Который допускает целочисленную индексацию для доступа к элементам. В контексте обсуждения конкретного языка или типа данных понятие соответственно ограничено.

Петлевая Конструкция

Когда мы хотим повторно выполнить блок кода. Мы обычно используем циклическую конструкцию. Императивные циклические конструкции традиционно включают forв себя циклы и whileциклы. В таких конструкциях код. Который будет многократно выполняться. Называется телом цикла. Функциональные циклические конструкции традиционно включают карты и сокращения (также называемые сгибами).

Полезная петлевая конструкция также должна позволять нам указывать компьютеру. Когда следует прекратить повторение действия. Часто повторяемая шутка описывает программиста. Который не может перестать мыть голову шампунем. Потому что инструкции таковы: “вспенить; прополоскать; повторить”. Определенные циклы задают количество итераций перед выполнением тела цикла. Неопределенные циклы выполняются условно. Причем конечное число итераций зависит от того. Что происходит в теле цикла.

Интернет-ресурс:

https://en.wikipedia.org/wiki/Control_flow#Loops

Подсказка

NetLogo предоставляет как императивные. Так и функциональные циклические конструкции. Императивные конструкции включают repeatв себя , while, и foreach. Декларативные конструкции включают mapв себя , filter, и reduce.

Подсказка

Python предоставляет как императивные. Так и функциональные циклические конструкции. Императивные конструкции включают whileв себя и for. Декларативные конструкции включаютmap,filter, и functools.reduce.

Псевдокод

Псевдокод описывает фактическую реализацию в коде способом. Который является (по крайней мере. Несколько) независимым от языка программирования. Он смешивает естественный язык и математику с кодирующими структурами. Чтобы лучше передать цель и структуру и фактическую реализацию. Ключевая цель при написании псевдокода состоит в том. Чтобы общаться алгоритмически. Не предполагая общего языка программирования.

Скорость изменения

Рассмотрим переменную

xt

, измеряется с фиксированными приращениями времени. За период с

t

к

t+1

, его скорость изменения равна

xt+1xt

Скорость изменения всегда является переменной потока: ее мера должна относиться к периоду времени. Темп роста от

t

к

t+1

is

(xt+1xt)/xt

Это также называется пропорциональной скоростью изменения в течение периода. И это иногда называют пропорциональной скоростью роста. Соответствующее количество

xt+1/xt

иногда его называют валовым темпом роста.

Рекурсия

Функция считается рекурсивной (или. Что эквивалентно. Рекурсивной). Если она определена в терминах самой себя. Например, рассмотрим определение функции на натуральных числах по

f[n]=nf[n1]

. Это разумно только в том случае. Если что-то останавливает рекурсивные вызовы. Поэтому рекурсивные функции обычно определяют базовый случай. Который возвращает значение. И рекурсивный случай. В котором функция вызывает себя с новым аргументом.

Чтобы продолжить приведенный выше пример. Если мы определим только рекурсивный случай

f[n]=nf[n1]

, то вызов этой функции не имеет указанной точки остановки. Но если мы добавим к этому определению функции базовый случай, то

f[0]=1

, то функция рекурсирует только до тех пор. Пока не встретит базовый случай. Функциональные языки программирования часто используют рекурсию там. Где более императивные языки используют циклическую конструкцию.

Подмости

Термин В этом курсе речь идет о коде. Который присутствует во время разработки кода. Но не запускается в окончательной версии программы.

Во время разработки кода программисты часто временно добавляют код. Чтобы помочь в “построении” программы [Bentley-1985-ACM]. По аналогии со строительством. Разработчики используют термин строительные леса для этих временных сооружений. Строительные леса должны помочь разработке программы. Облегчая обнаружение ошибок. Например, во время начальной работы над программой может быть полезна либеральная печать промежуточных результатов и проверка ошибок.

Как только программа завершена и корректна. Выход из строительных лесов становится раздражающим и должен быть подавлен. Иногда мы вообще убираем строительные леса; в других случаях имеет смысл превратить их в комментарии. Документирующие прошлые строительные леса.

Разделение интересов

В компьютерном программировании разделение задач состоит из двух компонентов: программы должны быть разложены на части. И каждая часть должна хорошо справляться с одной задачей. Забота — это всего лишь цель. Которая должна быть достигнута программой. В контексте данного курса разделение интересов означает. Что реализация функций и процедур как правило. Он будет кратким и не будет стремиться к общности в ущерб сложности. Это также означает. Что функциональные возможности агентов в конкретной модели обычно отражают только потребности этой модели. Отбрасывая ненужные атрибуты и поведение. Это повышает читабельность. Упрощает отладку и облегчает повторное использование кода.

Следует отметить. Что проблемы не всегда легко отделить друг от друга. Особенно общие или сквозные. Например, озабоченность эффективностью вычислений может быть нелегко отделить от других целей программы. (Более подробную информацию и предысторию смотрите в статье Википедии о разделении интересов.) Тем не менее. Внимание к разделению интересов является полезным принципом проектирования компьютерных программ.

побочные эффекты

Подпрограмма имеет побочный эффект, если она изменяет состояние программы или вызывает наблюдаемое событие. Примеры наблюдаемых событий-печать в консоль (или в файл) или печать в графическое окно. Изменение значения глобальной переменной является примером изменения состояния программы. Чистая функция-это функция без побочных эффектов.

Когда мы говорим. Что функция не имеет побочных эффектов. Мы имеем в виду. Что оценка функции никак не изменяет состояние программы. Это включает его состояние ввода-вывода. Поэтому функция. Которая печатает на консоль. Не является чистой. Более подробную информацию см. в статье Википедии о побочных эффектах.

Подпись

Сигнатура именованной подпрограммы включает в себя ее имя и сигнатуру типа. Сигнатура типа характеризует тип (и порядок) аргументов. Которые использует подпрограмма. И тип выходных данных. Которые она производит.

Критерий Остановки

Критерий остановки определяет обстоятельства. При которых итерация графика моделирования должна прекратиться. Это также известно как условие остановки, критерий завершенияили правило остановки.

Подсказка

stopКоманда заставит процедуру немедленно прекратить выполнение и выйти. Как правило. NetLogo не предусматривает. Что это событие будет замечено вне остановленной процедуры. Тем не менее, кнопки forever являются важным исключением. Если процедура. Непосредственно вызываемая кнопкой forever. Выполняет stopкоманду. То кнопка forever также будет остановлена.

Корешок

Заглушка — это функция или процедура, которая действует исключительно как заполнитель во время разработки кода. Заглушка-это замена еще не разработанной подпрограммы (например, функции или процедуры). Тело подпрограммы пусто. Содержит только комментарии или в противном случае является радикально неполным. Хорошая заглушка позволит вашей программе компилироваться и запускаться. (Конечно. Ваша программа может работать неправильно. Пока вы не замените заглушку полной реализацией.)

Хотя заглушка подпрограммы по существу пустая или неполная. Она должна обеспечивать правильный интерфейс с остальной частью программы. Заглушка должна выполняться без проблем. Даже если тело еще не реализовано. Для этого заглушка должна произвести синтаксически правильную программу до того. Как ее тело будет реализовано.

Цель заглушки состоит в том. Чтобы позволить программе работать без ошибок. Несмотря на то. Что она все еще находится в недоразвитом состоянии. На ранних стадиях разработки программы обычно предоставляется заглушка для одной или нескольких процедур или функций. Предоставление таких заглушек часто называют “заглушением”. И это важная стратегия разработки кода.

Каждая заглушка должна использоваться без ошибок везде. Где в конечном итоге будет использоваться полностью реализованная подпрограмма. Поэтому каждая заглушка должна иметь ту же подпись, что и конечная реализация. То есть для того. Чтобы правильно играть свою роль. Заглушка должна принимать те же типы аргументов и возвращать тот же тип вывода (если таковой имеется). Что и конечная реализация.

Подпрограмма

Подпрограмма-это блок кода. Который мы можем выполнять при необходимости. Программисты создают подпрограммы из блоков кода. Которые полезно повторно использовать. Большинство языков программирования позволяют создавать подпрограммы . Которые производят возвращаемое значение, которое этот курс вызывает функции, и те. Которые этого не делают. Которые этот курс вызывает процедуры.

Подсказка

Общепринятая терминология NetLogo немного отличается. Программисты NetLogo часто используют термин процедура reporter для функции и командная процедура для процедуры.

Определение подпрограммы и терминология значительно различаются в зависимости от языка. Подпрограмму можно назвать процедурой, функцией, процедурой. Методом или подпрограммой. Этот курс использует термин функция для любой вызываемой подпрограммы. Которая явно возвращает значение. И он использует термин процедура для подпрограммы. Которая явно не возвращает значение. (Процедуры могут быть полезны из-за их побочных эффектов.) Вызов функции или процедуры вызывает выполнение подпрограммы (например. Посредством ее имени). Если функция или процедура принимает входные аргументы. То в этом курсе говорится. Что мы применяем это к ее доводам.

Подпрограмма-это набор инструкций программы. Предназначенных для выполнения в виде группы. Подпрограмма вызывается, если существует sytax для вызова (то есть ветвления) подпрограммы. А затем возврата назад. Чтобы продолжить выполнение следующей инструкции после вызова. Это означает. Что одна и та же подпрограмма может быть легко использована несколько раз. Повторное использование кода с помощью подпрограмм экономит время и делает ошибки менее вероятными. (Например. Это значительно облегчает удовлетворение СУХИМ.)

Компьютерная программа обычно определяет набор подпрограмм. Однако также очень часто программа зависит от подпрограмм. Определенных в отдельных библиотеках. Полезные библиотеки разработаны таким образом. Что они могут быть легко использованы несколькими программами. (Это опять же делает его гораздо легче удовлетворить СУХИМ.)

Когда программа имеет доступ к вызываемой подпрограмме. Выполняющей определенную вычислительную задачу. Она может просто вызвать эту подпрограмму для выполнения этой задачи. Наиболее распространенным способом предоставления доступа является присвоение подпрограмме имени. Которое распознается во всей программе. Большинство языков программирования допускают создание именованных подпрограмм. Потому что они очень полезны. Именованные подпрограммы важны для

семантика

Хорошее имя передает намерение кода.

ремонтопригодность (СУХАЯ)

Сухое правило гласит. Что мы должны полагаться на одну реализацию любой задачи.

Командная процедура

Мы будем использовать термин командная процедураили просто процедурадля подпрограммы , которая явно не возвращает значение. (Мы используем термин функция для подпрограммы, которая явно возвращает значение.) Некоторые языки поддерживают функции. Но не процедуры. Но этот курс предполагает. Что процедуры поддерживаются. Поскольку процедуры не дают возвращаемого значения. Мы создаем для них другие эффекты (называемые побочными эффектами). Когда мы создаем процедуру исключительно для инкапсуляции некоторой функциональности. Необходимой вызывающей процедуре. Мы можем ссылаться на нее как на подпроцедуру. (Например. Мы можем создать pay подпроцедура для реализации части поведения giveGiftпроцедуры.)

Подсказка

NetLogo использует термин обозначения подпрограммы, которая явно не возвращает значение. Чтобы создать процедуру в графическом интерфейсе NetLogo. Используйте Codeвкладку и поместите определение процедуры после любых объявлений. Например, определения процедур должны приходить после объявления любых глобальных переменных. Мы создаем командную процедуру с toendпомощью команд и. Дополнительные сведения см. в документации NetLogo по процедурам.

Подсказка

Создайте процедуру с defключевым словом. В терминологии Python термины (В отсутствие явного возвращаемого значения существует неявное возвращаемое значение None.)

Подсказка

Функциональные языки. Такие как Haskell. Способствуют реализации вычислений с чистыми функциями (т. Е. выходы зависят только от входных данных и никаких побочных эффектов). Однако нам нужны побочные эффекты. Поэтому взаимодействие с миром изолировано от основного языка. (Они выталкиваются в IOМонаду.)

Топология

В агентном моделировании и моделировании термин топология часто используется для описания обработки границ в пространственной модели. Например, в двумерном прямоугольном пространстве топология тора-это топология, которая оборачивается по краям (сверху-снизу и слева-справа). В то время как топология коробки-это топология, которая не оборачивается. С коробчатой топологией агенты не могут перемещаться в некоторые координаты. Так как они лежат за пределами пространственного экстента модели.

Тип Аннотации

Аннотация типа содержит информацию о типе данных, связанном с именем. Существует много подходов к аннотации типов. И языки сильно различаются по своим подходам к аннотации. Этот курс использует упрощенную аннотацию пользовательского типа. Очень слабо подверженную влиянию UML. Эта аннотация используется только в не зависящих от языка схемах кода. Представленных в тексте. А не в реальных примерах кода.

В аннотациях этого курса основными числовыми типами являются либо Realили Integer. Допустимы коллекции одного типа. А кратность коллекции может быть указана в скобках после базового типа. Например, список действительных чисел может быть аннотирован такReal[0..*], чтобы указать. Что в коллекции есть ноль или более действительных чисел. В этом случае Real[*]Real[]также принимаются и обозначения.

В контексте аннотаций типов двоеточие (:) может произноситься как “имеет тип” или может быть дано любое эквивалентное выражение. Например, (x: Real)может читаться как “x реально”. (Пробел до или после двоеточия необязателен.)

В этом курсе аннотация типа функции отличается от UML. Стрелка указывает от аргументов к типу возвращаемого значения. Например, (Real,Real)->Realэто тип биваратной вещественной функции. Когда мы хотим указать имена для параметров функции. Та же самая функция может быть аннотирована. Например (x:Real,y:Real)->Real.

В другом отступлении от UML этот курс иногда использует °символ для представления отсутствия явного или полезного возвращаемого значения. (При необходимости это можно произнести как “ничего”.) Так, например. Аннотация типа (Real) -> °описывает процедуру, которая принимает один реальный аргумент. Но ничего не возвращает. Если процедура не имеет параметров. То она не получит аннотацию типа. Неявно используемый язык поддерживает определение командной процедуры.

Модульный тест

Модульный тест-это основанный на коде тест программного компонента. Который известен как модуль. Эта книга вводит очень простые тесты подпрограмм. Где единицами являются функции или процедуры. Многие языки обеспечивают обширную поддержку сложного модульного тестирования.

Подсказка

Хотя NetLogo не предоставляет фреймворк модульного тестирования. Продвинутые пользователи могут использовать любой фреймворк тестирования JVM. Это подход, используемый внутренним набором тестов NetLogo. Для этого курса, однако. Достаточно простых процедур тестирования.

Переменная

Математика и информатика имеют родственные и часто тонкие представления о том. Что значит быть переменной. Этот курс рассматривает эту концепцию довольно поверхностно. Думая о переменной как о имени. Которое может представлять значение.

Это значение может быть однозначно известно, например. Когда программист делает одно прямое назначение переменной. Которая никогда не изменяется. (В этом случае мы будем свободно называть его константой.) Она может быть неизвестной. Но определимой. Как в случае. Когда переменная встречается в уравнении. Которое еще не решено. В этом курсе наиболее важны два связанных между собой различия: различие между глобальными и локальными переменными и различие между свободными и связанными переменными,

Масштаб

Программисты часто говорят о области действия переменной. Которая очень грубо относится к той части программы. Где переменная может быть названа по имени. Этот курс, как правило. Рассматривает только два типа области: локальный и глобальный. Имя переменной имеет глобальную область, если оно видно везде в компьютерной программе. Так что любая часть программы может ссылаться на него. Переменная с глобальной областью действия является глобальной переменной. Напротив, имя переменной имеет локальную область, если оно имеет значение только в пределах своего блока кода. Переменная с локальной областью действия является локальной переменной.

В современных языках программирования локальные переменные почти всегда более полезны. Чем глобальные. Например, большинство языков программирования гарантируют. Что переменные. Введенные в функцию определение может иметь смысл только в пределах определения функции. Они видны внутри определения (то есть локально). Но не видны остальной части программы. Эти переменные имеют значение только внутри определения функции. Мы не можем ссылаться на них вне контекста этого определения. Это означает. Что две разные функции могут использовать одно и то же имя переменной. Не создавая никакой путаницы или конфликта.

Существует много языковых вариаций на эту тему. И обсуждение сферы охвата может стать техническим. Дополнительные. Но все еще очень неформальные подробности см. в Википедии обсуждение переменной областидействия .

Свободные и связанные переменные

Различие между свободной переменной и связанной переменной легче всего понять в контексте определения функции. Предположим. Что мы определяем функцию логистического роста как

xx+gx(1x)

. Переменная

x

связан в определении функции. Что означает. Что его значение полностью исчерпывается определением функции. Например,

yy+gy(1y)

определяет ту же функцию. Подставляя

y

для

x

это никоим образом не меняет определение функции.

В контексте этого определения функции переменная

g

свободен: его значение не исчерпывается определением функции. Что касается нашего определения функции функции,

g

имеет значение. Которое свободно определяется в другом месте. Любое изменение этого внешнего значения

g

изменит функцию. Поэтому мы часто говорим. Что функция параметризуется

g

. Мы не можем заменить

y

для

g

в нашем определении функции. Если только мы также не можем внести изменения в другие части нашей программы.

Подсказка

В графическом интерфейсе NetLogo глобальная переменная может быть объявлена и инициализирована путем создания ползунка. Другие глобальные переменные должны быть объявлены с globalsпомощью команды. Когда вы объявляете глобальную переменную. Она инициализируется значением 0. Вы можете получить доступ к глобальным переменным в любом месте вашей программы (а также в командном центре).

Чтобы объявить глобальную переменную с помощью графического интерфейса NetLogo. Перейдите на Codeвкладку. В верхней части. Перед любым определением процедур. Используйте globalsпримитив для объявления глобальных переменных.

Подсказка

Глобальные переменные могут быть введены в любое время; их не нужно объявлять отдельно. Чтобы ввести глобальную переменную. Просто назначьте значение имени на уровне модуля (т. Е. Вне любых определений объектов).

В исходном файле. Который его определяет. Глобальная переменная может быть доступна любому коду. Который следует за ее введением. Попытка получить доступ к глобальной переменной до того. Как она была определена. Вызовет a NameError.

Подсказка

Функциональные языки программирования. Такие как Haskell. Допускают именованные значения. Но избегают переменных.) Если вы работаете с таким языком и, похоже. Нуждаетесь в переменных. Вам следует принять другую стратегию. Пользователи Haskell могут рассматривать Stateмонаду.

Проверка

Проверка кода гарантирует. Что код работает так. Как задумано программистом (например. Как того требует концептуальная модель). Хорошие тесты-это основной компонент верификации кода. В этом курсе рассматриваются два вида проверочных тестов: тесты времени выполнения и модульные тесты. Тесты времени выполнения выполняются по мере выполнения всей программы. Модульные тесты выполняются отдельно от обычного выполнения программы.

При написании юнит-теста естественно задаться вопросом. Что такое юнит. В принципе, блок-это наименьшая часть программы. Для которой имеет смысл изолированное тестирование. Когда программа определяет чистую функцию, это явно единица измерения. На самом деле. Одна из ключевых особенностей чистых функций заключается в том. Что их легко проверить эффективно и однозначно.

Модульные тесты в идеале зависят только от тестируемой единицы. Цель модульного тестирования состоит в тестировании изолированных фрагментов кода. Чтобы однозначно определить источник любых провалов тестирования. Если модуль имеет зависимости в программе. Источник провала теста становится неоднозначным. Иногда тест может заменить заглушку для зависимости. При необходимости код может быть рефакторизован. Чтобы облегчить тестирование независимых блоков.

На практике единицы для тестирования часто бывают больше. В объектно-ориентированном программировании единицей тестирования часто является целый класс. Хотя в принципе это может быть отдельный метод.

Подсказка

Тесты времени выполнения в NetLogo обычно выполняются errorпри условии провала теста. Этот подход означает. Что выполнение кода прекращается. Когда тест терпит неудачу. Модульное тестирование обычно проходит таким же образом. Собирая отдельные тесты вместе в файл NetLogo source (.nls). NetLogo не предоставляет фреймворк модульного тестирования. Однако, поскольку NetLogo работает на JVM. Для модульного тестирования можно использовать любую платформу тестирования JVM. (Такой подход встречается довольно редко.)

Подсказка

Тесты времени выполнения Python часто полагаются на assertобработку исключений или без нее. Хорошим свойством утверждений является то. Что они могут быть подавлены всякий раз. Когда это необходимо (вызывая Python с параметром -Oкомандной строки).

Модульное тестирование очень хорошо развито в Python. Стандартная библиотека включает unittestв себя модуль. Это остается очень хорошим выбором. Хотя многие программисты предпочитают работать с альтернативами terser (такими как pytestor nose).

Белое пространство

Символ пробела традиционно представляет собой просто пустое пространство без соответствующего глифа. Сюда входят пробелы. Табуляции и символы конца строки. Языки радикально отличаются в своей интерпретации белого пространства. Например, пробел обычно игнорируется в NetLogo. Но ограничивает блоки кода в Python. При программировании на языках. Игнорирующих пробелы. Тем не менее полезно разработать последовательные соглашения для отступов и интервалов.