Python — это высокоуровневый язык программирования, который славится своей простотой и читаемостью. Он был создан Гвидо ван Россумом и впервые выпущен в 1991 году.
print("Hello, World!")
Эта простая команда выводит текст "Hello, World!" на экран. Именно с такой программы традиционно начинается изучение любого языка программирования.
Переменная — это контейнер для хранения данных. В Python не нужно явно указывать тип переменной, он определяется автоматически при присваивании значения.
name = "Иван"
age = 25
height = 1.75
is_student = True
x = 42
print(type(x)) # <class 'int'>
name = "Python"
print(type(name)) # <class 'str'>
# Строка в число
age_str = "25"
age_int = int(age_str)
# Число в строку
count = 100
count_str = str(count)
# Число в логический тип
x = 0
bool(x) # False (любое ненулевое число = True)
Важно: Имена переменных должны начинаться с буквы или подчеркивания, не могут содержать пробелы и зарезервированные слова Python.
Условные операторы позволяют программе принимать решения и выполнять разные действия в зависимости от условий.
age = 18
if age >= 18:
print("Вы совершеннолетний")
print("Добро пожаловать!")
temperature = 25
if temperature > 30:
print("Жарко!")
else:
print("Нормальная температура")
score = 85
if score >= 90:
print("Отлично!")
elif score >= 75:
print("Хорошо")
elif score >= 60:
print("Удовлетворительно")
else:
print("Нужно подтянуться")
== — равно!= — не равно> — больше< — меньше>= — больше или равно<= — меньше или равноage = 20
has_license = True
if age >= 18 and has_license:
print("Можете водить машину")
is_weekend = False
is_holiday = True
if is_weekend or is_holiday:
print("Сегодня выходной!")
Циклы позволяют выполнять один и тот же код многократно. В Python есть два основных типа циклов:
for и while.
Используется для перебора элементов последовательности (списка, строки, диапазона).
# Перебор чисел от 0 до 4
for i in range(5):
print(i)
# Перебор элементов списка
fruits = ["яблоко", "банан", "апельсин"]
for fruit in fruits:
print(fruit)
# Перебор символов строки
for char in "Python":
print(char)
Выполняется, пока условие истинно.
count = 0
while count < 5:
print(f"Счет: {count}")
count += 1
# Бесконечный цикл с break
while True:
answer = input("Продолжить? (да/нет): ")
if answer == "нет":
break
print("Продолжаем...")
# break - прерывает цикл
for i in range(10):
if i == 5:
break
print(i) # Выведет 0, 1, 2, 3, 4
# continue - пропускает текущую итерацию
for i in range(5):
if i == 2:
continue
print(i) # Выведет 0, 1, 3, 4
# range(stop)
range(5) # 0, 1, 2, 3, 4
# range(start, stop)
range(2, 7) # 2, 3, 4, 5, 6
# range(start, stop, step)
range(0, 10, 2) # 0, 2, 4, 6, 8
Напишите простой калькулятор, который:
1. Запрашивает у пользователя два числа
2. Запрашивает операцию (+, -, *, /)
3. Выполняет вычисление и выводит результат
Обработайте случай деления на ноль с выводом соответствующего сообщения об ошибке.
Создайте игру "Угадай число":
1. Программа загадывает случайное число от 1 до 100
2. Пользователь пытается угадать число
3. Программа подсказывает "Больше" или "Меньше"
4. Игра продолжается до тех пор, пока число не будет угадано
5. В конце выводится количество попыток
Используйте цикл while и условные операторы. Для генерации случайного числа используйте import random и random.randint(1, 100).
⏳ Ваш ответ отправлен на проверку учителю
Создайте программу для анализа текста, которая:
1. Запрашивает у пользователя строку текста
2. Выводит количество символов (включая пробелы)
3. Выводит количество слов
4. Выводит количество гласных букв (а, е, ё, и, о, у, ы, э, ю, я)
5. Выводит текст в верхнем и нижнем регистрах
Используйте строковые методы и циклы для подсчета.
React — это JavaScript-библиотека для создания пользовательских интерфейсов. Разработана Facebook (Meta) и является одним из самых популярных инструментов фронтенд-разработки.
function Welcome() {
return <h1>Привет, мир!</h1>;
}
// Использование
<Welcome />
# Создание нового проекта
npx create-react-app my-app
cd my-app
npm start
После запуска откроется браузер с вашим первым React-приложением на http://localhost:3000
Компоненты — это независимые, переиспользуемые блоки кода, которые возвращают React-элементы для отображения на странице.
function UserCard(props) {
return (
<div className="card">
<h2>{props.name}</h2>
<p>{props.email}</p>
</div>
);
}
// Использование
<UserCard name="Иван" email="ivan@example.com" />
Props — это объект с данными, которые передаются компоненту сверху вниз. Props доступны только для чтения (read-only).
function Welcome(props) {
return <h1>Привет, {props.name}!</h1>;
}
// Несколько props
function Product(props) {
return (
<div>
<h3>{props.title}</h3>
<p>Цена: {props.price} руб.</p>
<button>{props.buttonText}</button>
</div>
);
}
<Product
title="Ноутбук"
price={50000}
buttonText="Купить"
/>
// Более чистый синтаксис
function UserCard({ name, email, age }) {
return (
<div>
<h2>{name}</h2>
<p>{email}</p>
<p>Возраст: {age}</p>
</div>
);
}
function App() {
return (
<div>
<UserCard name="Иван" email="ivan@example.com" age={25} />
<UserCard name="Мария" email="maria@example.com" age={22} />
<UserCard name="Петр" email="petr@example.com" age={30} />
</div>
);
}
State — это объект с данными, которые могут изменяться во время работы компонента. В отличие от props, state управляется внутри компонента.
import { useState } from 'react';
function Counter() {
// Создаем state переменную count со значением 0
const [count, setCount] = useState(0);
return (
<div>
<p>Счетчик: {count}</p>
<button onClick={() => setCount(count + 1)}>
Увеличить
</button>
</div>
);
}
function Form() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [age, setAge] = useState(0);
return (
<form>
<input
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="Имя"
/>
<input
value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="Email"
/>
<input
type="number"
value={age}
onChange={(e) => setAge(Number(e.target.value))}
placeholder="Возраст"
/>
</form>
);
}
function UserProfile() {
const [user, setUser] = useState({
name: '',
email: '',
age: 0
});
const updateName = (newName) => {
setUser({ ...user, name: newName });
};
return (
<input
value={user.name}
onChange={(e) => updateName(e.target.value)}
/>
);
}
useEffect позволяет выполнять побочные эффекты (запросы к API, подписки, изменение DOM).
import { useState, useEffect } from 'react';
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setSeconds(s => s + 1);
}, 1000);
// Cleanup функция
return () => clearInterval(interval);
}, []); // Пустой массив = выполнить один раз
return <p>Прошло секунд: {seconds}</p>;
}
Создайте компонент счетчика кликов со следующим функционалом:
1. Отображает текущее количество кликов
2. Кнопка "+ 1" увеличивает счетчик на 1
3. Кнопка "- 1" уменьшает счетчик на 1
4. Кнопка "Сбросить" устанавливает счетчик в 0
5. Счетчик не может быть отрицательным (блокируйте кнопку "- 1" при значении 0)
Используйте хук useState для управления состоянием счетчика.
Создайте приложение для управления списком задач (Todo List):
1. Поле ввода для добавления новой задачи
2. Кнопка "Добавить" для добавления задачи в список
3. Список отображает все добавленные задачи
4. Каждая задача имеет кнопку "Удалить"
5. Отображается общее количество задач
6. Если список пуст, показывается сообщение "Список задач пуст"
Используйте хук useState с массивом для хранения задач. Каждая задача должна иметь уникальный id.
Алгоритм — это конечная последовательность чётко определённых инструкций для решения задачи. Любая программа по сути является реализацией одного или нескольких алгоритмов.
Алгоритм поиска максимального элемента в массиве:
def find_max(arr):
max_value = arr[0] # Предполагаем, что первый элемент - максимальный
for num in arr:
if num > max_value:
max_value = num # Обновляем максимум
return max_value
numbers = [3, 7, 2, 9, 1, 5]
print(find_max(numbers)) # 9
Временная сложность показывает, как растёт время выполнения алгоритма при увеличении размера входных данных. Обозначается как O(n), где n — размер данных.
# O(1) - константное время
def get_first_element(arr):
return arr[0]
# O(n) - линейное время
def find_element(arr, target):
for item in arr:
if item == target:
return True
return False
# O(n²) - квадратичное время
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(n - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
# O(log n) - логарифмическое время
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
Показывает, сколько дополнительной памяти требуется алгоритму. Например, сортировка слиянием требует O(n) дополнительной памяти, а быстрая сортировка — O(log n).
Массив — это структура данных, хранящая элементы одного типа в непрерывной области памяти. Доступ к элементам осуществляется по индексу за O(1).
# Создание массива
arr = [1, 2, 3, 4, 5]
# Доступ по индексу - O(1)
print(arr[0]) # 1
# Добавление в конец - O(1) амортизированное
arr.append(6)
# Вставка по индексу - O(n)
arr.insert(2, 10)
# Удаление по значению - O(n)
arr.remove(10)
# Удаление по индексу - O(n)
del arr[2]
# Поиск элемента - O(n)
if 3 in arr:
print("Найдено")
В отличие от массива, элементы связного списка хранятся в разных участках памяти и связаны указателями.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = Node(data)
if not self.head:
self.head = new_node
return
current = self.head
while current.next:
current = current.next
current.next = new_node
def display(self):
current = self.head
while current:
print(current.data, end=" -> ")
current = current.next
print("None")
| Операция | Массив | Связный список |
|---|---|---|
| Доступ по индексу | O(1) | O(n) |
| Вставка в начало | O(n) | O(1) |
| Вставка в конец | O(1) | O(n) |
Сортировка — одна из самых частых задач в программировании. Существует множество алгоритмов сортировки с различной эффективностью.
Сложность: O(n²). Простой, но медленный алгоритм.
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
numbers = [64, 34, 25, 12, 22]
print(bubble_sort(numbers)) # [12, 22, 25, 34, 64]
Сложность: O(n²). Находит минимальный элемент и ставит его на первую позицию.
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
Сложность: O(n log n) в среднем. Один из самых эффективных алгоритмов.
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
numbers = [3, 6, 8, 10, 1, 2, 1]
print(quick_sort(numbers)) # [1, 1, 2, 3, 6, 8, 10]
| Алгоритм | Лучший случай | Худший случай |
|---|---|---|
| Bubble Sort | O(n) | O(n²) |
| Selection Sort | O(n²) | O(n²) |
| Quick Sort | O(n log n) | O(n²) |
Реализуйте два алгоритма поиска элемента в массиве:
1. Линейный поиск: проходит по всем элементам массива последовательно
2. Бинарный поиск: работает только с отсортированным массивом, делит массив пополам на каждой итерации
Функции должны возвращать индекс найденного элемента или -1, если элемент не найден.
Сравните скорость работы обоих алгоритмов на массиве из 1000 элементов и выведите время выполнения.
Реализуйте алгоритм пузырьковой сортировки (Bubble Sort):
1. Создайте функцию bubble_sort(arr), которая принимает массив чисел
2. Реализуйте алгоритм, который сравнивает соседние элементы и меняет их местами, если они стоят в неправильном порядке
3. Повторяйте процесс до тех пор, пока массив не будет полностью отсортирован
4. Функция должна возвращать отсортированный массив
5. Добавьте счётчик обменов и выведите его в конце
Протестируйте на массиве: [64, 34, 25, 12, 22, 11, 90]
Реализуйте структуру данных "Стек" (Stack) с основными операциями:
1. push(item) — добавить элемент в стек
2. pop() — удалить и вернуть верхний элемент
3. peek() — посмотреть верхний элемент без удаления
4. is_empty() — проверить, пуст ли стек
5. size() — вернуть количество элементов
Используя ваш стек, решите задачу проверки сбалансированности скобок в строке. Например:
- "(())" — сбалансирована
- "(()" — не сбалансирована
- "{[()]}" — сбалансирована
- "{[(])}" — не сбалансирована
Git — это распределённая система контроля версий, которая позволяет отслеживать изменения в файлах и координировать работу над ними нескольких людей.
# Проверка версии
git --version
# Настройка имени и email
git config --global user.name "Ваше Имя"
git config --global user.email "your@email.com"
# Просмотр настроек
git config --list
# Инициализация нового репозитория
git init
# Клонирование существующего репозитория
git clone https://github.com/username/repo.git
# Просмотр статуса файлов
git status
# Добавление файлов в индекс (staging area)
git add filename.txt
git add . # Добавить все изменённые файлы
# Создание коммита
git commit -m "Описание изменений"
# Просмотр истории коммитов
git log
git log --oneline # Краткий формат
Ветки позволяют разрабатывать функциональность изолированно от основного кода. Это одна из самых мощных возможностей Git.
# Просмотр всех веток
git branch
# Создание новой ветки
git branch feature-login
# Переключение на ветку
git checkout feature-login
# Создание и переключение одной командой
git checkout -b feature-signup
# Новый синтаксис (Git 2.23+)
git switch feature-login
git switch -c feature-new
# Переключитесь на ветку, В КОТОРУЮ хотите влить изменения
git checkout main
# Слияние ветки feature-login в main
git merge feature-login
# Удаление ветки после слияния
git branch -d feature-login
Конфликты возникают, когда Git не может автоматически объединить изменения. Вы увидите маркеры конфликта в файлах:
<<<<<<< HEAD
Код из текущей ветки
=======
Код из вливаемой ветки
>>>>>>> feature-branch
Разрешение конфликта:
# 1. Откройте файл и вручную разрешите конфликт
# 2. Удалите маркеры (<<<, ===, >>>)
# 3. Сохраните исправленный файл
# 4. Добавьте файл в индекс
git add filename.txt
# 5. Завершите слияние
git commit -m "Resolve merge conflict"
Rebase — альтернатива merge, которая переносит коммиты на верхушку другой ветки, создавая линейную историю.
# Переключитесь на ветку с фичей
git checkout feature-branch
# Перебазируйте на main
git rebase main
# Если возникли конфликты:
git add .
git rebase --continue
# Отмена rebase
git rebase --abort
GitHub — это веб-сервис для хостинга IT-проектов и их совместной разработки. Основан на Git и предоставляет дополнительные возможности для командной работы.
# Добавление удалённого репозитория
git remote add origin https://github.com/username/repo.git
# Просмотр удалённых репозиториев
git remote -v
# Отправка изменений на GitHub
git push origin main
# Получение изменений с GitHub
git pull origin main
# Скачивание изменений без слияния
git fetch origin
Pull Request — это запрос на включение ваших изменений в основную ветку проекта. Это основной механизм совместной разработки на GitHub.
git push origin feature-branchФорк — это копия чужого репозитория в вашем аккаунте. Используется для внесения изменений в проекты, где у вас нет прав на запись.
# 1. Нажмите "Fork" на странице репозитория
# 2. Клонируйте свой форк
git clone https://github.com/YOUR-USERNAME/repo.git
# 3. Добавьте оригинальный репозиторий как upstream
git remote add upstream https://github.com/ORIGINAL-OWNER/repo.git
# 4. Синхронизация с оригинальным репозиторием
git fetch upstream
git checkout main
git merge upstream/main
# Просмотр изменений перед коммитом
git diff
# Отмена изменений в файле
git checkout -- filename.txt
# Отмена последнего коммита (с сохранением изменений)
git reset --soft HEAD~1
# Просмотр истории одного файла
git log -- filename.txt
Создайте свой первый Git-репозиторий и выполните следующие действия:
1. Инициализируйте новый Git-репозиторий в пустой папке
2. Создайте файл README.md с описанием проекта
3. Создайте файл index.html с базовой HTML-структурой
4. Добавьте оба файла в индекс
5. Создайте коммит с сообщением "Initial commit"
6. Сделайте скриншот результата команды git log
Загрузите скриншот в качестве ответа.
Попрактикуйтесь в работе с ветками Git:
1. Создайте новую ветку feature-header
2. Переключитесь на эту ветку
3. Создайте файл header.html с кодом шапки сайта
4. Сделайте коммит "Add header component"
5. Вернитесь на ветку main
6. Создайте ещё одну ветку feature-footer
7. Создайте файл footer.html с кодом подвала
8. Сделайте коммит "Add footer component"
9. Вернитесь на main и влейте обе ветки
10. Сделайте скриншот результата git log --graph --oneline --all
Загрузите скриншот с графом веток.
Жизнь полна потерь. Вот, даже страницу умудрились потерять...
Загрузка...