Операторы и выражения¶
Большинство предложений (логических строк) в программах содержат выражения. Простой пример выражения: 2 + 3 . Выражение можно разделить на операторы и операнды.
Операторы — это некий функционал, производящий какие-либо действия, который может быть представлен в виде символов, как например + , или специальных зарезервированных слов. Операторы могут производить некоторые действия над данными, и эти данные называются операндами. В нашем случае 2 и 3 — это операнды.
Операторы¶
Кратко рассмотрим операторы и их применение:
Обратите внимание, вычислить значения выражений, данных в примерах, можно также используя интерпретатор интерактивно. Например, для проверки выражения 2 + 3 воспользуйтесь интерактивной командной строкой интерпретатора Python:
>>> 2 + 3 5 >>> 3 * 5 15
Операторы и их применение
| Оператор | Название | Объяснение | Примеры |
|---|---|---|---|
| + | Сложение | Суммирует два объекта | 3 + 5 даст 8 ; ‘a’ + ‘b’ даст ‘ab’ |
| — | Вычитание | Даёт разность двух чисел; если первый операнд отсутствует, он считается равным нулю | -5.2 даст отрицательное число, а 50 — 24 даст 26 . |
| * | Умножение | Даёт произведение двух чисел или возвращает строку, повторённую заданное число раз. | 2 * 3 даст 6 . ‘la’ * 3 даст ‘lalala’ . |
| ** | Возведение | Возвращает число х , возведённое в степень y | 3 ** 4 даст 81 (т. е. 3 * 3 * 3 * 3 ) |
| / | Деление | Возвращает частное от деления x на y | 4 / 3 даст 1.3333333333333333 . |
| // | Целочисленное деление | Возвращает неполное частное от деления | 4 // 3 даст 1 . -4 // 3 даст -2 . |
| % | Деление по модулю | Возвращает остаток от деления | 8 % 3 даст 2 . -25.5 % 2.25 даст 1.5 . |
| Сдвиг влево | Сдвигает биты числа влево на заданное количество позиций. (Любое число в памяти компьютера представлено в виде битов — или двоичных чисел, т. е. 0 и 1 ) | 2 | |
| >> | Сдвиг вправо | Сдвигает биты числа вправо на заданное число позиций. | 11 >> 1 даст 5 . В двоичном виде 11 представляется как 1011 , что будучи смещённым на 1 бит вправо, даёт 101 , а это, в свою очередь, не что иное как десятичное 5 |
| & | Побитовое И | Побитовая операция И над числами | 5 & 3 даёт 1 . |
| | | Побитовое ИЛИ | Побитовая операция ИЛИ над числами | 5 | 3 даёт 7 |
| ^ | Побитовое ИСКЛЮЧИТЕЛЬНО ИЛИ | Побитовая операция ИСКЛЮЧИТЕЛЬНО ИЛИ | 5 ^ 3 даёт 6 |
| ~ | Побитовое НЕ | Побитовая операция НЕ для числа x соответствует -(x+1) | ~5 даёт -6 . |
| Меньше | Определяет, верно ли, что x меньше y . Все операторы сравнения возвращают True или False 1 . Обратите внимание на заглавные буквы в этих словах. | 5 < 3 даст False , а 3 < 5 даст True . Можно составлять произвольные цепочки сравнений: 3 < 5 < 7 даёт True . | |
| > | Больше | Определяет, верно ли, что x больше y | 5 > 3 даёт True . Если оба операнда — числа, то перед сравнением они оба преобразуются к одинаковому типу. В противном случае всегда возвращается False . |
| Меньше или равно | Определяет, верно ли, что x меньше или равно y | x = 3; y = 6; x | |
| >= | Больше или равно | Определяет, верно ли, что x больше или равно y | x = 4; y = 3; x >= 3 даёт True . |
| == | Равно | Проверяет, одинаковы ли объекты | x = 2; y = 2; x == y даёт True . x = ‘str’; y = ‘stR’; x == y даёт False . x = ‘str’; y = ‘str’; x == y даёт True . |
| != | Не равно | Проверяет, верно ли, что объекты не равны | x = 2; y = 3; x != y даёт True . |
| not | Логическое НЕ | Если x равно True , оператор вернёт False . Если же x равно False , получим True . | x = True; not x даёт False . |
| and | Логическое И | x and y даёт False , если x равно False , в противном случае возвращает значение y | x = False; y = True; x and y возвращает False , поскольку x равно False . В этом случае Python не станет проверять значение y , так как уже знает, что левая часть выражения ‘and’ равняется False , что подразумевает, что и всё выражение в целом будет равно False , независимо от значений всех остальных операндов. Это называется укороченной оценкой булевых (логических) выражений. |
| or | Логическое ИЛИ | Если x равно True , в результате получим True , в противном случае получим значение y | x = True; y = False; x or y даёт True . Здесь также может производиться укороченная оценка выражений. |
Краткая запись математических операций и присваивания¶
Зачастую результат проведения некой математической операции необходимо присвоить переменной, над которой эта операция производилась. Для этого существуют краткие формы записи выражений:
Вы можете записать:
a = 2; a = a * 3
a = 2; a *= 3
Обратите внимание, что выражения вида » переменная = переменная операция выражение » принимает вид » переменная операция = выражение «.
Порядок вычисления¶
Если имеется выражение вида 2 + 3 * 4 , что производится раньше: сложение или умножение? Школьный курс математики говорит нам, что умножение должно производиться в первую очередь. Это означает, что оператор умножения имеет более высокий приоритет, чем оператор сложения.
Следующая таблица показывает приоритет операторов в Python, начиная с самого низкого (самое слабое связывание) и до самого высокого (самое сильное связывание). Это означает, что в любом выражении Python сперва вычисляет операторы и выражения, расположенные внизу таблицы, а затем операторы выше по таблице.
Эта таблица взята из Справочника по языку Python (англ.) и приводится здесь для полноты описания. На практике лучше использовать скобки для группировки операторов и операндов, чтобы в явном виде указать порядок вычисления выражений. Заодно это облегчит чтение программы. Более подробно см. в разделе Изменение порядка вычисления ниже.
Приоритет операторов
| Оператор | Описание |
|---|---|
| lambda | лямбда-выражение |
| or | Логическое «ИЛИ» |
| and | Логическое «И» |
| not x | Логическое «НЕ» |
| in , not in | Проверка принадлежности |
| is , is not | Проверка тождественности |
| < , , >= , != , == | Сравнения |
| | | Побитовое «ИЛИ» |
| ^ | Побитовое «ИСКЛЮЧИТЕЛЬНО ИЛИ» |
| & | Побитовое «И» |
| > | Сдвиги |
| + , — | Сложение и вычитание |
| * , / , // , % | Умножение, деление, целочисленное деление и остаток от деления |
| +x , -x | Положительное, отрицательное |
| ~x | Побитовое НЕ |
| ** | Возведение в степень |
| x.attribute | Ссылка на атрибут |
| x[индекс] | Обращение по индексу |
| x[индекс1:индекс2] | Вырезка |
| f(аргументы . ) | Вызов функции |
| (выражения, . ) | Связка или кортеж 2 |
| [выражения, . ] | Список |
| Словарь |
Операторы, о которых мы не упомянули, будут объяснены в дальнейших главах.
В этой таблице операторы с равным приоритетом расположены в одной строке. Например, + и — имеют равный приоритет.
Изменение порядка вычисления¶
Для облегчения чтения выражений можно использовать скобки. Например, 2 + (3 * 4) определённо легче понять, чем 2 + 3 * 4 , которое требует знания приоритета операторов. Как и всё остальное, скобки нужно использовать разумно (не перестарайтесь) и избегать излишних, как в (2 + (3 * 4)) .
Есть ещё одно преимущество в использовании скобок — они дают возможность изменить порядок вычисления выражений. Например, если сложение необходимо произвести прежде умножения, можно записать нечто вроде (2 + 3) * 4 .
Ассоциативность¶
Операторы обычно обрабатываются слева направо. Это означает, что операторы с равным приоритетом будут обработаны по порядку от левого до правого. Например, 2 + 3 + 4 обрабатывается как (2 + 3) + 4 .
Выражения¶
Пример (сохраните как expression.py ):
length = 5 breadth = 2 area = length * breadth print('Площадь равна', area) print('Периметр равен', 2 * (length + breadth))
Вывод:
$ python expression.py Площадь равна 10 Периметр равен 14
Как это работает:
Длина и ширина прямоугольника хранятся в переменных length и breadth соответственно. Мы используем их для вычисления периметра и площади прямоугольника при помощи выражений. Результат выражения length * breadth сохраняется в переменной area , после чего выводится на экран функцией print . Во втором случае мы напрямую подставляем значение выражения 2 * (length + breadth) в функцию print .
Также обратите внимание, как Python «красиво печатает» результат. Несмотря на то, что мы не указали пробела между ‘Площадь равна’ и переменной area , Python подставляет его за нас, чтобы получить красивый и понятный вывод. Программа же остаётся при этом легкочитаемой (поскольку нам не нужно заботиться о пробелах между строками, которые мы выводим). Это пример того, как Python облегчает жизнь программисту.
Резюме¶
Мы увидели, как пользоваться операторами, операндами и выражениями. Это основные строительные блоки любой программы. Далее мы увидим, как это применить на практике.
- «True» — англ. «Верно (Правда)»; «False» — англ. «Ошибочно (Ложь)». (прим. перев.) ↩
- «tuple» — англ. «кортеж» (прим. перев.) ↩
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
Ввод значений с клавиатуры – не единственный способ редактирования значений в таблице. В некоторых случаях вам может потребоваться выполнить математические вычисления для получения значения поля отдельной записи или даже всех записей. Можно выполнять как простые, так и сложные вычисления над всеми либо только выбранными записями. Кроме того, в полях атрибутивных таблиц можно вычислить длину, периметр и прочие геометрические свойства. В разделах ниже приводятся примеры использования калькулятора поля. Вычисления выполняются с помощью Python , SQL и Arcade .
Этот раздел описывает примеры скриптов Python для Вычисления поля . Более подробно о выражениях Arcade , см. Руководство ArcGIS Arcade . Более подробно о выражениях SQL см. в разделе Вычислить значения полей.
Примечание:
- Синтаксис Python требует правильного использования отступов. Для определения каждого логического уровня используются от двух до четырех пробелов. Приводите в соответствие начало и конец каждого блока, и будьте последовательны.
- Поля в выражениях вычислений Python заключаются в восклицательные знаки ( !! ).
- При наименовании переменных следует помнить, что Python чувствителен к регистру, поэтому имя value не равнозначно имени Value .
- Завершив ввод, можно нажать кнопку Экспортировать , если вы хотите записать введенные данные в файл. С помощью кнопки Импортировать вы сможете найти и выбрать из имеющихся файл с выражением для вычисления.
Простые вычисления
Ряд вычислений можно производить, используя только короткое выражение.
Примеры простых строчек
Строки поддерживаются несколькими строковыми функциями Python , в том числе capitalize , rstrip и replace .
Сделать заглавной первую букву текста в поле CITY_NAME .
!CITY_NAME!.capitalize()
Убрать все пробелы на концах строк в поле CITY_NAME .
!CITY_NAME!.rstrip()
Заменить написание «california» на «California» в поле STATE_NAME .
!STATE_NAME!.replace("california", "California")
Доступ к символам в текстовом поле осуществляется путем индексации и разделения в Python . Индексация возвращает символы в индексном местоположении; разделение – группу символов. В следующей таблице предположим, что это строковое поле !fieldname! со значением «abcde» .
Второй символ с конца
Второй, третий и четвертый символы
Python также поддерживает форматирование строк с использованием метода format() .
Скомбинировать поля FieldA и FieldB, разделенные двоеточием.
"<>:<>".format(!FieldA!, !FieldB!)
Простые математические примеры
Python предоставляет инструменты для обработки чисел. Python также поддерживает ряд числовых и математических функций, в том числе, math , cmath , decimal , random , itertools , functools и operator .
x умножить на y
x разделить на y
x разделить на y (с округлением)
отрицательное выражение от x
x остается без изменений
x возвести в степень y
!Rank! * 2
Вычислить объем сферы по заданному полю с радиусами.
4.0 / 3.0 * math.pi * !Radius! ** 3
Прежние версии:
В ArcGIS Pro используется Python 3, а в ArcGIS Desktop – Python 2. В Python 2 используются математические целые числа, то есть деление двух целочисленных значений всегда дает в результате целочисленное значение ( 3 / 2 = 1 ). В Python 3 при делении целочисленных значений результат будет числом с плавающей точкой ( 3 / 2 = 1.5 ).
Встроенные функции Python
Python содержит ряд встроенных функций, включая max , min , round и sum .
Вычисление максимального значения для каждой записи в списке полей.
max([!field1!, !field2!, !field3!])
Вычисление суммы для каждой записи в списке полей.
sum([!field1!, !field2!, !field3!])
Использование блоков кода
С помощью выражений Python и параметра Блок кода вы можете сделать следующее:
- Используйте в выражении любые функции Python .
- Получать доступ к функциям и объектам геообработки.
- Получать доступ к свойствам геометрии
- Получать доступ к новому оператору случайных значений.
- Переклассифицировать значения с использованием логики if-then-else.
Поддерживает функциональные возможности Python . Блок кода задается с помощью функций Python ( def ). Свойства геометрии выражаются с помощью объектов геообработки, например объекты point, где применимо.
Поддерживает функциональные возможности Arcade .
Поддерживает выражения SQL.
SQL-выражения были реализованы для лучшей поддержки вычислений с использованием сервисов объектов и многопользовательских баз геоданных, особенно в отношении производительности. Вместо того, чтобы выполнять вычисления для одного объекта или строки одновременно, один запрос отправляется к базе данных или сервису объектов.
Прежние версии:
В ArcGIS Desktop инструмент Вычислить поле поддерживает типы выражений VB , PYTHON и PYTHON_9.3 . Тип выражения VB , поддерживаемый в некоторых продуктах, не поддерживается в 64-битных продуктах, и в том числе в ArcGIS Pro .
Ключевые слова PYTHON и PYTHON_9.3 все еще поддерживаются в ArcGIS Pro для сохранения обратной совместимости, но не указываются в списке выбора. Скрипты Python , использующие ключевые слова, продолжат работать корректно.
Единственное различие между типом выражения Python 3 и устаревшим ключевым словом PYTHON_9.3 заключается в том, что Python 3 возвращает значения в полях данных как объекты Python datetime .
Примечание:
Тип выражения Python 3 не связан с версией Python , установленной с ArcGIS Pro . Это просто исторически связанное с Python стороннее ключевое слово (после PYTHON и PYTHON_9.3 ).
Функции Python задаются с помощью ключевого слова def , за которым идет имя функции и ее входные аргументы. Можно написать функцию Python , которая будет принимать любое число входных аргументов (в т.ч. и отсутствие аргументов). Значение возвращается из функции с помощью выражения return . Имя функции остаётся на ваш выбор (не используйте пробелы и не начинайте с цифр).
Примечание:
Если функция с выражением return не возвращает значения, будет возвращено None .
Примечание:
Синтаксис Python требует правильного использования отступов. Для определения каждого логического уровня используются четыре пробела. Приводите в соответствие начало и конец каждого блока, и будьте последовательны.
Примеры кода – math
Для использования всех приведенных ниже математических примеров используйте тип выражения Python 3 .
Округлить значения поля до двух десятичных знаков.
Expression: round(!area!, 2)
Используйте модуль math для конвертации метров в футы. Конвертация возводит в степень 2 и умножает на площадь.
Expression: MetersToFeet((float(!shape.area!))) Code Block: import math def MetersToFeet(area): return math.pow(3.2808, 2) * area
Вычисления полей с использованием логики Python
Логические структуры могут быть включены в блок кода через выражения if , else и elif .
Классифицировать на основании значений поля.
Expression: Reclass(!WELL_YIELD!) Code Block: def Reclass(WellYield): if (WellYield >= 0 and WellYield 10 and WellYield 20 and WellYield 30): return 4
Примеры кода – геометрия
Помимо следующих примеров кода см. раздел Преобразование геометрических единиц, расположенный ниже, для получения дополнительной информации о преобразовании геометрических единиц.
Вычислить площадь объекта.
Expression: !shape.area!
Вычислить максимальную x-координату объекта.
Expression: !shape.extent.XMax!
Вычислить количество вершин объекта.
Expression: getVertexCount(!shape!) Code Block: def getVertexCount(feat): partnum = 0 # Count the number of points in the current multipart feature partcount = feat.partCount pntcount = 0 # Enter while loop for each part in the feature (if a singlepart # feature, this will occur only once) while partnum < partcount: part = feat.getPart(partnum) pnt = part.next() # Enter while loop for each vertex while pnt: pntcount += 1 pnt = part.next() # If pnt is null, either the part is finished or there # is an interior ring if not pnt: pnt = part.next() partnum += 1 return pntcount
Для точечного класса пространственных объектов сдвинуть x-координату каждой точки на 100.
Expression: shiftXCoordinate(!SHAPE!) Code Block: def shiftXCoordinate(shape): shiftValue = 100 point = shape.getPart(0) point.X += shiftValue return point
Информация о единицах измерения геометрии
Свойства площади и длины в поле геометрии можно изменить с помощью типов единиц, обозначаемых знаком @ .
Примечание:
Если данные хранятся в географической системе координат и поддерживаются линейные единицы (например, футы), вычисления длин будут конвертированы по геодезическому алгоритму.
Внимание:
Преобразование единиц площади в географическую систему координат даёт сомнительные результаты, так как десятичные градусы в разных частях глобуса имеют разную длину.
Вычислить длину пространственного объекта в ярдах.
Expression: !shape.length@yards!
Вычислить длину пространственного объекта в акрах.
Expression: !shape.area@acres!
Геодезическая площадь и длина также может быть вычислена с помощью свойств geodesicArea и geodesicLength , с помощью символа @ , следующего за ключевым словом единицы измерения.
Вычисление геодезической длины пространственного объекта в ярдах.
Expression: !shape.geodesicLength@yards!
Вычисление геодезической площади пространственного объекта в акрах.
Expression: !shape.geodesicArea@acres!
Примеры кода – даты
Дату и время можно вычислить с помощью модулей datetime и time .
Вычислить текущую дату.
Expression: time.strftime("%d/%m/%Y")
Вычислить текущие дату и время.
Expression: datetime.datetime.now()
Вычислить дату как 31 декабря 2000.
Expression: datetime.datetime(2000, 12, 31)
Вычислить количество дней между текущей датой и значением в поле.
Expression: (datetime.datetime.now() - !field1!).days
Вычислить дату, прибавив 100 дней к значению даты в поле.
Expression: !field1! + datetime.timedelta(days=100)
Вычислить строку, представляющую дату, используя метод ctime в модуле datetime . В примере создается строка в формате: 'Mon Feb 22 10:15:00 2021' .
Expression: !field1!.ctime()
Вычислить день недели (например, воскресенье) для значения даты в поле.
Expression: !field1!.strftime('%A')
Вычислить отформатированную строку из поля даты, используя метод strftime модуля datetime и строку явного формата. В примере создается строка в формате: '02/22/2021, 10:15:00' .
Expression: !field1!.strftime("%m/%d/%Y, %H:%M:%S")
Примеры кода – текст
Строковые вычисления могут выполняться с использованием различных шаблонов кодирования Python .
Вернуть три самых правых символа.
Expression: !SUB_REGION![-3:]
Заменить все вхождения заглавной буквы P на прописную p.
Expression: !STATE_NAME!.replace("P","p")
Конкатенировать два поля, разделив их пробелом.
Expression: !SUB_REGION! + " " + !STATE_ABBR!
Конвертация в нужный регистр
В этих примерах показаны различные способы конвертации слов таким образом, чтобы каждое слово начиналось с большой буквы, а остальные буквы были прописными.
Expression: ' '.join([i.capitalize() for i in !STATE_NAME!.split(' ')])
Expression: !STATE_NAME!.title()
Регулярные выражения
Модуль Python re содержит операции сопоставления регулярных выражений, которые используются для сопоставления сложных примеров и правил замещения для строк.
- re – операции регулярных выражений
- Регулярные выражения
Замена St или St. перед новым словом в конце строки словом Street.
Expression: update_street(!ADDRESS!) Code Block: import re def update_street(street_name): return re.sub(r"""\b(St|St.)\Z""", 'Street', street_name)
Накопительные и последовательные вычисления
Накопительные и последовательные вычисления могут выполняться с использованием глобальных переменных.
Вычислить последовательные идентификаторы ID или порядковые номера на основании интервала.
Expression: autoIncrement(10, 5) Code Block: rec = 0 def autoIncrement(start=1, interval=1): global rec if rec == 0: rec = start else: rec += interval return rec
Вычислить накопительные значения числового поля.
Expression: accumulate(!FieldA!) Code Block: total = 0 def accumulate(increment): global total if total: total += increment else: total = increment return total
Вычислить процентное приращение числового поля.
Expression: percentIncrease(float(!FieldA!)) Code Block: lastValue = 0 def percentIncrease(newValue): global lastValue if lastValue: percentage = ((newValue - lastValue) / lastValue) * 100 else: percentage = 0 lastValue = newValue return percentage
Случайные значения
Случайные значения можно получить с помощью модуля random .
Используйте пакет numpy для вычисления случайных значений с плавающей точкой от 0.0 до 1.0.
Expression: getRandomValue() Code Block: import numpy def getRandomValue(): return numpy.random.random()
Используйте модуль random случайных чисел для вычисления случайных целочисленных значений от 0 до 10.
Expression: random.randint(0, 10) Code Block: import random
Вычисление значений null
В выражении Python пустые значения (null) можно вычислить, используя Python None .
Примечание:
Следующее вычисление будет работать, только если поле может содержать нулевые значения.
Используйте Python None для вычисления пустых значений.
Expression: None
Связанные разделы
Логические выражения и операторы в Python 3
Сравнение значений Python и для чего это нужно
Когда мы хотим проверить, зарегистрирован ли пользователь на сайте, мы запрашиваем у него логин и пароль. Если логин существует в базе данных и введённый пароль совпадает с паролем в базе, то мы авторизуем пользователя. Иначе продолжаем запрашивать у пользователя логин и пароль.В примерах ниже мы сравним значения одного типа друг с другом на языке программирования Python.
Вот как реализовано сравнение двух строк в Python :
print(10 == 5) #False
print('abc' == 'abc') #True
Пример с проверкой пароля:
correct_password = 'qwerty'
asked_password = input('Введите пароль: ')
if (correct_password == asked_password):
print('Вы авторизованы')
else:
print('Пароль неверный')
Введите пароль: 123
Пароль неверный
Введите пароль: qwerty
Вы авторизованы
Логическое сравнение или его результат используется в конструкциях if-else и циклах while .
Логические выражения
Логическое выражение в самом простом смысле - это математическое сравнение. В Python вопрос " Что больше: 3 или 5? " будет записан в следующем виде: 3 > 5 и звучать как: “Три больше пяти. Правда? - Нет.”
print(3 > 5) #False
Или такой вариант: 4 != 0 ( 4 не равно 0. Правда?)
print(4 != 0) #True
Как записываются операторы сравнения в Python:
a = 5
b = 10
print(a == b) #False
print(a > b) #False
print(a >= b) #False
print(a < b) #True
print(a print(a != b) #True
Результат такого сравнения можно сохранить в переменную, как и любое другое значение:
a = 5
b = 10
expr = a > b
print(expr) #False
Можно сравнивать сразу несколько значений подряд:
a = 4
expr = 0 a 10
print(expr) #True
a = 15
expr = 0 a 10
print(expr) #False
В итоге в первом значении мы получили True, а во втором Python выдал False.
Сравнение строк
Помимо чисел, в Python можно сравнивать друг с другом строки , списки и другие типы данных.
Вот, например, как выглядит сравнение двух строк в Python:
s1 = 'python'
s2 = 'python'
s3 = 'Python' # Поменяем одну букву на заглавную
print(s1 == s2) #True
print(s1 == s3) #False
Во втором случае результатом оказалась ложь, т.к. сравнение чувствительно к регистру символов.
Также строки можно проверять между собой на большинство/меньшинство.
print('abc' > 'abc') #False
print('abc' > 'aaa') #True
print('abc' > 'x') #False
- В первом случае всё просто - строки равны.
- Во втором: происходит посимвольное сравнение строк. Первые два символа равны, сравниваются следующие.
'b' > 'a' истинно, т.к. символ 'b' стоит в алфавите по порядку после 'a' . Поэтому всё выражение истинно. Чтобы проще было понять, можно вместо букв поставить их порядковые номера в алфавите: 123 > 111 - Посимвольное сравнение не зависит от длины строк, поэтому в третьем случае выражение ложно: 'a' > 'x'
print('a' > 'x') #False
Такое сравнение называется лексикографическим: wikipedia.
Сравнение других типов значений
Сравнение списков аналогично сравнению строк. Например, когда условие в Python не равно. Каждый элемент списка по очереди сравнивается с другим.
print([1, 2, 3] > [1, 2, 3]) #False
print([1, 2, 3] > [1, 1, 1]) #True
print([1, 2, 3] > [25]) #False
Значения разных типов можно также сравнивать между собой:
expr1 = '1' == 1
expr2 = '' == 0
print(expr1) #False
print(expr2) #False
Результат ложный, т.к. типы данных не равны. (Строка и число).
Проверка на большинство/меньшинство разных типов выдаст ошибку:
print('a' > 1)
TypeError: '>' not supported between instances of 'str' and 'int'
print((1, 1, 1) [1, 2, 3])
TypeError: '
Преобразование значений в тип bool
Значения False или True можно получить непосредственно из самих значений, без операции сравнения. Например, строка 'a' будет True , а 0 - False . Для этого нужно вызвать функцию bool() и передать ей параметр, который мы хотим преобразовать:
var1 = bool('a')
var2 = bool(0)
print(var1) #True
print(var2) #False
А вот пустая строка или список будут равны False :
var1 = bool('')
var2 = bool([])
print(var1) #False
print(var2) #False
Логика простая - если размер списка или строки равен нулю, то переменная bool в Python будет равна False .
0 - это так же False.
Все остальные значения, отличные от 0 или с длиной больше 0 будут True.
Как правило, булевые операции в Python нужны, когда проверяется наличие какой-либо информации в переменной, например, заполнил ли пользователь необходимые поля в форме регистрации или оставил их пустыми.
Упрощённая версия такой проверки:
user_name = input('Введите Ваше имя: ')
if user_name:
print(f'Добро пожаловать, !')
else:
print('Это обязательное поле')
Введите Ваше имя:
Это обязательное поле
Введите Ваше имя: Иван
Добро пожаловать, Иван!
Логические операторы
Если мы хотим проверить на истинность сразу несколько логических выражений или значений, то нам нужно использовать в Python 3 логические операторы .
Например ввел ли пользователь своё имя и больше ли 12 лет его возраст:
name = 'Иван'
age = 10
expr = name and age > 12
print(expr) #False
Мы использовали логический оператор and . Он возвращает истинное значение, только тогда, когда по обе стороны от него находятся истинные значения.
Есть ещё or и not .
- or - Возвращает истинное значение, когда хотя бы с одной стороны от него находится истинное значение.
- not - Меняет значение на противоположное.
Все они работают с булевыми эквивалентами значений. Т.е. сначала преобразуют их в тип bool , а затем производят вычисления.
print(True and False) # False
print(True or False) # True
print(not True) # False
print(not False) # True
Логические операции можно комбинировать между собой в одном выражении:
expr = not True and False
print(expr) #False
Вычисления происходят по порядку. Чтобы изменить его, надо использовать скобки, как в математике.
expr = not (True and False)
print(expr) #True
Значение поменялось на истинное, т.к. сначала считается выражение внутри скобок ( False ), а затем происходит его инверсия. В Python есть одна особенность при использовании операторов and и or . Они не обязательно возвращают только True b False . Они возвращают непосредственно само значение, на котором остановились вычисления.
Посмотрим на примере:
name1 = 'Иван'
age = 0
name2 = 'Василий'
print(name1 and age and name2) #0
print(name1 or age or name2) #Иван
- В первом случае вернулся 0 , потому что расчёты остановились на переменной age . Так как все операторы являются and , то если одно из значений ложно, то и всё выражение будет ложно, следовательно, дальше считать нет смысла.
- Во втором случае обратная ситуация. Все операторы являются or , поэтому вычисления останавливаются на первом истинном значении. Собственно, оно нам и вернулось - значение переменной name1.
Другие виды логических операторов
Существуют также другие логические операции, которые используются реже и в специфических ситуациях.
Например, есть логические побитовые операции , которые применяются в шифровании данных.
Одна из таких - XOR : исключающее ИЛИ. В Python этой операции соответствует символ ^ .
Пример шифрования числа. Вместо чисел могут быть любые бинарные данные.
phrase = 2022
key = 101
# Шифрование используя ключ
encrypt = phrase ^ key
print(encrypt)
# Расшифровка сообщения используя ключ
decrypt = encrypt ^ key
print(decrypt)
1923
2022
Список всех побитовых операторов в Python:
| Операция | Значение |
| a & b | Побитовое И для a и b |
| a | b | Побитовое ИЛИ для a и b |
| a ^ b | Исключающее ИЛИ для a и b |
| ~a | Инверсия битов для a |
| a | Побитовый сдвиг влево для a на b |
| a >> b | Побитовый сдвиг вправо для a на b |
Однако не все логические операции присутствуют в питоне. Например, в питоне нет логической операции импликация .
Заключение
Мы рассмотрели логические выражения и операторы в Python 3. Больше о работе с python читайте в блоге timeweb.cloud .
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
