Главная страница

Пособие. Пособие по Python. Название Описание


Скачать 0.75 Mb.
НазваниеНазвание Описание
АнкорПособие
Дата05.10.2021
Размер0.75 Mb.
Формат файлаpdf
Имя файлаПособие по Python.pdf
ТипДокументы
#241608
страница2 из 5
1   2   3   4   5
Конструкция if – elif – else
Теперь, когда мы знаем как сравниваются между собой величины, вернемся к нашему условному оператору if. И предположим, что хотим определить знак числа в переменной x. Конечно, проверку можно записать вот так: x
=
-
5
if
x
<
0
:
print
(
"x отрицательное число"
)
if
x
>=
0
:
print
(
"x неотрицательное число"
)
Но можно сделать лучше. Смотрите, мы здесь имеем дело со взаимоисключающими условиями, то есть, они не могут произойти одновременно: либо первое, либо второе. Для таких ситуаций можно использовать ключевое слово else – иначе, чтобы ускорить процесс проверки: x
=
5
if
x
<
0
:

print
(
"x отрицательное число"
)
else
:
print
(
"x неотрицательное число"
)
Теперь, у нас здесь всего одно условие. Если оно истинно, то выполнится первый print, а иначе – второй. Такая программа будет работать быстрее. И обратите внимание на синтаксис записи функции print: перед ней необходимо записать хотя бы один пробел (обычно ставится 4 пробела или символ табуляции). Эти пробелы в Python означают блок кода, который выполняется по некоторому условию. В данном случае блок кода состоит всего из одного оператора print. То же самое и для else.
В общем случае, синтаксис оператора if else следующий: if(<выражение>): оператор 1 else: оператор 2 или if(<выражение>): оператор 1 else: оператор 2
Если же мы хотим по такому принципу выполнить три проверки: x > 0; x < 0; x == 0, то предыдущую программу можно записать так:
if
x
<
0
:
print
(
"x отрицательное число"
)
elif
x
>
0
:
print
(
"x положительное число"
)
else
:
print
(
"x равен 0"
)
И вообще таких конструкций if
– elif – elif –…– elif – else может быть много. Далее, обратим внимание на такой факт: во всех наших примерах по условию шел один оператор – print. Но что если нужно выполнить несколько операторов по некоторому условию? Для этого их нужно записывать по такому синтаксису: if <условие>: оператор 1
оператор 1
… оператор N
Например:
x
=
-
10
;
sgn
=
0
if
x
<
0
: sgn
=
-
1
print
(
"x отрицательное число"
,
sgn)
elif
x
>
0
: sgn
=
1
print
(
"x положительное число"
,
sgn)
else
:
print
(
"x равен 0"
,
sgn)
Здесь по первым двум условиям выполняется два оператора: присвоение значения переменной sgn и вывод результата в консоль.
В ряде случаев конструкцию if-else удобнее записывать через тернарный условный оператор, который имеет такой синтаксис: result = значение1 if <условие> else значение2
При истинности условия возвращается значение1, в противном случае
– значение2. Например: age
=
18
accessAllowed
=
True
if
age
>=
18
else
False
print
(accessAllowed)
Получим True, если возраст (age) больше или равен 18, иначе – False.
Кстати, проверку из данного примера можно сделать короче, просто прописав accessAllowed
=
age
>=
18
здесь оператор >= вернет True при возрасте больше или равен 18 и
False
– в противном случае.
Теперь, когда мы разобрались с базовыми моментами проверки условий, сделаем следующий шаг и попробуем реализовать проверку попадания переменной x в диапазон [2; 7], то есть, условие должно быть истинным, когда x принимает значения в этом диапазоне чисел.
Очевидно, что здесь должно быть две проверки: первая – мы
проверяем, что x >= 2 и вторая – проверяем, что x <= 7. Если оба этих условия выполняются одновременно, то x попадает в наш диапазон.
Реализовать такую проверку на Python можно так: x
=
4
if
x
>=
2
and
x
<=
7
:
print
(
"x попадает в [2; 7]"
)
else
:
print
(
"x не попадает в [2; 7]"
)
Смотрите, здесь записано два условия, объединенных по И (and – это
И). В результате, общее составное условие будет считаться истинным, если истинно и первое и второе условие. Если хотя бы одно из этих условий ложно, то ложно и все составное условие. В результате мы корректно реализуем проверку на вхождение значения переменной в диапазон [2; 7].
А теперь давайте реализуем противоположное условие, что x не принадлежит диапазону [2; 7]. Условие будет таким: x
=
40
if
(x
<
2
or
x
>
7
):
print
(
"x не попадает в [2; 7]"
)
else
:
print
(
"x попадает в [2; 7]"
)
Здесь в составном условии используется связка по ИЛИ (or – это ИЛИ) и оно будет истинно, если истинно или первое, или второе условие. То есть, в нашем случае, если x < 2 или x > 7, то делается вывод о невхождении переменной x в указанный диапазон.
Итак, запомните следующие правила:
• условие x >= 2 and x <= 7 истинно, если истинно каждое из подусловий (x>=2 и x <= 7) и ложно, если ложно хотя бы одно из них;
• условие x < 2 or x > 7 истинно, если истинно хотя бы одно из подусловий (x < 2 или x > 7) и ложно, когда оба ложны.
Вот так можно записывать более сложные условия в условном операторе if. Причем они могут комбинироваться в любом сочетании, например: x
=
4
;
y
=
-
2
if
x
>=
2
and
x
<=
7
and
(y
<
0
or
y
>
5
):
print
(
"x попадает в [2; 7], y не попадает в [0; 5]"
)
Здесь реализована проверка, что x должно принадлежать [2; 7], а y не принадлежать [0; 5]. И обратите внимание вот на эти круглые скобки.

Дело в том, что приоритет у операции and выше, чем у or, поэтому без скобок у нас бы получилась вот такая проверка: if (x >= 2 and x <= 7 and y < 0) or (y > 5) то есть, мы проверяли бы, что x принадлежит [2; 7] и y меньше нуля
ИЛИ y больше 5. Как вы понимаете – это уже совсем другая проверка.
Поэтому учитывайте приоритет этих операций при формировании составного условия. Если нужно изменить приоритет – используйте круглые скобки.
Одиночные проверки
Внутри условия можно прописывать и такие одиночные выражения: x
=
4
;
y
=
True
;
z
=
False
if
(x):
print
(
"x = "
,
x
,
" дает true"
)
if
(
not
0
):
print
(
"0 дает false"
)
if
(
"0"
):
print
(
"
строка 0 дает true"
)
if
(
not
""
):
print
(
"
пустая строка дает false"
)
if
(y):
print
(
"y = true дает true"
)
if
(
not
z):
print
(
"z = false дает false"
)
Вот этот оператор not – это отрицание – НЕ, то есть, чтобы проверить, что 0 – это false мы преобразовываем его в противоположное состояние с помощью оператора отрицания НЕ в true и условие срабатывает. Аналогично и с переменной z, которая равна false.
Из этих примеров можно сделать такие выводы:
1.
Любое число, отличное от нуля, дает True. Число 0 преобразуется в False.
2.
Пустая строка – это False, любая другая строка с символами – это True.
3.
С помощью оператора not можно менять условие на противоположное (в частности, False превращать в True).
Итак, в условиях мы можем использовать три оператора: and, or и not.
Самый высокий приоритет у операции not, следующий приоритет имеет операция and и самый маленький приоритет у операции or. Вот так работает оператор if в Python.
Ни одна сколь-нибудь серьезная программа на Python не обходится без циклов. Что такое циклы?

Представьте, что спортсмен бегает по дорожкам стадиона и решил: пока не прошел один час, он бежит. То есть, пока выполняется условие (оно истинно – не прошел час), циклично выполняются некие действия – бегун бежит. Вот такую операцию на уровне языка Python выполняет оператор цикла while, имеющий следующий синтаксис:
Смотрите как в Python записывается группа операторов (тело цикла): вся группа должна иметь один и тот же сдвиг относительно оператора while (обычно ставят четыре пробела или символ табуляции). Причем такой отступ строго обязателен – это элемент синтаксиса python. И благодаря этому текст программы становится наглядным и хорошо читаемым. Это, безусловно, один из плюсов данного языка.
Однократное выполнение тела цикла называется итерацией. То есть, может быть первая итерация, вторая итерация, N-я итерация и так далее.
Давайте в качестве примера с помощью оператора цикла while вычислим вот такую вот сумму:
Расписывать все это через тысячу слагаемых не очень то удобно. И к тому же число слагаемых может зависеть от значения переменной и быть неопределенным. В таких задачах без циклов не обойтись. И программа будет выглядеть так:

S
=
0
;
i
=
1
while
i
<=
1000
:
S +
=
1
/i i +
=
1
print
(S)
В качестве выражения в цикле while можно писать все те же самые условия, что и в условном операторе if. Например, можно вычислять сумму S пока либо i<=1000, либо S < 5. Такое условие запишется так:
while
i
<=
1000
and
S
<
5
: здесь цикл будет работать пока i<=1000 и S<5 как только одно из подусловий станет ложным, все составное условие становится ложным и цикл завершит свою работу.
Вернемся к нашему спортсмену, бегущему по стадиону. И предположим, что прошел час, но бегун еще не завершил полный круг.
Что произойдет? Цикл сразу завершится? Нет, проверка условия завершения происходит только на начальной отметке, то есть, спортсмен должен добежать круг целиком и только потом проверить: прошел час или нет.
Другими словами, пока целиком не выполнится текущая итерация тела цикла, оператор while продолжает свою работу. И как только условие цикла становится ложным, то бегун останавливается и цикл завершает свою работу.
А что будет, если условие в цикле while будет истинным всегда? В этом случае мы получим «вечный» цикл, программа фактически зависнет и наш спортсмен будет обречен на бесконечный бег по кругу.
S
=
0
;
i
=
1
while
1
: S +
=
1
print
(S)

Далее, цикл while может иметь необязательный блок else, который идет после цикла:
Это, вроде как естественный выход из оператора цикла. В нашей иллюстрации это может быть традиционное посещение спортсменом душа после пробежки.
И здесь часто возникает вопрос: а чем блок else отличается от блока операторов, просто идущих после блока while? Ведь когда цикл while завершится, мы так и так перейдем к последующим операторам!
Однако, тут есть один нюанс. Любой оператор цикла в Python может быть досрочно прерван с помощью оператора
break

Как только он встречается в теле цикла, цикл (в данном случае while) завершает свою работу. Это как если вдруг возник пожар и спортсмен не дожидаясь окончания круга спешно бежит со стадиона. В этом случае спортсмену уже не до душа, он сразу хватает свои вещи и убегает из спортивного комплекса. То есть, при досрочном прерывании работы цикла while, конструкция else не выполняется и управление переходит на последующие операторы. Вот в чем отличие блока else от операторов, стоящих непосредственно после while.
Например:
S
=
0
;
i
=
-
10
while
i
<
100
:
if
i
==
0
:
break
S +
=
1
/i i
=
i+
1
else
:
print
(
"Сумма вычислена корретно"
)
print
(S)
Если здесь при вычислении суммы ожидается деление на 0, то срабатывает break и цикл досрочно прерывается. В этом случае блок else не срабатывает и мы не видим сообщения, что сумма вычислена корректно. Если же все проходит штатно (без вызова break), то в консоли появляется сообщение
Сумма вычислена корректно означающее выполнение блока else.
Раз уж мы начали говорить об управляющем операторе break, сразу отметим второй подобный оператор
continue
Этот оператор позволяет пропускать тело цикла и перейти к следующей итерации, не прерывая работу самого цикла. Например, мы хотим перебрать все целые значения от -4 до 4, исключая значение 0. Такую программу можно реализовать так:
S
=
0
;
i
=
-
5
while
i
<
4
: i
=
i+
1
if
i
==
0
:
continue
print
(i)
S +
=
1
/i
print
(S)

При выполнении этой программы увидим, что в консоль выведены все значения кроме нуля. Так как при i=0 срабатывает условие и выполняется оператор continue. Все что находится после этого оператора пропускается и цикл продолжается уже со значением i=1.
Вот так работают эти два управляющих оператора break и continue, которые можно использовать во всех операторах циклов.
Оператор цикла for
Следующий и, наверное, самый часто используемый оператор цикла – это оператор for, который имеет такой синтаксис:
for <переменная> in <список> : операторы 1…N
Например,
for
x
in
1
,
5
,
2
,
4
:
print
(x**
2
) выведет в консоль квадраты соответствующих чисел. Но что, если мы хотим перебрать значения по порядку в соответствии с правилом: начальное значение, шаг, конечное значение
Для этого используется генератор последовательностей range(start, stop, step)
Например, если мы запишем его вот так:
for
x
in
range
(
1
,
5
,
1
):
print
(x) то в консоли увидим числа от 1 до 4 с шагом 1. То есть, range генерирует последовательность в интервале
[1;5)
Последнее значение не входит в интервал. Если в нашем примере поставить шаг отрицательный -1, то конечное значение 5 не может быть достигнуто и в этом случае Python возвратит пустую последовательность:
for
x
in
range
(
1
,
5
,
-
1
):
print
(x)

Если нам нужны числа от 5 до 1, то следует записывать range в таком виде:
for
x
in
range
(
5
,
0
,
-
1
):
print
(x)
Причем, в range можно записывать только целые числа, с вещественными он не работает.
Давайте перепишем нашу программу подсчета суммы с помощью цикла for, получим:
S
=
0
for
i
in
range
(
1
,
1001
,
1
):
S +
=
1
/i
print
(S)
Здесь весь цикл записан буквально в одну строчку, а тело цикла состоит из одного оператора – подсчета суммы ряда.
Вторым примером рассмотрим задачу вычисления значений линейной функции
Программа будет выглядеть так: k
=
0.5
;
b
=
2
lst
=
[
0
,
0.1
,
0.2
,
0.3
,
0.4
,
0.5
]
for
x
in
lst:
print
(x*k+b)
Этот пример показывает, что для перебора значений счетчика x можно использовать списки, сформированные ранее в программе. (О списках мы подробнее будем говорить на последующих занятиях).
Здесь же приведем еще один пример: msg
=
"Hello World!"
for
x
in
msg:
print
(x)

Он показывает, что строку можно воспринимать как список и перебирать с помощью цикла for.
Также в цикле for можно использовать блок else, о котором мы говорили ранее: for <переменная> in <список> : операторы 1…N else: операторы 1…N
Вложенные циклы
Итак, мы с вами рассмотрели два оператора циклов: while и for. Все эти циклы можно комбинировать друг с другом. То есть, создавать вложенные циклы (цикл внутри цикла).
Как это работает? Представьте, что бегун начинает бежать по большому кругу, но затем, для продолжения бега, ему необходимо сделать еще несколько вложенных кругов, после чего он возвращается на большой круг и продолжает свой бег.
В частности, такие вложенные циклы очень полезны для перебора элементов матрицы

Тогда мы делаем первый цикл от 1 до N и вложенный от 1 до M
A
=
[ [
1
,
2
,
3
]
,
[
4
,
5
,
6
] ]
N
=
2
;
M
=
3
for
i
in
range
(N):
for
j
in
range
(M):
print
(A[i][j])
print
()
Или для подсчета вот такой двойной суммы ряда
Программа будет выглядеть так:
S
=
0
;
M
=
10
;
N
=
5
for
i
in
range
(
1
,
N+
1
):
for
j
in
range
(
1
,
M+
1
):
S +
=
i*j
print
(S)
Мы здесь сначала пробегаем все значения j от 1 до M при фиксированном i=1, затем, значение i увеличивается на 1, становится
2 и при этом i снова пробегаются значения j от 1 до M. И так пока i не превысит значение N. То есть, второй цикл вложен вот в этот первый.
И таких вложений можно делать сколько угодно.
Вот так работают операторы циклов в Python и теперь вы знаете как их можно применять на практике.
Часто в программах требуется хранить различные списки данных, например, список городов, число выигранных очков в серии игр, или значения некоторой функции:

Москва
Санкт-Петербург
Самара
Казань
Тверь
1200 200 500 2100 100 0.5 0.55 0.6 0.4
Все это можно представить в виде упорядоченно списка, который в
Python задается с помощью оператора квадратных скобок:
[элемент1, элемент2, …, элементN]
Например, для хранения городов можно задать такой список: lst
=
[
"Москва"
,
"Санкт-Петербург"
,
"Тверь"
,
"Казань"
]
И он будет упорядоченный, то есть, каждому элементу здесь соответствует свой порядковый индекс, начиная с нулевого:
Здесь синей рамкой отмечен сам список, внутри которого располагаются элементы. Если мы посмотрим тип объекта, на который ссылается переменая lst: type
(lst) то увидим значение «list». Это как раз и есть тип списка. То есть, через переменную lst мы можем работать со списком в целом, и первое, что нас здесь интересует: как обратиться к определенному элементу этого списка? Для этого используется такой синтаксис: список[индекс]
Например, lst[
0
] lst[
2
]
Но, если мы укажем не существующий индекс:
lst[
5
] то возникнет ошибка. Чтобы этого избежать нам надо знать значение последнего индекса. Для этого можно воспользоваться функцией len(список) которая возвращает число элементов в списке: len
(lst) вернет значение 4. Но, так как индексы начинаются с нуля, то последний индекс будет равен: lastIndex = len(lst)
– 1
То есть, можно записать вот так: lst[
len
(lst)-
1
] но можно и проще, вот так: lst[-
1
]
Этот пример показывает, что при отрицательных индексах, мы начинаем движение с конца списка и значение -1 дает самый последний элемент.
Далее, для перебора элементов списка в Python очень удобно использовать цикл for: lst
=
[
"Москва"
,
"Санкт-Петербург"
,
"Тверь"
,
"Казань"
]
1   2   3   4   5


написать администратору сайта