Введение в программирование на языке Python

Установка интерпретатора

Python – интерпретируемый кроссплатформенный язык программирования, отличающийся минималистичным синтаксисом. Существует несколько реализаций интерпретатора Python, однако наиболее полной (и де-факто, эталонной) реализацией является проект CPython.

На данный момент, существует две версии языка: Python 2 и Python 3. Эти версии не совместимы между собой - программа, написанная на Python 2, может не работать с интерпретатором Python 3. Версия 2 официально не поддерживается разработчиками языка, однако до сих пор не вышла из употребления по причине того, что устаревший код до сих пор активно используется во многих свободных и коммерческих проектах. Для выполнения данной работы, необходимо использовать последнюю версию языка (на момент написания - 3.10.2).

На ОС семейства Windows Python можно установить, загрузив установщик с официального сайта проекта. При установке необходимо обязательно установить флажок Add Python to PATH, чтобы иметь возможность запускать интерпретатор из консоли. На Unix-подобных ОС интерпретатор Python устанавливается с помощью пакетного менеджера. Например, следующая команда установит последнюю версию интерпретатора в ОС FreeBSD:

pkg install python310

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

Python 3.10.2 (tags/v3.10.2:a58ebcc, Jan 17 2022, 14:12:15) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Для выхода из интерпретатора применяется команда quit().

Работа в командной строке

Как уже было отмечено выше, Python является интерпретируемым языком программирования. Это означает, что программа на Python выполняется “построчно”, т.е. предложение за предложением. Это даёт возможность вводить программу не только из заранее написанного файла, но и “на лету” с клавиатуры.

Если выполнить команду python в командной строке, появится приглашение интерпретатора. После символов >>> можно вводить произвольный код на Python, который будет выполняться сразу после нажатия клавиши Enter:

>>> 1+1
2
>>> x = "Hi"
>>> x[0]
'H'
>>>

Подобным образом интерпретатор используется в следующих случаях:

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

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

python my_program.py

В ОС Windows можно перетянуть значок файла в окно консоли, чтобы в текст введённой команды подставился его абсолютный путь, например:

python "C:\Пользователи\Васян\Рабочий стол\my_program.py"

Среда разработки

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

Установщик Python для Windows имеет в своем комплекте интегрированную среду разработки IDLE. Она позволяет запускать код прямо из текстового редактора, подобно Visual Studio, однако во многих отношениях уступает более функциональным средам.

Наконец, один из самых распространенных вариантов организации среды разработки - текстовый редактор Visual Studio Code с установленным plug-in для поддержки Python.

Основы синтаксиса Python

Многие языки программирования требуют наличия в программе процедуры, играющей роль точки входа в программу. Чаще всего, такая функция носит название main, Main, start или подобные им. Как следствие, синтаксическая структура кода на таких языках программирования (например, C#) является блочной:

static void Функция1()
{
...
}

static void Функция1()
{
...
}

static void Main()   <-   точка входа
{
...
}

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

def функция1():
    ...

def функция2():
    ...

...     <-   произвольный код, не являющийся частью никакой функции

При запуске программы, интерпретатор выполняет только код, не принадлежащий никакой функции. Это означает, что в языке Python нет необходимости создавать функцию main. Простейшие программы могут быть написаны вообще без создания каких-либо функций, например

print("Hello world")

Тем не менее, в Python существует возможность сымитировать семантику функции main, что считается хорошим тоном в крупных проектах.

Отметим еще две принципиальные особенности синтаксиса языка:

Объявление переменных и инициализация

Синтаксис объявления переменных в Python похож на синтаксис C#, однако в Python не указывается тип переменной:

x = 123
y = True
z = "asdfgh"

Здесь True - ключевое слово, подобное true в языке C#, обозначающее булевую константу со значением “истина”. Константа “ложь” обозначается словом False.

Python - язык программирования с динамической типизацией. Это означает, что тип переменной определяется во время выполнения программы, а не во время ее компиляции. В частности, это означает, что следующий код на Python будет выполнен без ошибок:

x = 123
x = "123"

Здесь переменная x меняет свой тип с целочисленного на строковый, что невозможно в языках со статической типизацией.

Модификация переменных

Операторы +, -, *, и % работают для целочисленных типов и чисел с плавающей точкой подобно соответствующим им операторам C#:

x = 1
x = x + 1
x = x * 2
x = 2 / x
x = 3 ** 4
x = x // 9

Выражение a ** b возводит значение a в степень b, т.е. является операторным аналогом функции Math.Pow(a, b) в C#. Оператор / выполняет деление с сохранением дробной части, т.е. 2 / 3 будет давать 0.6666666. Для выполнения целочисленного деления, подобно оператору / в C#, в Python используется оператор //.

Оператор + для строковых операндов выполняет конкатенацию, подобно оператору + в языке C#.

Примитивные типы данных

Язык Python является языком программирования с сильной (строгой) динамической типизацией. Не вдаваясь в фундаментальные отличия сильных и слабых систем типизации, поясним что это значит применительно к Python.

Несмотря на то, что в тексте программы отсутствуют какие-либо намёки на используемые типы данных, сам интерпретатор Python ведёт учёт информации о типах в процессе выполнения программы. Например, выполнение кода

x = 1

не только создаст переменную x с целочисленным значением 1, но и запишет информацию о типе этой переменной. Эту информацию можно получить путём вызова функции type():

>>> x = 1
>>> type(x)
<class 'int'>

Информация о типах используется интерпретатором, в частности, для того чтобы не допустить выполнения операций с некорректными типами аргументов:

>>> x = 1
>>> y = "2"
>>> x+y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'

В примере выше возникает ошибка применения оператора + над операндами с типами ‘int’ и ‘str’.

Перечислим все примитивные типы, доступные в Python:

Списки

В Python тип list является встроенным типом данных. Одновременно с этим, язык не имеет встроенной поддержки массивов. Это объясняется тем, что в большинстве случаев списки являются более удобными структурами данных, а использование массивов необходимо для повышения производительности.

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

empty = []
list1 = [1, 2, 3, 4, 5]
element = list1[3]
list2 = list1[0:2]

В первой строке создаётся пустой список с помощью символов [].

Вторая строка показывает пример объявления списка, состоящего из пяти целочисленных элементов.

В третьей строке происходит доступ к четвертому элементу списка list1. Как и в C#, в языке Python индексация любых последовательностей производится с нуля.

Наконец, в четвёртой строке создаётся список list2 на основе среза списка list1. Синтаксическая конструкция x[a:b] извлекает последовательность элементов списка x, начиная с индекса a и заканчивая индексом b-1.

Оператор + позволяет создать новый список путем конкатенции списков-операндов:

>>> x = [1, 2] + [2, 3]
>>> print(x)
[1, 2, 3, 4]
>>>

Ввод и вывод текстовых данных с консоли

Ввод и вывод текста на консоль в Python производится с помощью функций input() и print():

s = input()
print("Вы ввели " + s)

Конверсия типов

Конверсия типов осуществляется путём вызова функций, одноимённых с типом данных, в который производится конверсия:

x = int("123")
s = str(456)

Список строк можно объединить в строку с помощью следующей конструкции:

>>> ",".join(["a", "b", "c"])
'a,b,c'

Оператор ветвления

Синтаксис оператора if в Python следующий:

if x > 0:
  print("x больше нуля")
else if x < 0:
  print("x меньше нуля")
else:
  print("x равен нулю")

Тело ветвей отделяется от остального кода отступом.

Логические операторы в Python имеют необычный вид, т.к. записываются не с помощью спецсимволов, а английских слов:

>>> 1 > 0 and 2 < 0 or False
False
>>> not False
True

Организация циклов

Язык Python поддерживает только циклы вида while и foreach. Циклы for и do-while не поддерживаются:

while условие:
  тело цикла

for x in [1,2,3]:
  print(x)

Не смотря на своё название, цикл for функционирует как foreach в C#.

С помощью цикла for и вспомогательной функции range() можно организовать цикл, похожий на for в C#:

l = [1,2,3]
for i in range(3):
  print(l[i])

Ключевые слова continue и break работают подобно соответствующим ключевым словам в C#.

Функции

В Python функции объявляются с помощью ключевого слова def и отделяются отступом:

def sum(x, y):
  return x + y

r = sum(1, 2)
print(r) # выведет 3

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

sum(y=2, x=1)

Модули в Python

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

import sys

print(sys.argv) # выводит аргументы командной строки

При импорте с помощью конструкции вида import имя_модуля, доступ к содержимому модуля производится через его имя - имя_модуля.x.

При импорте с помощью конструкции вида from имя_модуля import *, содержимое модуля добавляется в глобальную область видимости. Вместо * можно явно перечислять импортируемые функции и переменные.

Контрольные вопросы.

  1. В чем отличие между компилируемым и интерпретируемым языком программирования?
  2. Что понимается под динамической типизацией? В чем отличие сильных и слабых динамических систем типов?
  3. Почему в Python есть тип int, но нет типов, подобным short, int16 и прочим, как в языке C#?
  4. Что делает функция range()?

Задание на лабораторную работу.

  1. Настроить среду разработки на Python любым удобным способом.
  2. Написать и программу, соответствующую своему варианту. Программа должна через аргументы командной строки принимать от пользователя числовые значения \(x\), \(y\) и интервал \(n\). Интервал может быть десятичным числом. Затем программа расчитывает значение функции \(f(x, y)\), где первый аргумент пробегает интервал \([x, x+10]\) с шагом \(n\). Результаты расчёта на каждом шаге заносятся в список. Перед завершением программы список выводится на экран.
  3. Запустить написанную программу и убедиться в ее правильном функционировании.

Варианты заданий.

Вариант 1

\(f(x) = \begin{cases} (x^2 + y)^2 - \sqrt{x^2 y} & \quad \text{, при } xy > 0 \\ (x^2 + y)^2 - \sqrt{\mid x^2 y \mid} & \quad \text{, при } xy < 0 \\ (x^2 + y)^2 + 1 & \quad \text{, при } xy = 0 \\ \end{cases}\)

Вариант 2

\(f(x) = \begin{cases} ln(x^2) + (x^2 + y)^3 & \quad \text{, при } x/y > 0 \\ ln{\mid \frac {x^2} y \mid} + (x + y)^3 & \quad \text{, при } x / y < 0 \\ (x^2 + y)^3 & \quad \text{, при } x = 0 \\ 0 \quad \text{, при } y = 0 \\ \end{cases}\)

Вариант 3

\(f(x) = \begin{cases} x^2 + y^2 + sin(y) & \quad \text{, при } x - y = 0 \\ (x^2 - y)^2 + cos(y) & \quad \text{, при } x - y > 0 \\ (y - x^2)^2 + tg(x) & \quad \text{, при } x - y < 0 \\ \end{cases}\)

Вариант 4

\(f(x) = \begin{cases} (x^2 - y)^3 + arctg(x^2) & \quad \text{, при } x > y \\ (y - x^2)^3 + arctg(x^2) & \quad \text{, при } x < y \\ (y + x^2)^3 + 0.5 & \quad \text{, при } x = y \\ \end{cases}\)

Вариант 5

\(f(x) = \begin{cases} y \sqrt x^3 & \quad \text{, если } y \text { - нечетное и } x > 0 \\ \frac y 2 \sqrt {\mid x^2 \mid} & \quad \text{, если } y \text { - четное и } x < 0 \\ \sqrt {\mid y x^2 \mid} & \quad \text{ иначе } \\ \end{cases}\)

Вариант 6

\(f(x) = \begin{cases} e^{x^2 - \mid y \mid} & \quad \text{, при } 0.5 < xy < 10 \\ \sqrt {\mid x^2 + y \mid} & \quad \text{, при } 0.1 < xy \leq 0.5 \\ 2 x^2 & \quad \text{ иначе } \\ \end{cases}\)

Вариант 7

\(f(x) = \begin{cases} e^{x^2} & \quad \text{, при } 1 < xy < 10 \\ \sqrt {\mid x^2 + 4y \mid} & \quad \text{, при } 12 < xy < 40 \\ x^2 y & \quad \text{ иначе } \\ \end{cases}\)

Вариант 8

\(f(x) = \begin{cases} sin(5 x^2 + 3y \mid x^2 \mid) & \quad \text{, при } -1 < y < x \\ cos(3 x^2 + 5y \mid x^2 \mid) & \quad \text{, при } x > y \\ (x + y)^2 & \quad \text{, при } x = y \\ x & \quad \text { иначе } \\ \end{cases}\)

Вариант 9

\(f(x) = \begin{cases} 2 x^3 + 3 y^2 & \quad \text{, при } x > \mid y \mid \\ \mid x^2 - y \mid & \quad \text{, при } 3 < x < \mid y \mid \\ (x^2 - y)^2 & \quad \text{, при } x = \mid y \mid \\ y & \quad \text { иначе } \\ \end{cases}\)

Вариант 10

\(f(x) = \begin{cases} ln(\mid x^2 \mid + \mid y \mid) & \quad \text{, при } \mid xy \mid > 10 \\ e^{x^2 + y} & \quad \text{, при } \mid xy \mid < 10 \\ x^2 + y & \quad \text{, при } \mid xy \mid = 10 \\ \end{cases}\)

Вариант 11

\(f(x) = \begin{cases} sin(x)^2 + sin(y) & \quad \text{, при } x - y = 0 \\ cos(x) + cos(y) & \quad \text{, при } x - y > 0 \\ (y - tg(x))^2 + tg(y) & \quad \text{, при } x - y < 0 \\ \end{cases}\)

Вариант 12

\(f(x) = \begin{cases} \frac {x^2 y + 2} {x^2 + 1} & \quad \text{, при } 1 < \mid x \mid < 3 \\ y^2 + x^2 & \quad \text{, при } \mid x \mid \geq 3 \\ y \frac {x^2} {x + 2} & \quad \text{, при } \mid x \mid \leq 1 \\ \end{cases}\)

Вариант 13

\(f(x) = \begin{cases} sin(x^2) + cos(y) & \quad \text{, при } x - y = 0 \\ tg(x^2+y) & \quad \text{, при } x - y > 0 \\ sin(x)^2 + cos(y^2) & \quad \text{, при } x - y < 0 \\ \end{cases}\)

Вариант 14

\(f(x) = \begin{cases} ln(\mid x^2 \mid + \mid y \mid) & \quad \text{, при } \mid xy \mid > 10 \\ 3^{x^2 + y} & \quad \text{, при } \mid xy \mid < 10 \\ x^2 - y & \quad \text{, при } \mid xy \mid = 10 \\ \end{cases}\)

Вариант 15

\(f(x) = \begin{cases} x^3 - y^3 cos(x) & \quad \text{, при } x + y = 0 \\ (xy)^2 - cos(y) & \quad \text{, при } x + y > 0 \\ 3xy^2 & \quad \text{, при } x + y < 0 \\ \end{cases}\)