Лекция 1. Основы синтаксиса Python3

Цикл for

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

range(N)
последовательность чисел от 0 до (N - 1) включительно. Весьма удобна для обхода индексов массива. Если N <= 0, последовательность будет пустой, а for не выполнится ни разу.

Пример:

for i in range(10):
    print(i)

Данный код при выполнении выведет числа от 0 до 9 включительно. Обратите внимание, что цикл for сам определяет переменную цикла, отдельно это делать не нужно.

0
1
2
3
4
5
6
7
8
9
range(a, b)
последовательность чисел от a до (b - 1) включительно. Если b <= a, то последовательность будет пустой, а for не выполнится ни раза.

Пример:

for i in range(14, 17):
    print(i)

Выведет:

14
15
16
range(a, b, step)
последовательность чисел от a до b с шагом step. b в последовательность не включается. Если a == b или знаки шага step и выражения (b - a) не совпадают, то последовательность будет пустой, тело for не выполнится.

Пример:

for i in range(1, 9, 2):
    print(i)

Выведет:

1
3
5
7

Пример:

for i in range(3, -4, -2):
    print(i)

Выведет:

3
1
-1
-3

После завершения цикла for в переменной цикла хранится значение, которое было в ней на последней итерации. Для range(10) это будет число 9.

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

Оператор break

Оператор break прерывает цикл for или while.

for i in range(1, 20):
    print('i =', i)
    if i % 6 == 0:
        break
print('Final i =', i) # выводит 6

Такой цикл, как и ожидается, прервётся по break:

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
Final i = 6

Если break вложен в сразу несколько циклов, он прерывает самый вложенный из них.

Цикл while

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

_images/while.png

Обратите внимание, что принадлежность инструкций к телу цикла определяется отступами.

Напишем с помощью while аналог следующего цикла for:

for i in range(2, 8):
    print(i)

этот аналог будет выглядеть следующим образом:

i = 2
while i < 8:
    print(i)
    i = i + 1

Как видно, for проще, короче, и в нём труднее забыть сделать приращение переменной. Кроме того, такой for будет работать быстрее, чем while, так как range написана на Си, а операции i < 8 и i = i + 1 выполняются на питоне.

Вместо i = i + 1 можно поставить i += 1, оператора ++ в Python3 нет.

while условие:
    pass  # "Пустая инструкция" В данном случае, пустое тело цикла.

Цикла с постусловием (do..while в Си), проверяющего условие после выполнения тела цикла, в Python нет. Когда такой цикл нужен, обычно имитируют его в помощью бесконечного цикла и выхода по условию через break:

while True:              # Бесконечный цикл
    тело_цикла
    if условие_завершения:
        break

Логические выражения

bool – логический тип, значения которого (True, False) возвращают операторы сравнения (<, >, <=, >=, ==, !=) а так же операторы in, not in, is, not is, смысл которых мы рассмотрим позже. Результаты этих операций мы как правило и используем в условиях цикла while и оператора if.

a = int(input("Введите a: ")
b = int(input("Введите b: ")
if a == b:
    print("Числа равны")
else:
    print("Числа различны")

Вложенные if-ы

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

a = float(input("a = "))
b = float(input("b = "))
c = float(input("c = "))

D = b * b - 4 * a * c

if D < 0:
    print("Решений нет")
else:
    if D == 0:
        print("Одно решение")
        print("x =", (-b / (2 * a)))
    else:
        print("Два решения")
        print("x1 =", ((-b + D ** 0.5) / (2 * a)))
        print("x2 =", ((-b - D ** 0.5) / (2 * a)))

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

Чтобы закончить с вопросом важности правильной расстановки отступов и их влияния на код программы, рассмотрим два следующих примера, где положение отступа изменяет принадлежность оператора else:

if ...:
    if ...:
        ...
    else:
        ...
if ...:
    if ...:
        ...
else:
    ...

В первом случае else относится ко вложенному if, во втором – ко внешнему.

Подключение модулей

В Python3 существует очень развитая и удобная система разбиения программ на модули. Каждый файл с расширением .py является модулем и может использовать другие модули или сам быть использован ими. Подключение модулей выполняется инструкцией

import имямодуля

Пример работы с математическим модулем:

import math
x = math.cos(math.pi / 6)   # Вычисляем косинус аргумента пи / 6

Оператор “точка” в python – оператор доступа к в вложенному объекту, например, к переменной или функции в модуле.

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

print(dir(math))

Модуль math

Имя переменной или функции Описание
e экспонента (число 2.718281828459045)
pi число 3.141592653589793
sin(x), cos(x), tg(x) тригонометрические функции, аргумент в радианах
radians(x) перевод x из градусов в радианы
degrees(x) перевод x из радианов в градусы
exp(x) функция экспоненты
log(x) натуральный логарифм
log(x, a) логарифм x по основанию a
sqrt(x) квадратный корень числа x
ceil(x) округление вверх
floor(x) округление вниз

Примеры работы округляющих функций:

math.ceil(2.1) -> 3

math.floor(2.9) -> 2

Существует несколько полезных математических функций не из модуля math:

round(3.5) -> 4

округляет до ближайшего целого. Полуцелые округляются до ближайшего чётного числа.

abs(-3)    -> 3

вычисляет модуль числа.

Консоль Python в IDLE

_ - результат предыдущей команды (работает только в интерактивном режиме). Пример:

>>> import math
>>> x = 3
>>> 10 + math.log(x)
11.09861228866811
>>> x = _
>>> x
11.09861228866811
Alt + p предыдущая команда из истории
Alt + n следующая команда из истории

Кроме того, для работы в интерактивном режиме Python3 удобно пользоваться функциями из модуля math и при этом не писать перед каждой функцией имя модуля с точкой. Для таких случаев есть возможность импортировать функции и переменные из модуля в основное пространство имён программы. Делается это инструкцией:

from math import *

Например:

>>> from math import *
>>> x = 3
>>> 10 + log(x)                    # log(x) вместо math.log(x)
11.09861228866811
>>> print(e, pi, sin(pi / 2))      # тоже без указания модуля
2.718281828459045 3.141592653589793 1.0

Редактирование файлов с исходным кодом в IDLE

Несколько полезных команд IDLE и сочетаний клавиш для комментирования, раскомментирования, сдвигов кусков кода влево/вправо по уровням отступов, кратным четырём пробелам.

Меню File -> New File Редактировать новую программу
F5 Сохранение и запуск текущего файла
Alt + 3 Закомментировать текущую строку или выделенную область текста
Alt + 4 Убрать комментарий из одной или нескольких строк
Ctrl + ] Сдвинуть строку или выделенные строки на отступ вправо
Ctrl + [ Сдвинуть строку или выделенные строки на отступ влево