В этой статье разберёмся, как создать Питон-скрипт в Динамо, как вводить и выводить из него данные, как создавать условия, чтобы по-разному обрабатывать данные или игнорировать их.

Картинка для обложки

Создание Питон-скрипта, ввод данных

Нод для ввода питоновского кода создаётся так же, как все остальные. Проще всего нажать по рабочему пространству правой кнопкой мыши и начать вбивать слово python. Динамо предложит вам два варианта: Python Script и Python Script from String. Первый нод — это нод, в котором можем писать код напрямую. На второй нод нужно подать готовый код из текстового файла.

Второй вариант удобен в том случае, если сам код вы пишете не в Динамо напрямую, а в каком-нибудь редакторе кода, где удобно подсвечивается синтаксис, есть подсказки и так далее. Я так обычно и делаю, а потом копирую и вставляю код в первый нод Питона.

Для примера будет брать обычный нод, чтобы у нас с вами всё было одинаково.

Как у большинства нодов в Динамо, у Питон-скрипта есть входные данные, их количество можно менять, и один выход. На вход мы подаём списки с данными или одиночные значения, на выходе будет результат обработки.

Тренироваться будем на кошечках, для этого создам список с числами от 0 до 5 с шагом 1, подам его на вход IN[0]. Нажму на плюсик и добавлю ещё один вход, IN[1]. На него подам текст "Ревитчик". Таким образом вы можете подать в Питон все необходимые стартовые данные.

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

Boilerplate в Питон-скрипте по умолчанию

Когда вы два раза нажмёте мышкой по Питон-скрипту, откроется окно редактора кода, в нём уже будет какой-то код. Он называется boilerplate, бойлерплейт-код. Так называют код, который всё время нужно писать, чтобы программный код нормально работал. Чтобы не делать это каждый раз, можно создать шаблон для нового скрипта, этот код будет вставляться туда сразу при создании.

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

Ввод данных в Питон-скрипт

У нас тут два входных потока с данными, список и текст. Для каждого мы создаём переменную и пишем в неё имя входа. Вот так:

Мы создали две переменные — list и text. В первую подали данные с входа IN[0], во вторую — с IN[1]. В принципе, можно не создавать переменные и сразу везде использовать IN[0] и IN[1], это тоже такие переменные. Но это менее читаемо, легче запутаться, поэтому так делать не нужно. Создавайте переменные с адекватными именами, чтобы было понятно, что там за данные.

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

Если в будущем надо будет добавить ещё данные — добавьте ещё вход в Питон-нод, подайте туда данные. Если будете удалять — не забывайте удалять и переменную, в которую присваивали данные с удалённого входа. Иначе получите вот такую ошибку: list index out of range, то есть мы ссылаемся на элемент в списке, а такого элемента нет. Про индексы ещё поговорим, когда будем работать со списками, станет понятнее текст ошибки.

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

Арифметические выражения в Питоне

Затрагиваю эту тему, чтобы сделать один важный акцент. В пункте выше мы присваивали значения переменным, для этого пользовались знаком равенства «=». Во многих языках программирования «равно» — это действие по присвоению значения переменной.

Дальше мы будем смотреть на условные выражения и, чтобы проверить, равно ли значение переменной чему-либо, будем пользоваться знаком «==». Это оператор сравнения, проверки, равно ли одно значение другому.

То есть «=» — это присвоить значение переменной. «==» — сравнить значение с другим значением. Все эти знаки называются операторами.

В первой статье цикла говорил, что Питон — это язык с динамической типизацией. Это значит, что я могу создать переменную A и приравнять её к списку. В итоге в переменной А будет хранится список. Потом я приравняю А к тексту, и Питон спокойно перезапишет значение, вместо списка будет текст. То есть тип данных поменялся, и никакой ошибки не было. В том же Ревите так сделать в формулах не получится.

Стандартные арифметические действия вроде суммы, умножения и так далее в Питоне обозначаются привычно, плюс, минус, звёздочка для умножения, слэш для деления.

Также есть целочисленное деление и получение остатка от деления. Целочисленное деление обозначается как знак процента «//». Получение остатка — «%».

Если записать выражение 10 // 3, то получим 3 — целое число от результата деления 10 на 3, 3.(3) — это полное значение, откидываем дробное, получаем 3.

Если записать 10 % 3, то получим остаток от целочисленного деления — 1. Целочисленное значение при делении 10 на 3 — это 3, три умножить на три — это девять, а 10 – 9 = 1, вот его и видим в результате.

Эти действия вам тоже когда-нибудь пригодятся, например для получения целого числа кусков трубы при её делении на отрезки.

Вывод данных

Сначала посмотрим вывод данных, а потом разберём условия. Так будет удобнее потом сразу смотреть, что делаем.

Вывод производится через специальную переменную OUT. Она как бы уже зашита в Питон-скрипт. Поэтому для вывода мы должны подать в эту переменную то, что хотим вывести. Это может одиночное значение, может быть список или несколько списков.

Давайте для примера выведем значение из нашей переменной text.

Питон-скрипт всегда выводит последнее значение переменной. Если я напишу её два раза подряд и присвою разные значения, то получу только последнее, так как по факту я перезаписываю значение переменной.

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

Условные выражения в Питоне

Довольно часто алгоритм нужно либо разветвить по какому-то условию, либо просто отбросить ненужные элементы. Тут нам помогают условные выражения. Схема выражения такая, напишу сразу в Питон-коде, чтобы подсветить синтаксис:

Пишем ключевое слово «if», после него надо написать условие, которое вернёт нам истину или ложь, и в конце двоеточие. Например: if text == "Ревитчик":

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

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

Здесь у нас получается более гибкая ситуация, чем в формулах в Ревите. В Ревите да и в Динамо-нодах мы обязаны указать, что будет, если условие не выполняется. Питон от нас такого не требует.

В случае, если нам нужно разветвление на два потока, то можно использовать пару ключевых слов if + else. В if подаём наше условие и действие при его выполнении, а в else — что делаем, если условие не выполнилось. После else мы не пишем какие-то условия, только ставим двоеточие и указываем, что делать. Тут не нужно условие, так как else распространяется на все случаи, когда условие или условия выше не выполнились.

То есть тут мы получаем как бы формулу из Ревита, в котором всегда указываем, что делаем, если условие не выполнилось. И так же, как в Ревите, можем делать промежуточные условия. Для этого есть ключевое слово elif. Его можно использовать только после if, а синтаксис его такой же, как у if.

Теперь давайте рассмотрим на примерах.

Одиночное условие

Давайте будем проверять наше текстовое значение. Если в переменной значение «Ревитчик», то выводим из кода результат «Красавчик». Пишется это вот так:

Обратите внимание на двойной знак равенства, когда мы сравниваем значение переменной с другим значением, на двоеточие в конце выражения, потом у нас отступ, переменная OUT, в которую через одиночный знак равенства записываем нужное значение.

Это синтаксис, его надо запомнить.

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

Условие не выполнилось, получили на выходе ноль. Это не текст, это по сути что-то вроде ошибки, пустого значения.

Условие If + Else

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

Условие не выполняется
Условие выполняется

Промежуточные условия Elif

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

Знак \n в тексте переносит текст на новую строку, но про строки будет отдельная статья.

Собственно, всё, это условия в Питоне. Ещё раз повторю, что надо запомнить:

  1. Условие должно возвращать истину или ложь.
  2. После условия надо поставить двоеточие.
  3. Дальше на новой строке делаем один отступ табуляцией.
  4. Пишем действие.
  5. Дальше можем либо ничего не делать, либо добавить команды elif со своими условиями, либо выходить из условия через else.

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

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

Булевы выражения

Это выражения, которые сами по себе являются значениями Истина или Ложь. Их тоже можно использовать в условиях, запись предельно простая:

Текст после знака решётки — это комментарий. Этот текст не воспринимается как программный ко, он не будет выполняться и не будет вызывать ошибок.

Некоторые ошибки и пустые списки Питон интерпретирует в условиях тоже как Ложь, поэтому их тоже можно использовать в условиях. Если подать в условие переменную с пустым списком, то условие не выполнится. Если в списке что-то будет, то вернётся Истина, условие выполнится. Это простейший способ проверить пустой ли список.

Равенство и сравнение чисел

number = 4

if number == 4: # равно четырём

if number >= 3: # больше или равно трём
    
if number > 2: # больше двух
    
if number < 8: # меньше восьми

if number >= 3 and number < 8: # больше или равно трём, но меньше восьми

if number < 10 or number > 15: # меньше десяти или больше пятнадцами

Здесь ключевое слово and — это логическое перемножение условий, то есть оба условия должны выполняться вместе, чтобы на выходе получилась истина. Полный аналог одноимённого оператора в Ревите.

Ключевое слово or — это логическая сумма, тоже аналог оператора в Ревите.

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

Равенство и сравнение текста

string_value = "Блог Муратова"

if string_value == "Блог Муратова": # проверка равенства текста, текст в Питоне можно писать и в одинарных кавычках

if "ура" in string_value: # проверка, есть ли текст "ура" в тексте "Блог Муратова", текст берётся из переменной

if "ура" not in string_value: # проверка, нет ли текста "ура" в тексте "Блог Муратова", текст берётся из переменной

Здесь ключевое слово in будет проверять, есть ли в слове указанные буквы. Если добавить not, то действие будет обратным. Наличие элемента в списке элементов тоже можно проверить такими командами:

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

Если действия простые и короткие, то условие можно записать в одну строку. Выглядит это так:

У такой записи две особенности: в ней обязательно должны быть блоки для выполнения условия и невыполнения, нельзя записать условие без блока else.

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

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