Основы программирования на Python · Лабораторная работа №1
Любой код — это строгий алгоритм. Чтобы программа работала, она должна быть написана по правилам языка (синтаксис) и быть осмысленной (семантика).
Синтаксис языка — совокупность правил, определяющих допустимые языковые конструкции. Это ответ на вопрос «из каких знаков и в каком порядке вообще можно составить команду».
Семантика языка — совокупность правил, определяющих смысл синтаксически корректных конструкций. Это ответ на вопрос «что эта команда означает и что она сделает при выполнении».
Из лекции: у нас есть выражение для обработки, и переходы между этапами обработки обусловлены синтаксисом. Но чтобы связка сработала, выражение должно удовлетворять ещё и требованиям семантики — быть логичным и понятным в рамках языковой логики (например, на вопрос можно ответить «ДА» или «НЕТ»).
# Синтаксически корректно И семантически верно: число + число = число x = 5 y = 3 print(x + y) # 8 # Синтаксис тот же, но семантика разная из-за ТИПОВ данных: a = "5" b = "3" print(a + b) # 53 — строки СКЛЕИВАЮТСЯ, а не складываются # Синтаксически корректно, но семантическая ошибка (сложить число и строку нельзя) print(x + a) # Это вызовет ошибку TypeError
Программа — это текст, а текст состоит из символов. Классический алфавит Python (по материалам лекции) включает четыре группы знаков:
| Группа | Символы |
|---|---|
| Буквы латинского алфавита | A…Z, a…z |
| Цифры | 0 1 2 3 4 5 6 7 8 9 |
| Знаки операций | + - = > < / % ~ ! и другие |
| Неотображаемые символы | пробел, табуляция, переход на новую строку |
1x = 5;my-var, my var;class, if, for…). В редакторах кода они обычно автоматически подсвечиваются другим цветом.# ДОПУСТИМЫЕ имена x1 = 10 _sum = 3.14 result_2 = True user_name = "Анна" # кириллица ВНУТРИ строки — можно print(x1, _sum, result_2, user_name) # НЕДОПУСТИМЫЕ конструкции (приведут к ошибке синтаксиса): # 1x = 5 # имя не может начинаться с цифры # my-var = 1 # дефис — это минус, а не часть имени # class = 5 # class — зарезервированное слово # $ = 1 # знак $ не входит в алфавит имён
Лексема — это единица текста программы, которая воспринимается компилятором (интерпретатором) как единое целое. Проще говоря, это минимальный «кирпичик» кода. Лексемы бывают пяти видов:
| Вид лексемы | Назначение | Пример |
|---|---|---|
| Идентификаторы | имена переменных | x, user_name |
| Идентификаторы | имена функций | print, len, type |
| Идентификаторы | имена типов | int, float |
| Ключевые слова | зарезервированные слова языка | if, else, while, for |
| Знаки операций | действия над значениями | + - = == != >= <= / // % |
| Константы | неизменяемые значения | True, False, 42, 3.14, "текст" |
| Разделители | разделяют части программы | пробел, табуляция, ( ) [ ] { } : ; , " " |
# В одной строке ниже собраны лексемы РАЗНЫХ видов: # x -> идентификатор (имя переменной) # = -> знак операции (присваивание) # 10 -> константа x = 10 # Ключевые слова нельзя использовать как имена: import keyword print("Всего ключевых слов:", len(keyword.kwlist)) print(keyword.kwlist) # Разделители: пробелы, запятые, скобки, двоеточие print("x положительное", x) # Пример вывода с разделителем-запятой
Тип данных определяет, какие значения может хранить переменная и какие
операции с ней допустимы. Узнать тип можно функцией type().
| Тип | Класс | Пример | Изменяемый? |
|---|---|---|---|
| Целое число | int | 42, -10, 0 | — |
| Вещественное число | float | 3.14, 0.1, -2.5 | — |
| Комплексное число | complex | 2+3j | — |
| Логический | bool | True, False | — |
| Строка | str | "Hello, world!" | нет |
| Список | list | [1, 2, 3] | да |
| Кортеж | tuple | (1, 2, 3) | нет |
| Множество | set | {1, 2, 3} | да |
| Словарь | dict | {"name": "John"} | да |
| Пустое значение | NoneType | None | — |
Пока что мы сосредоточимся на целых числах, вещественных числах и строках. Во второй части курса будем работать со списками и словарями. Также периодически будем применять логические значения (True/False).
samples = [
42, # int 3.14, # float 2 + 3j, # complex True, # bool "Hello, world!", # str
[1, 2, 3], # list
(1, 2, 3), # tuple
{1, 2, 3}, # set
{"name": "John"}, # dict None, # NoneType
]
print(samples[0])
print(samples[1])
print(samples[4])
print(samples[5])
print(samples[6])
print(samples[7])
print(samples[8])
print(samples[9])
# Примеры проверки типов данных: print(type(42)) # <class 'int'> print(type("Hello")) # <class 'str'> print(type([1, 2])) # <class 'list'> Переменная — это именованная область памяти, используемая для хранения данных, которые могут изменяться в процессе выполнения программы.
В Python переменные создаются автоматически в момент первого присваивания значения с помощью оператора =. Явное объявление типа не требуется.
x = 10 # целое число (int) name = "Python" # строка (str) pi = 3.14 # вещественное число (float) is_active = True # логический тип (bool)
Функция — это именованный блок кода, предназначенный для выполнения определенной задачи. Функции позволяют избегать дублирования кода и делают программу структурированной.
print(), len()).def.Для работы функции часто требуются входные данные. Эти данные называются аргументами. Они передаются в функцию внутри круглых скобок.
print("Привет!") # "Привет!" — это аргумент функции print
| Функция | Описание | Пример |
|---|---|---|
print() | Вывод данных на экран | print(10) |
input() | Получение данных от пользователя | name = input("Введите имя: ") |
int() | Преобразование значения в целое число | int("5") # станет 5 |
str() | Преобразование значения в строку | str(100) # станет "100" |
x = input("Введите имя: ") print(x) x = "5" print(x, "это", type(x)) x = int(x) print(x, "это", type(x))
Синтаксис — это «орфография» языка. Вот базовые правила, которые проверяет интерпретатор:
;.: после if, for, while, def.( [ { и " ' нужно закрыть.x и X — разные имена.==, присваивание — =. Не путайте.# ПРАВИЛЬНО: Все команды выполняются последовательно, у них одинаковый отступ от начала строки x = 1 y = 2 z = 'три' print(x) print(y) print(z) # НЕПРАВИЛЬНО: такие строки вызовут ошибку синтаксиса x = 5 # лишний отступ в начале файла x = (1 + 2 # незакрытая скобка if x = 5: pass # присваивание (=) вместо сравнения (==)
В Python существует три основных оператора деления, которые работают с числами по-разному:
/) — возвращает частное с дробной частью. Результат всегда имеет тип float.//) — возвращает только целую часть результата, «отбрасывая» дробную.%) — возвращает только остаток, который остался после целочисленного деления.print(10 / 3) # 3.3333333333333335 — обычное деление print(10 // 3) # 3 — целочисленное деление print(10 % 3) # 1 — остаток от деления
Операции сравнения используются для сопоставления двух значений. Результатом любой такой операции всегда является логический тип (bool) — либо True (истина), либо False (ложь).
| Оператор | Значение | Пример |
|---|---|---|
== | Равно | 5 == 5 # True |
!= | Не равно | 5 != 3 # True |
> | Больше | 5 > 3 # True |
< | Меньше | 3 < 5 # True |
>= | Больше или равно | 5 >= 5 # True |
<= | Меньше или равно | 3 <= 2 # False |
print('5 == 5', 5 == 5) # True print('5 != 3', 5 != 3) # True print('5 > 3', 5 > 3) # True print('5 < 3', 5 < 3) # False print('5 >= 5', 5 >= 5) # True print('6 >= 5', 6 >= 5) # True print('3 <= 2', 3 <= 2) # False
= — это присваивание значения переменной.
Двойной знак == — это сравнение двух значений.
Ошибки в программе делятся на два больших класса — и ведут они себя по-разному.
Нарушены правила написания: пропущено двоеточие, не закрыта скобка или
кавычка, неправильный отступ, = вместо ==.
Программа не запустится вообще: интерпретатор отказывается её выполнять
и указывает строку с ошибкой. Такие ошибки нельзя «поймать» через try/except.
Синтаксис верен, программа запускается, но ломается во время работы —
потому что функция вызвана неверно или данные не того типа. Примеры:
NameError (функция/имя не определено), TypeError (неверный тип
аргумента), ValueError (неверное значение), ZeroDivisionError (деление на ноль),
IndexError (выход за границы). Эти ошибки можно перехватить try/except.
# Примеры строк, которые вызовут SyntaxError (не запустятся вообще): # print('hi) # ошибка: незакрытая кавычка # x = (1 + 2 # ошибка: незакрытая скобка # if True print(1) # ошибка: пропущено двоеточие # if x = 5: pass # ошибка: = вместо сравнения (==)
# Примеры ошибок выполнения (программа запустится, но упадет): # len(5) # TypeError: len() не работает с числом # int('привет') # ValueError: строку нельзя превратить в число # 10 / 0 # ZeroDivisionError: деление на ноль # prynt() # NameError: такой функции нет # x = y # ошибка: переменной присвоено значение другой переменной
== для сравнения.int, float, complex, bool, str, list, tuple, set, dict, NoneType./), целочисленное (//) и остаток (%).==, !=, >, <, >=, <=, результат которых всегда bool.