Инструкция if-elif-else, проверка истинности, трехместное выражение if/else

Условная инструкция if-elif-else (её ещё иногда называют оператором ветвления) — основной инструмент выбора в Python. Проще говоря, она выбирает, какое действие следует выполнить, в зависимости от значения переменных в момент проверки условия.
Синтаксис инструкции if
Сначала записывается часть if с условным выражением, далее могут следовать одна или более необязательных частей elif, и, наконец, необязательная часть else. Общая форма записи условной инструкции if выглядит следующим образом:
Простой пример (напечатает 'true', так как 1 - истина):
Чуть более сложный пример (его результат будет зависеть от того, что ввёл пользователь):
Конструкция с несколькими elif может также служить отличной заменой конструкции switch - case в других языках программирования.
Проверка истинности в Python
- Любое число, не равное 0, или непустой объект — истина.
- Числа, равные 0, пустые объекты и значение None — ложь
- Операции сравнения применяются к структурам данных рекурсивно
- Операции сравнения возвращают True или False
- Логические операторы and и or возвращают истинный или ложный объект-операнд
Истина, если оба значения X и Y истинны.
Истина, если хотя бы одно из значений X или Y истинно.
Истина, если X ложно.
Трехместное выражение if/else
довольно короткая, но, тем не менее, занимает целых 4 строки. Специально для таких случаев и было придумано выражение if/else:
В данной инструкции интерпретатор выполнит выражение Y, если X истинно, в противном случае выполнится выражение Z.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
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 . Это задание можно сделать разными способами.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Определения
- Срезы для строк — механизм, с помощью которого извлекается подстрока по указанным параметрам.
for in else
Составная инструкция for in else для прохода (итерирования) по элементам последовательностей (таких как строки, списки, кортежи), либо других типов, поддерживающих итерирование.
for el in [1, 2, 3]:
print(el)
else:
print('всё')
# 1 2 3 всё
Часть, идущая после in , будучи вычисленной единожды, должна предоставить объект, поддерживающий итерирование. Для данного объекта создаётся итератор. Далее переменной, предшествующей in , поочерёдно присваиваются значения [элементов], предоставляемые итератором и для каждого из них выполняется тело инструкции.
Если тело цикла несложное, то накладные расходы на поддержание цикла интерпретатором могут оказаться существенными. В подобных случаях рекомендуется использовать генератор, составление списка, либо функцию map().
# Проход по элементам словаря.
my_dict =
for item in my_dict.items():
print(item)
# item - кортеж из двух элементов
# ('a', 1)
# ('b', 2)
# Распаковка кортежа item в две переменных key и value:
for key, value in my_dict.items():
print('%s -> %s' % (key, value))
# a -> 1
# b -> 2
else
Когда элементы исчерпаны (например, исчерпана последовательность, либо итератор возбудил исключение StopIteration) выполняется часть инструкции, идущая после else (если эта часть присутствует) и цикл завершается.
break
Инструкция break позволяет прервать цикл. При этом часть после else не будет выполнена.
for el in [1, 2, 3]:
print(el)
if el == 2:
break
else:
print('этот текст не будет выведен')
# 1 2
continue
Инструкция continue позволяет «проскочить» исполнение следующего после неё кода и продолжить проход по следующим элементам.
for el in [1, 2, 3]:
if el == 2:
continue
print(el)
else:
print('всё')
# 1 3 всё
На заметку
Переменной, предшествующей in , на каждом из этапов цикла присваивается новое значение. Это означает, что любые назначения данной переменной, будь то произведённые до начала цикла или внутри него, будут потеряны в ходе последующего витка.
По завершению цикла переменная, предшествующая in , остаётся доступной с последним.
for el in [1, 2, 3]:
pass
print(el) # 3
Однако, если последовательность пуста, то переменная не будет инициализирована вовсе, а значит попытка обратиться к ней возбудит исключение NameError.
for el in []:
pass
print(el) # NameError
Изменение последовательности в ходе итерирования может приводить к ошибкам и пропускам элементов.
my_list = [1, 3, 4]
for el in my_list:
if el == 1:
del my_list[0]
print(el) # 1 4
for el in my_list:
if el == 1:
my_list.insert(0, 2)
print(el) # 1 1 1 1 1 . бесконечная рекурсия
При итерировании используется внутренний счётчик, значение которого увеличивается с каждым витком; когда значение становится равным длине последовательности цикл останавливается. Поэтому, если удалить из последовательности текущий (или предыдущий) элемент, то последущий будет пропущен (ведь он будет иметь индекс, который уже был «просмотрен»). Проблемы могут возникнуть и при добавлении элементов. Иногда от подобных от них можно избавиться с помочью итерирования по копии последовательности, с изменением оригинала.
Сокрытые драгоценности Python
В последнее время у меня появилось новое хобби – чтение документации Python просто для удовольствия! Когда вы читаете на досуге, то, как правило, замечаете интересные «лакомые кусочки», которые в противном случае пропустили бы. Итак, вот перечень «кусочков», которые заставили меня сказать:
О! Вы можете сделать это на Python?
1. Атрибуты функций
Подобно тому, как вы можете устанавливать атрибуты классов и объектов, вы также можете устанавливать атрибуты функций.
def func(x): intermediate_var = x**2 + x + 1 if intermediate_var % 2: y = intermediate_var ** 3 else: y = intermediate_var **3 + 1 # setting attributes here func.optional_return = intermediate_var func.is_awesome = 'Yes, my function is awesome.' return y y = func(3) print('Final answer is', y) # Accessing function attributes print('Show calculations -->', func.optional_return) print('Is my function awesome? -->', func.is_awesome)
Мы установили атрибуты «optional_return» в строке 10 и «is_awesome» в строке 11. Мы получили доступ к этим атрибутам вне функции позднее в строках 19 и 20. Результат кода:
Final answer is 2197
Show calculations --> 13
Is my function awesome? --> Yes, my function is awesome.
Это удобно, когда вы хотите, чтобы функция извлекала некую промежуточную переменную, но не возвращала её явно с оператором return каждый раз при вызове функции. Также обратите внимание, что атрибуты могут быть установлены как внутри определения функции, так и вне определения функции.
2. Цикл for-else
В Python вы можете добавить условие else в цикл for. Условие else будет срабатывать только в том случае, если во время выполнения в теле цикла не встретится оператор break.
my_list = ['some', 'list', 'containing', 'five', 'elements'] min_len = 3 for element in my_list: if len(element) < min_len: print(f'Caught an element shorter than letters') break else: print(f'All elements at least letters long')
All elements at least 3 letters long
Обратите внимание, что else имеет отступ на уровне for, а не на уровне if. Здесь ни один элемент не имеет длины короче трёх. Таким образом, никогда не будет встречен оператор break. Следовательно, условие else будет запущено (после выполнения цикла for) и выведется результат, указанный выше.
Можно утверждать, что этого можно достичь с помощью отдельной переменной, которая отслеживает встретился ли оператор break. И, возможно, для другого человека, читающего код, это будет также менее запутанно. Далее приведен эквивалентный путь достижения того же результата:
my_list = ['some', 'list', 'containing', 'five', 'elements'] min_len = 3 no_break = True for element in my_list: if len(element) < min_len: print(f'Caught an element shorter than letters') no_break = False break if no_break: print(f'All elements at least letters long')
Думаю, это полезно знать.
3. Разделители для int
Трудно визуально различить целые числа подобные 10000000 и 100000000 (они даже разные числа?). Мы не можем использовать запятые здесь, в Python, подобному тому, как мы используем их в английском языке, потому что Python интерпретирует это как кортеж из нескольких целых чисел.
У Python есть очень удобный способ справиться с этим: мы можем использовать подчеркивание как разделитель для улучшения читабельности. Таким образом, 1_000_000 будет интерпретироваться как целое число.
a = 3250 b = 67_543_423_778 print(type(a)) print(type(b)) print(type(a)==type(b))
4. eval () и exec ()
В Python есть возможность динамически считывать строку и обрабатывать её как часть Python кода. Это достигается использованием функций eval() и exec() (‘eval’ для вычисления выражений; и ‘exec’ для выполнения операторов).
a = 3 b = eval('a + 2') print('b =', b) exec('c = a ** 2') print('c is', c)
В третьей строке функция eval() считывает входную строку как выражение Python, оценивает её и присваивает результат переменной b. В строке 6 функция exec() считывает входную строку как оператор Python и исполняет её.
Вы даже можете динамически передать созданные строки этим функциям. Например, вы можете создать 1000 переменных с именами х_0, х_1, . х_999 без записи каждого объявления этих переменных вручную в коде. Может показаться, что это совершенно бессмысленно, но это не так.
В целом, в более широком контексте программирования (не только в отношении Python) использование eval/exec невероятно сильно, поскольку позволяет вам писать динамический код, который использует информацию, доступную во время выполнения, для решения проблем, которые не могут быть даже выражены во время компиляции. […] exec – это буквально интерпретатор Python, встроенный в Python, поэтому, если у вас есть особенно сложная проблема для разрешения, один из способов её решить – написать программу для *написания программы для её решения*, затем использовать exec для запуска этой второй программы.
Вы можете прочитать об этом в замечательном объяснении Стивена Д’Апрано.
5. Многоточие (Ellipsis)
Многоточие (или «…») - это встроенная константа Python, аналогичная таким встроенным константам как None, True, False и т.д. Её можно использовать по-разному, например, следующими способами (но, разумеется, не ограничиваясь ими):
5.1. Замена для ненаписанного кода
Подобно pass, константы можно использовать в качестве замены, когда код не полностью написан, но требует некоторого заполнения для синтаксической правильности.
def some_function(): . def another_function(): pass
5.2. Альтернатива NONE
None выбирают, когда хотят обозначить пустой ввод или возврат. Но иногда None может быть одним из ожидаемых входных или возвращаемых параметров функций. В этом случае Многоточие может служить заменой.
# calculate nth odd number def nth_odd(n): if isinstance(n, int): return 2 * n - 1 else: return None # calculate the original n of nth odd number def original_num(m=. ): if m is . print('This function needs some input') elif m is None: print('Non integer input provided to nth_odd() function') elif isinstance(m, int): if m % 2: print(f' is th odd number') else: print(f' is not an odd number') original_num() a = nth_odd(n='some string') original_num(a) b = nth_odd(5) original_num(b) original_num(16)
Функция nth_odd() вычисляет n-ое нечетное число, c учетом n. Функция original_num() вычисляет исходное число n, учитывая n-ое нечетное число. Здесь None – один из ожидаемых входных параметров функции original_num(), так что мы не можем использовать его как замену по умолчанию для аргумента m. Результат кода:
This function needs some input
Non integer input provided to nth_odd() function
9 is 5th odd number
16 is not an odd number
5.3. Нарезка массива в NumPy
NumPy использует многоточие для нарезки массива. Следующий код показывают два эквивалентных способа нарезки:
import numpy as np a = np.arange(16).reshape(2,2,2,2) print(a[. 0].flatten()) print(a[:, :, :, 0].flatten())
[ 0 2 4 6 8 10 12 14]
[ 0 2 4 6 8 10 12 14]
Таким образом, ‘…’ показывает, что существует столько ‘:’, сколько необходимо.
Логическое значение Многоточия
В отличие от None (Логическое значение которого False), логическое значение Многоточия - True.
TL; DR
Итак, я обнаружил следующие интересные особенности.
Атрибуты Функций: присвоение атрибутов функциям, как и объектам.
Цикл for-else: отслеживание, был ли цикл выполнен без оператора break.
Разделители для int: 32_534_478 – это int.
eval() и exec(): читайте строки как код Python и запустите его.
Многоточие: универсальная встроенная константа.
Напутствие
Python – это не только полезный язык, но и действительно интересный. Все мы заняты своей жизнью, но это не мешает узнавать язык ради него самого. Я бы хотел узнать больше о Пасхальных Яйцах, которые вы, возможно, найдёте.
- python
- программирование python
- python class
- python for web
- python tutor