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

Как в реплит вернуться на шаг назад

  • автор:

Python: Результат логических выражений

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

Правила преобразования

Оператор ИЛИ работает так, что его выполнение слева направо прерывается и возвращается результат первого аргумента, который можно преобразовать в True . Если такого аргумента нет, возвращается последний — правый.

Посмотрите на пример:

print(0 or 1) ## 1 

В данном случае, число 0 эквивалентно False , а число 1 эквивалентно True . Таким образом, оператор ИЛИ вернет 1 , так как это первый аргумент, который может быть преобразован в True .

Возьмем пример посложнее:

print(0 or False or '' or [] or 42 or "Hello") ## 42 

В данном случае:

  • Число 0 эквивалентно False
  • Значение False уже является False
  • Пустая строка ( » ) эквивалентна False
  • Пустой список ( [] ) эквивалентен False
  • Число 42 эквивалентно True
  • Строка «Hello» также эквивалентна True

Оператор ИЛИ будет проверять значения слева направо, и возвращает первый аргумент, который может быть преобразован в True . В данном примере это число 42 .

Пример с оператором И:

print(0 and 1) ## 0 

Оператор И работает так, что его выполнение слева направо прерывается и возвращается результат первого аргумента, который можно преобразовать в False . Если такого аргумента нет, возвращается последний — правый.

print(42 and "Hello" and [] and 0) ## [] 

В данном случае:

  • Число 42 эквивалентно True
  • Строка «Hello» эквивалентна True
  • Пустой список ( [] ) эквивалентен False
  • Число 0 эквивалентно False

Оператор И будет проверять значения слева направо и возвращать первый аргумент, который может быть преобразован в False . В данном примере это пустой список ( [] ).

В Python есть два правила преобразования:

  • 0 , 0.0 , » и None приводятся к False . Эти значения называют falsy. Сюда входят еще другие типы данных, которые мы будем изучать на Хекслете
  • Все остальное приводится к True

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

value = name or '' # Примеры 234 or '' # 234 'hexlet' or '' # 'hexlet' None or '' # '' 

Если name примет одно из falsy-значений, переменной value будет присвоена пустая строка. В этом случае в последующем коде мы сможем работать с value как со строкой.

Но здесь есть потенциальный баг. Если name содержит falsy значение, а переменной value можно присвоить значения типа 0 , False , None , то код выше заработает неверно:

# Значение на самом деле есть, # но оно Falsy, поэтому не выбирается на условии OR False or '' # '' 0 or '' # '' None or '' # '' 

Составные выражения

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

Допустим, нам нужно реализовать код, в котором в переменную записывается:

  • Строка yes , если число четное
  • Строка no , если нечетное

Это можно сделать, если использовать знания, полученные выше:

# число четное result = 10 % 2 == 0 and 'yes' or 'no' # 'yes' # или сразу печатаем на экран print(10 % 2 == 0 and 'yes' or 'no') # => 'yes' # число нечетное print(11 % 2 == 0 and 'yes' or 'no') # => 'no' 

Эти выражения работают согласно порядку и приоритетам. Приоритет присваивания самый низкий, поэтому оно происходит в конце. Приоритет сравнения == выше, чем приоритет логических операторов and и or , поэтому сравнение происходит раньше. Дальше код выполняется слева направо, так как приоритет and выше, чем приоритет or . Рассмотрим по шагам:

# Для четного # 1 шаг 10 % 2 == 0 # True # 2 шаг True and 'yes' # Результат — истина # Проверка на or выполняется, но правая часть не исполняется, так как сразу возвращается 'yes' # Для нечетного # 1 шаг 11 % 2 == 0 # False # 2 шаг False and 'yes' # Результат — ложь, проверяем дальше # 3 шаг False or 'no' # Выбирается и возвращается 'no' 

Такую же схему можно использовать с любым выражением в начале:

print(somefunc() and 'yes' or 'no') 

Можете проверить себя и поэкспериментировать с кодом в Replit.

Двойное отрицание

Напомним, как выглядит операция отрицания:

answer = True print(not answer) # => False 

При двойном отрицании итоговое значение равно начальному:

answer = True print(not not answer) # => True 

Оператор not всегда возвращает булевое значение, независимо от типа переданного аргумента, а не заменяет значение на противоположное. Поэтому двойное отрицание тоже вернет булевое True/False.

answer = 'python' print(not answer) # => False print(not not answer) # => True 

Ошибка выбора

Представьте, что нам нужно проверить — значение равно одному или другому. Например, переменная value должна содержать одно из двух значений: first или second . Начинающие разработчики иногда записывают это выражение так:

value == ('first' or 'second') 

Однако такой код приведет к неверному результату. Необходимо вспомнить приоритет выполнения операций. Первым делом вычисляется все, что указано в скобках — ‘first’ or ‘second’ . Если выполнить этот код в Replit, то вывод будет таким:

python Python 3.8.2 (default, Apr 12 2020, 15:53:37) >>> 'first' or 'second' 'first' >>> 

Теперь заменим исходное выражение на частично вычисленное:

value == 'first' 

Совсем не то, что мы ожидали. А теперь вернемся к началу и напишем проверку правильно:

# Скобки ставить не обязательно, # потому что приоритет == выше чем приоритет or value == 'first' or value == 'second' 

Задание

Реализуйте функцию string_or_not() , которая проверяет является ли переданный параметр строкой. Если да, то возвращается ‘yes’ иначе ‘no’

string_or_not('Hexlet') # 'yes' string_or_not(10) # 'no' string_or_not('') # 'yes' string_or_not(False) # 'no' 

Проверить то, является ли переданный параметр строкой, можно при помощи функции isinstance():

isinstance(3, str) # False isinstance('Hexlet', str) # True 

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

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

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

Python: Срезы строк

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

Подстрока — это некоторая часть строки, которую нужно найти и извлечь.

Представим, что у нас есть дата в таком формате: 12-08-2034. Нам нужно извлечь из нее подстроку, в которую входит только год.

Если подумать логически, то нужно посчитать индекс символа, с которого начинается год, и затем извлечь четыре символа. Индексы в строке начинаются с нуля, значит, первый символ года доступен по индексу 6, а последний символ — по индексу 9. Проверим:

value = '12-08-2034' print(value[6]) # => 2 print(value[9]) # => 4 

Зная эти индексы, мы можем воспользоваться срезами и получить нужную подстроку:

value = '12-08-2034' year = value[6:10] print(year) # => 2034 

Срезы для строк в Python — это механизм, с помощью которого извлекается подстрока по указанным параметрам. В примере выше мы взяли подстроку с 6 индекса по 10 индекс, не включая, то есть с 6 по 9 включительно. Формула выглядит так:

str[начальный индекс:конечный индекс] # Пара примеров value = '01-12-9873' # Срез строки это всегда строка, # даже если внутри строки было число. value[1:2] # '1' value[3:5] # '12' 

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

value = 'Hexlet' value[3:] # 'let' value[:3] # 'Hex' 

Можно указать даже отрицательные индексы. В таком случае отсчет идет с обратной стороны:

value = 'Hexlet' # Правая граница отрицательная. Считаем -1 от конца строки value[3:-1] # 'le' # Левая граница отрицательная. Считаем -5 от конца строки value[-5:3] # 'ex' 

У срезов два обязательных параметра, но иногда используется и третий.

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

value = 'Hexlet' value[1:5:2] # el # 1:5 это 'exle' # шаг 2 это каждый второй, то есть 'e' и 'l' 

Все это можно комбинировать с открытыми границами, то есть без указания начала или конца:

value = 'Hexlet' value[:5:2] # 'Hxe' value[1::2] # 'elt' 

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

value = 'Hexlet' # Пропускаем обе границы value[::-1] # 'telxeH' 

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

value = 'Hexlet' # Символ с индексом 1 не будет включен в подстроку value[4:1:-1] # 'elx' 

Срезы можно указывать не только через числа, но и с использованием переменных:

value = 'Hexlet' start = 1 end = 5 value[start:end] # 'exle' 

Соберем все вместе:

value = 'Hexlet' value[::] = 'Hexlet' # Вся строка value[:] = 'Hexlet' # Вся строка value[::2] = 'Hxe' # Четные по порядку символы value[1::2] = 'elt' # Нечетные по порядку символы value[::-1] = 'telxeH' # Вся строка в обратном порядке value[5:] = 't' # Строка, начиная с шестого символа value[:5] = 'Hexle' # Строка до шестого символа value[-2:1:-1] = 'elx' # Все символы с предпоследнего до третьего в обратном порядке. Во всех случаях выборки от большего индекса к меньшему нужно указывать шаг 

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

Задание

В переменной value лежит значение Hexlet . Извлеките из него и выведите на экран срез, который получит подстроку xle . Это задание можно сделать разными способами.

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

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

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

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

Полезное

Определения

  • Срезы для строк — механизм, с помощью которого извлекается подстрока по указанным параметрам.

Как в реплит вернуться на шаг назад

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

Сама отмена может быть отменена. После отмены действия вы можете вернуть его выбрав в меню изображения пункт Правка → Повторить , или с использованием клавиши быстрого доступа, Ctrl + Y . Часто это полезно при оценке эффекта какого-либо действия, с помощью его неоднократной отмены и повтора. Обычно это происходит очень быстро, без дополнительного расхода ресурсов или изменения истории отмены, поэтому никакого вреда в этом нет.

Если вы отмените одно или несколько действий и затем произведёте какую-либо операцию кроме отмены и возвращения, возможности вернуть те действия больше не будет: они потеряны навсегда. Решением проблемы является дублирование изображения и работа с копией. (При этом не выполняйте пробные операции с оригиналом, поскольку история действий при дублировании не копируется.)

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

Действие отмены выполняется для каждого конкретного изображения: «история действий» является одним из компонентов изображения. В этих целях GIMP выделяет определённый объём памяти для каждого изображения. Увеличить или уменьшить объём выделяемой памяти можно в «Параметрах» в разделе Системные ресурсы. Здесь присутствуют две важные переменные: минимальное число уровней отмены , которое GIMP будет поддерживать вне зависимости от того, сколько эти уровни будут потреблять памяти, и максимальное количество памяти для отмены , при превышении этого объёма GIMP начнёт удалять самые старые элементы в истории отмены действий.

Хотя история действий является компонентом изображения, она не сохраняется вместе с ним в собственный формат GIMP с расширеним XCF (хотя все остальные свойства изображения сохраняются). Когда изображение будет открыто вновь, история действий будет пуста.

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

3.1. Неотменяемые операции

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

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

Закрытие изображения

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

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

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

Фильтры, и другие производимые дополнениями или скриптами действия, могут быть отменены также как и реализовываемые ядром GIMP действия, но при условии правильного использования ими функций отмены GIMP . Если код неправилен, дополнение потенциально может испортить историю отмен, так что не только действия дополнения, но и предыдущие действия более не смогут правильно отменяться. Все поставляемые с GIMP скрипты и дополнения достоверно работают правильно, однако очевидно, что нет гарантий для дополнение, полученных из других источников. Также, даже если код является правильным, отмена дополненияво время его работы иногда может оставить историю отмен повреждённой, поэтому лучше этого избегать, если вы случайно не сделали чего-то с плохими последствиями.

Команда «Отменить»

Чтобы отменить последнее действие используйте метод undo объекта document.

import FreeCAD FreeCAD.ActiveDocument.undo() 

При запуске FreeCAD в консольном режиме (CLI) механизм отмены/повтора по умолчанию выключен. Его нужно активировать для каждого документа следующим кодом:

import FreeCAD FreeCAD.ActiveDocument.UndoMode = 1 
  • Стандартное меню: Файл, Правка, Вид, Инструменты, Макросы, Окна, Справка
  • Структура: Std Part, Std Group, Std LinkMake
  • Файл: Создать, Открыть, Закрыть, Закрыть всё, Сохранить, Сохранить как, Сохранить копию, Сохранить всё, Вернуться, Импортировать, Экспортировать, Объединить проект, Информация о проекте, Печать, Предварительный просмотр, Экспортировать в PDF, Недавние файлы, Выход
  • Правка: Отменить, Вернуть, Вырезать, Копировать, Вставить, Дублировать выбранное, Обновить, Выделить область, Box element selection, Выбрать всё, Удалить, Расположение, Выравнивание, Редактировать/закончить редактирование, Настройки
  • Вид: Создать новый вид, Ортогональная проекция, Перспективная проекция, На весь экран, Стандартные виды (Уместить всё, Уместить выделенное, Isometric, Dimetric, Trimetric, Спереди, Сверху, Справа, Сзади, Снизу, Слева, Повернуть влево, Повернуть вправо), Freeze display(Save views, Load views, Freeze view, Clear views), Стиль представления(Как есть, Плоские линии, Shaded, Каркас, Точки, Скрытые линии, Без затенения), Bounding box, Стерео (Стерео красный/голубой, Четверная буферизация стерео, Стерео с чередованием строк, Стерео с чередованием столбцов, Выключить стерео, Выводить положения камеры), Масштаб (Увеличить, Уменьшить, Увеличить область), Окно документа(Закреплённое, Откреплённое, На весь экран), Показать/скрыть оси координат, Плоскость сечения, Текстурирование, Видимость (Видимость, Показать выделенные, Скрыть выделенные, Выбрать видимые объекты, Инвертировать все видимости, Показать все объекты, Скрыть все объекты, Откл/вкл выделяемость, Показывать замеры, Удалить замер), Навигация/редактирование, Внешний вид, Случайный цвет, Верстак, Панели инструментов (Файл, Верстак, Макрос, Вид, Структура, Навигация), Панели (Отчёт, Иерархия документа, Окно свойств, Просмотр выделения, Комбо панель, Консоль Python, DAG view), Tree view actions (Sync view, Sync selection, Sync placement, Pre-selection, Record selection, Single document, Multi document, Collapse/expand, Initiate dragging, Go to selection), Строка состояния
  • Инструменты: Редактор параметров, Сохранить изображение, Инспектор сцены, Граф зависимостей, Project utility, Измерить расстояние, Text document, Поворотный просмотр, Конвертор величин, Настройка, Addon manager
  • Макросы: Запись макроса, Остановить запись макроса, Макрос, Выполнить макрос, Отладка макросов, Остановить отладку, Шаг с обходом, Шаг с заходом, Установить/снять точку останова
  • Окна: Следующее, Предыдущее, Плиткой, Каскадом, Окна
  • Справка: Справка, Сайт FreeCAD, Пользовательская документация, Документация по созданию скриптов на Python, Автоматически сгенерированная документация Python, Форум FreeCAD, FreeCAD ЧаВо, О FreeCAD, Что это?
  • Начинающим
  • Установка:Загрузка, Windows, Linux, Mac, Дополнительных компонентов, Docker, AppImage, Ubuntu Snap
  • Базовая:О FreeCAD, Интерфейс, Навигация мыши, Методы выделения, Имя объекта, Настройки, Верстаки, Структура документа, Свойства, Помоги FreeCAD, Пожертвования
  • Помощь:Учебники, Видео учебники
  • Верстаки:Std Base, Arch, Draft, FEM, Inspection, Mesh, OpenSCAD, Part, PartDesign, Path, Points, Reverse Engineering, Robot, Sketcher, Spreadsheet, Start, Surface, TechDraw, Test Framework, Web
  • Addons:Менеджер дополнений, Внешние верстаки, Cкрипты и макросы
  • Hubs:Уголок пользователя, Уголок опытных пользователей, Уголок разработчиков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *