1. Введение в программирование и базовые типы данных
Введение в программирование и базовые типы данных
Программирование часто окружено ореолом таинственности. Со стороны может показаться, что разработчики пишут непонятные заклинания на черном экране, заставляя машины выполнять сложные задачи. На самом деле программирование — это просто способ общения. Это процесс перевода человеческих идей и логики на язык, который способен понять и выполнить компьютер.
Чтобы пройти путь от абсолютного новичка до создателя собственного ИИ-ассистента, веб-приложений и игр, необходимо начать с самого фундамента. Невозможно построить надежный небоскреб на слабом фундаменте. Точно так же невозможно написать сложную нейронную сеть, не понимая, как компьютер хранит информацию и управляет ею.
Компьютер — это невероятно быстрое, но абсолютно лишенное фантазии устройство. Он делает ровно то, что ему сказано, шаг за шагом. Программа — это и есть набор таких пошаговых инструкций. А чтобы инструкции имели смысл, они должны работать с какими-то данными. Именно поэтому наше погружение в мир IT начинается с изучения того, как программы запоминают информацию и какие виды этой информации существуют.
Что такое переменная
Представьте, что вы переехали в новый дом и раскладываете вещи по коробкам. Чтобы потом быстро найти нужную вещь, вы берете маркер и подписываете каждую коробку: «Книги», «Посуда», «Документы».
В программировании переменная — это такая же подписанная «коробка», но находится она в оперативной памяти компьютера. Это именованный контейнер, в котором программа хранит данные для их дальнейшего использования и изменения.
Когда программа запускается, она запрашивает у операционной системы немного места в памяти. Память компьютера можно представить как гигантский склад с миллионами пронумерованных ячеек. Каждая ячейка имеет свой уникальный адрес, который выглядит примерно так: 0x7fff5fbffc5c. Запоминать такие адреса человеку невероятно сложно. Поэтому программисты придумали переменные — они позволяют дать сложным адресам памяти простые, понятные человеку имена.
> Переменная — это именованная область памяти, предназначенная для хранения данных, которые могут изменяться в процессе выполнения программы.
Анатомия переменной
Любая переменная состоит из трех ключевых элементов:
Рассмотрим пример из реальной жизни. Допустим, мы пишем программу для интернет-магазина. Нам нужно сохранить возраст покупателя. Мы создаем переменную, называем ее userAge и кладем в нее значение 25.
Теперь каждый раз, когда мы напишем в коде userAge, компьютер пойдет в память, найдет «коробку» с такой надписью и достанет оттуда число 25. Если у покупателя случится день рождения, мы сможем обновить значение в этой же коробке:
Именно поэтому она называется переменной — ее содержимое может меняться со временем.
!Визуализация переменных в памяти компьютера
Правила именования переменных
Компьютер строг к правилам. Вы не можете назвать переменную как угодно. Существуют универсальные правила, применимые почти ко всем языкам программирования:
* Имя не может начинаться с цифры. 1player вызовет ошибку, а player1 — сработает отлично.
* Нельзя использовать пробелы. Вместо них используют специальные стили написания (о них ниже).
* Имена чувствительны к регистру. Переменные score, Score и SCORE — это три совершенно разные коробки.
* Нельзя использовать зарезервированные слова языка (например, if, for, while), так как они уже заняты под внутренние команды.
Чтобы код был читаемым, программисты договорились использовать определенные стили (нотации) для слов, состоящих из нескольких частей:
camelCase* (верблюжий регистр) — первое слово со строчной буквы, каждое следующее с заглавной. Пример: maxUserScore, shoppingCartTotal. Часто используется в JavaScript и Java.
snake_case* (змеиный регистр) — слова пишутся со строчной буквы и разделяются нижним подчеркиванием. Пример: max_user_score, shopping_cart_total. Стандарт для Python.
Хорошее имя переменной должно отвечать на вопрос «Что здесь хранится?». Имя x = 10 ничего не говорит программисту. А вот discountPercentage = 10 сразу дает понять, что речь идет о десятипроцентной скидке.
Базовые типы данных
Мы выяснили, что переменная — это коробка. Но коробки бывают разными. Вы не станете наливать суп в картонную коробку для обуви, а для хранения зимней резины не возьмете шкатулку для драгоценностей.
Компьютеру критически важно знать тип данных, который хранится в переменной. От этого зависит, сколько места в памяти нужно выделить и какие операции разрешено выполнять с этими данными. Например, числа можно умножать, а тексты — нет.
Давайте разберем четыре фундаментальных типа данных, которые существуют практически в любом языке программирования.
1. Целые числа (Integer)
Целые числа (Integer, часто сокращается до int) — это числа без дробной части. Они могут быть положительными, отрицательными или нулем.
Зачем они нужны? Для подсчета всего, что нельзя разделить на части. Количество пользователей на сайте, количество жизней в игре, год рождения, количество товаров в корзине.
Пример из жизни: У вас в корзине 3 яблока. Нельзя положить в корзину 3.14 яблока, если мы считаем их поштучно.
С целыми числами можно выполнять классические математические операции: сложение, вычитание, умножение и деление.
Если у нас есть переменная apples = 5 и pears = 3, то общее количество фруктов вычисляется просто: .
2. Числа с плавающей точкой (Float)
Числа с плавающей точкой (Float или Double) — это числа, имеющие дробную часть. В программировании дробная часть всегда отделяется точкой, а не запятой.
Зачем они нужны? Для измерения непрерывных величин: веса, расстояния, температуры, денег.
Пример из жизни: Цена товара составляет 99.99 долл. Ваш рост — 1.75 метра.
В физике и геометрии без них не обойтись. Вспомним формулу площади круга:
Где — площадь, — константа (примерно 3.14159, что является типичным Float), а — радиус.
Важный подводный камень: Компьютеры хранят дробные числа в двоичной системе счисления, что иногда приводит к неожиданным результатам из-за проблем с точностью. В большинстве языков программирования, если вы попросите компьютер сложить и , вы ожидаете получить . Но компьютер выдаст что-то вроде 0.30000000000000004.
Это происходит потому, что дробь в двоичной системе является бесконечной периодической дробью (как в десятичной). Компьютер вынужден округлять ее, чтобы уместить в памяти, из-за чего накапливается микроскопическая ошибка. Поэтому при работе с деньгами в серьезных банковских приложениях программисты часто хранят суммы в целых числах (в копейках или центах), чтобы избежать потери точности.
3. Строки (String)
Строка (String, часто str) — это любой текст. Буквы, слова, предложения, абзацы или даже пустой текст. Чтобы компьютер понял, что перед ним строка, а не имя переменной или команда, текст всегда заключается в кавычки (одинарные ' ' или двойные " ").
Зачем они нужны? Для хранения имен, адресов, сообщений в чате, паролей и любого другого текста.
Пример из жизни: userName = "Алексей", userEmail = "alex@example.com".
Строки можно «складывать». Этот процесс называется конкатенацией (склеиванием).
Если у нас есть firstName = "Иван" и lastName = "Иванов", мы можем сложить их: firstName + " " + lastName. Результатом будет новая строка "Иван Иванов".
Типичная ошибка новичка: путаница между числами и строками, содержащими цифры.
Для компьютера число 5 (Integer) и строка "5" (String) — это совершенно разные вещи.
Если вы сложите два числа: .
Но если вы сложите две строки: "5" + "5" = "55". Компьютер просто приклеит один символ к другому.
4. Логический тип (Boolean)
Логический тип (Boolean, часто bool) — это самый простой тип данных, который может принимать только одно из двух значений: Истина (True) или Ложь (False).
Этот тип назван в честь английского математика Джорджа Буля, создателя алгебры логики.
Зачем он нужен? Это основа принятия решений в коде. Любая программа постоянно задает вопросы и действует в зависимости от ответа (Да или Нет).
Пример из жизни:
* Пользователь авторизован? isLoggedIn = True
* Товар есть в наличии? inStock = False
* Уровень пройден? levelCompleted = True
Булевы значения часто появляются как результат математических сравнений. Например, выражение компьютер вычислит и превратит в значение True. А выражение превратится в False.
Преобразование типов (Type Casting)
В реальных проектах данные часто приходят не в том виде, в котором нам нужно. Например, когда пользователь вводит свой возраст в текстовое поле на сайте, программа получает эти данные как строку "25". Если мы захотим проверить, больше ли возраст 18 лет (выполнить математическое сравнение ), нам нужно сначала превратить строку в число.
Этот процесс называется преобразованием типов.
Большинство языков позволяют делать это явно. Например, в Python мы можем сказать: «Возьми строку '25' и сделай из нее целое число».
Если попытаться преобразовать в число строку, в которой написаны буквы (например, int("Привет")), программа выдаст ошибку и остановит работу, так как компьютер не знает, какое математическое значение соответствует слову «Привет».
Системы типизации: Статика против Динамики
Языки программирования по-разному относятся к тому, насколько строго нужно контролировать типы данных в переменных. По этому признаку они делятся на два больших лагеря: со статической и динамической типизацией.
Статическая типизация
В языках со статической типизацией (Java, C++, C#) вы обязаны заранее объявить, какой тип данных будет храниться в переменной. Как только коробка создана и подписана, вы не можете положить в нее ничего другого.
Если вы сказали, что переменная score — это целое число (Integer), вы не сможете позже положить туда строку "Победа". Компьютер выдаст ошибку еще до запуска программы.
* Плюсы: Высокая надежность. Компьютер находит множество ошибок на этапе написания кода. Программы работают быстрее, так как компьютеру не нужно тратить время на угадывание типа данных в процессе работы. * Минусы: Нужно писать больше кода. Разработка идет медленнее.
Динамическая типизация
В языках с динамической типизацией (Python, JavaScript, Ruby) переменные — это универсальные коробки. Вы не указываете тип заранее. Компьютер сам догадывается о типе данных в момент, когда вы кладете туда значение.
Более того, в процессе работы программы вы можете вытащить из коробки число и положить туда строку.
* Плюсы: Код пишется быстрее и выглядит лаконичнее. Идеально для новичков и быстрого создания прототипов. * Минусы: Ошибки могут всплыть только во время работы программы. Если вы случайно перезаписали число строкой, а потом попытались умножить ее на 5, программа сломается прямо в руках у пользователя.
| Характеристика | Статическая типизация (C++, Java) | Динамическая типизация (Python, JS) | | :--- | :--- | :--- | | Объявление типа | Обязательно (программистом) | Автоматически (интерпретатором) | | Изменение типа | Запрещено | Разрешено | | Поиск ошибок | До запуска (на этапе компиляции) | Во время работы программы | | Скорость разработки | Медленнее | Быстрее |
Как это связано с созданием ИИ-ассистента?
Возможно, сейчас вы думаете: «Я хочу создавать искусственный интеллект, зачем мне знать про какие-то целые числа и строки?».
Дело в том, что любая, даже самая сложная система, строится из этих базовых кирпичиков. Давайте заглянем в будущее и посмотрим, как наш финальный проект — ИИ-ассистент — будет использовать базовые типы данных:
0.985 — это типичный Float.isMicrophoneOn = True (слушать ли голос?), hasContext = False (помнит ли ИИ предыдущий вопрос?).Понимание того, как данные хранятся и взаимодействуют — это первый и самый важный шаг в программировании. Мы научились создавать «коробки» и раскладывать по ним информацию. В следующих статьях мы узнаем, как заставить компьютер принимать решения на основе этих данных и повторять действия тысячи раз в секунду с помощью циклов.