diff --git a/content/posts/informatics/python-pygames.mdx b/content/posts/informatics/python-pygames.mdx
new file mode 100644
index 0000000..2808909
--- /dev/null
+++ b/content/posts/informatics/python-pygames.mdx
@@ -0,0 +1,630 @@
+---
+title: Библиотека Pygame Python
+excerpt: Библиотека для разработки игр Pygame
+date: '2023-11-08'
+tags:
+ - Информатика
+ - Программирование
+ - Python
+ - Задачи
+ - Pygame
+---
+
+
+- [Урок 1](#урок-1)
+- [Урок 2](#урок-2)
+
+
+# Урок 1
+
+pygame - это библиотека модулей для языка Python, созданная для разработки 2D игр.
+
+Для того чтобы установить pygame на свой компьютер необходимо открыть командную строку или терминал и написать команду
+
+```python
+pip3 install pygame
+```
+После установки необходимо создать новый файл и импортировать модуль pygame и написать шаблон игры
+
+```python
+# Импортируем библиотеку pygame
+import pygame
+# Импортируем системную функцию exit
+from sys import exit
+
+# Инициализируем pygame
+pygame.init()
+
+# Создаем окошко 800 пикселей шириной
+# и 600 пикселей высотой и записываем его
+# в переменную display.
+# Переменную display называют поверхностью.
+display = pygame.display.set_mode( (800, 600) )
+
+# Основной цикл игры
+while True:
+ # Ждем события (действия пользователя)
+ for event in pygame.event.get():
+ # Если нажали на крестик,
+ # то закрываем окно
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ # Обновляем поверхность игры
+ # на каждом шаге основного цикла игры
+ pygame.display.update()
+```
+
+Пользователь может взаимодействовать с нашей игрой. Каждое действие пользователя - это некоторое событие, которое мы можем обработать. Выражение pygame.event.get() - это список событий, произошедших в нашей игре.
+
+Цикл for просто перебирает необработанные события. Каждое событие он присваивает переменной event (можно написать любую другую).
+
+Поговорим о цикле while, основном цикле игры. Как часто он выполняется? Очень и очень часто, это зависит от мощности компьютера. Для обновления экрана в играх часто используют 60 кадров в секунду.
+
+Ограничим количество выполнений цикла.
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+display = pygame.display.set_mode( (800, 600) )
+
+FPS = 60 # Создаем переменную FPS
+clock = pg.time.Clock() # Создаем счетчик для FPS
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ pygame.display.update()
+
+ clock.tick(FPS) # Замедляем цикл до 60 выполнений в секунду
+```
+Методу tick() передается желаемое количество кадров в секунду. Задержку он вычисляет сам. На каждой итерации основного цикла игры секунда делится на 60 и на вычисленную величину выполняется задержка.
+
+Рисование фигур
+В библиотеке pygame существует множество функций для рисования различных фигур.
+
+Функция polygon() рисует произвольную фигуру. Она принимает 3 обязательных параметра (поверхность, цвет и кортеж координат) и 1 необязательный (толщину линий).
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+display = pygame.display.set_mode( (800, 600) )
+
+# Рисуем полигон (да, получится квадратик)
+pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) )
+
+FPS = 60
+clock = pg.time.Clock()
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+display - наша поверхность
+
+(255, 0, 0) - красный цвет, почитайте про rgb
+
+( (0, 0), (100, 0), (100, 100), (0, 100) ) - координаты вершин квадрата. Возьмите листочек и нарисуйте его координатах (замените сотню на единицу).
+
+Давайте нарисуем треугольник
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+display = pygame.display.set_mode( (800, 600) )
+
+# Рисуем квадратик
+pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) )
+# Рисуем синий треугольник
+pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) )
+
+FPS = 60 # Создаем переменную FPS
+clock = pg.time.Clock()
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+
+display - поверхность
+```
+(0, 0, 255) - синий цвет
+
+((100, 100), (200, 200), (100, 200)) - координаты вершин нашего треугольник.
+
+Самостоятельно нарисуйте пятиугольник (вам помогут карандаш и лист бумаги)
+Рисование окружностей
+Чтобы нарисовать окружность нужно вызвать метод circle из модуля draw. Команда выглядит так: pygame.draw.circle(display, color, position, radius).
+
+display - поверхность, на которой рисуем
+
+color - цвет, записанный в кортеже из трех чисел. (еще раз про rgb)
+
+position - координаты точки центра окружности (кортеж из двух чисел (x, y))
+
+radius - радиус окружности в пикселях
+
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+display = pygame.display.set_mode( (800, 600) )
+
+# Рисуем квадратик
+pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) )
+# Рисуем синию линию
+pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) )
+# Рисуем желтую окружность с радиусом 100 пикселей
+pygame.draw.circle( display, (255, 255, 0) , (400,200), 100)
+
+FPS = 60
+clock = pg.time.Clock()
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+display - наша поверхнотсть для рисования
+
+(255, 255, 0) - желтый цвет
+
+(400, 200) - координаты точки центра (в нашем случае 400 пикселей от верхнего левого угла по горизонтали и 200 пикселей по вертикали)
+
+100 - радиус нашей окружности в пикселях
+
+Объявления переменных для цветов
+Для нашего с вами удобства давайте объявим несколько переменных, в которые сохраним используемые нами цвета
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+WHITE = (255, 255, 255)
+BLACK = (0, 0, 0)
+PURPLE = (156, 39, 176)
+INDIGO = (63, 81, 181)
+BLUE = (33, 150, 243)
+GREEN = (76, 175, 80)
+YELLOW = (255, 235, 59)
+ORANGE = (255, 152, 0)
+GREY = (158, 158, 158)
+
+display = pygame.display.set_mode( (800, 600) )
+
+# Рисуем квадратик
+pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) )
+# Рисуем синию линию
+pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) )
+# Рисуем желтую окружность с радиусом 100 пикселей
+pygame.draw.circle( display, (255, 255, 0) , (400,200), 100)
+
+FPS = 60
+clock = pg.time.Clock()
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+Рисование прямоугольников
+Для отрисовки прямоугольников можно использовать метод rect.
+
+pygame.draw.rect(display, color, (x, y, width, height) )
+
+color - цвет (теперь можно просто написать имя переменную)
+
+(x, y, width, height) - кортеж из четырех значений. Первые два значения - это координаты верхнего левого угла прямоугольника, а два последних - это ширина и высота.
+
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+WHITE = (255, 255, 255)
+BLACK = (0, 0, 0)
+PURPLE = (156, 39, 176)
+INDIGO = (63, 81, 181)
+BLUE = (33, 150, 243)
+GREEN = (76, 175, 80)
+YELLOW = (255, 235, 59)
+ORANGE = (255, 152, 0)
+GREY = (158, 158, 158)
+
+display = pygame.display.set_mode( (800, 600) )
+
+# Рисуем квадратик
+pygame.draw.polygon( display, (255, 0, 0) , ( (0, 0), (100, 0), (100, 100), (0, 100) ) )
+# Рисуем синию линию
+pygame.draw.polygon( display, (0, 0, 255) , ( (100, 100), (200, 200), (100, 200) ) )
+# Рисуем желтую окружность с радиусом 100 пикселей
+pygame.draw.circle( display, (255, 255, 0) , (400,200), 100)
+# Рисуем фиолетовый прямоугольник 200х300
+pygame.draw.rect( display, PURPLE , (600, 300, 200, 300))
+
+FPS = 60
+clock = pg.time.Clock()
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+Если ваша творческая натура требует большего, то вот ссылка на документацию модулю draw
+
+Там можно найти рисование линий, дуг, эллипсов.
+
+Большой пример запусти его на компьтере:
+
+```python
+import pygame
+from sys import exit
+from random import randint
+# Функция, возвращающая случайный оттенок зеленого цвета
+def randomGreen():
+ return randint(0, 100), randint(100, 255), randint(0,100)
+# Функция, возвращающая случайный оттенок красного цвета
+def randomRed():
+ return randint(100, 255), randint(0, 100), randint(0,100)
+
+pygame.init()
+display = pygame.display.set_mode( (600, 600) )
+display.fill((255,255,255))
+x = 100 # начальная позиция по оси X
+y = 100 # начальная позиция по оси Y
+while y < 500: # Пока мы не достигли точки с координатой y == 500
+ # Вложенный цикл для рисования линии из квадратиков
+ while x < 500: # Пока мы не достигли точки с координатой x == 500
+ # Рисуем квадратик с координатами x, y
+ pygame.draw.rect(display, randomGreen(), (x, y, 25, 25))
+ x += 25 # Смещаем позицию квадратика по оси X
+ # По завершению вложенного цикла увеличиваем переменную y
+ # для перехода на новую строчку
+ y += 25
+ x = 100 # Возвращаем позицию по оси X в начало строчки
+# Рисуем "мордочку" крипера
+pygame.draw.rect(display, (0,0,0), (150, 200, 100, 100))
+pygame.draw.rect(display, (0,0,0), (350, 200, 100, 100))
+pygame.draw.rect(display, (0,0,0), (250, 300, 100, 100))
+pygame.draw.rect(display, (0,0,0), (200, 350, 50, 100))
+pygame.draw.rect(display, (0,0,0), (350, 350, 50, 100))
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+ pygame.display.update()
+```
+
+Задания:
+
+1.Нарисуйте дерево из minecraft, используя полученные знания
+
+2.Нарисуйте оранжевую, красную, синию и фиолетовую звезды
+
+
+- [Урок 1](#урок-1)
+- [Урок 2](#урок-2)
+
+
+# Урок №2
+
+Обработка нажатий клавиш клавиатуры
+
+Создадим базовый шаблон для нашей игры
+
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+WHITE = (255, 255, 255)
+BLACK = (0, 0, 0)
+PURPLE = (156, 39, 176)
+INDIGO = (63, 81, 181)
+BLUE = (33, 150, 243)
+GREEN = (76, 175, 80)
+YELLOW = (255, 235, 59)
+ORANGE = (255, 152, 0)
+GREY = (158, 158, 158)
+
+display = pygame.display.set_mode( (800, 600) )
+
+FPS = 60
+clock = pygame.time.Clock()
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+pygame отслеживает все происходящие в игре события и позволяет нам их обрабатывать. При возникновении события создается экземпляр класса Event. Каждый экземпляр этого класса имеет определенный список свойств. Одно из этих свойств - это свойство type. Именно оно позволяет нам понять, какое событие произошло.
+
+События клавиатуры имеют тип KEYDOWN.
+
+Еще одно важное свойство - это свойство key. Для нас оно представляет интерес, когда мы обнаружили событие с типом KEYDOWN. С помощью свойства key мы можем узнать, какая клавиша была нажата.
+
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+WHITE = (255, 255, 255)
+BLACK = (0, 0, 0)
+PURPLE = (156, 39, 176)
+INDIGO = (63, 81, 181)
+BLUE = (33, 150, 243)
+GREEN = (76, 175, 80)
+YELLOW = (255, 235, 59)
+ORANGE = (255, 152, 0)
+GREY = (158, 158, 158)
+
+display = pygame.display.set_mode( (800, 600) )
+
+FPS = 60
+clock = pygame.time.Clock()
+while True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+ elif event.type == pygame.KEYDOWN:
+ if event.key == pygame.K_LEFT:
+ print('Левая стрелка')
+ elif event.key == pygame.K_RIGHT:
+ print('Правая стрелка')
+ elif event.key ==pygame.K_UP:
+ print('Стрелка вверх')
+ elif event.key ==pygame.K_DOWN:
+ print('Стрелка вниз')
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+После запуска скрипта при нажатии стрелок на клавиатуре в стандартный вывод будут выводится строки с информацией о нажатой клавише.
+
+Напишем код, который будет рисовать кружок
+```python
+pygame.draw.circle(display, BLUE, (400, 300), 5)
+# Добавьте этот скрипт после цикла while
+```
+Заставим кружок двигаться. Нужно объявить две переменные - x и y. Эти переменные будут координатами нашего кружка. При нажатии клавиши мы будем изменять эти переменные. Если нажата стрелка вправо, увеличим переменную x на 10. Если - стрелка влево, уменьшим переменную x на 10. Проделаем то же самое с переменной y.
+```python
+import pygame
+from sys import exit
+
+pygame.init()
+
+WHITE = (255, 255, 255)
+BLACK = (0, 0, 0)
+PURPLE = (156, 39, 176)
+INDIGO = (63, 81, 181)
+BLUE = (33, 150, 243)
+GREEN = (76, 175, 80)
+YELLOW = (255, 235, 59)
+ORANGE = (255, 152, 0)
+GREY = (158, 158, 158)
+
+display = pygame.display.set_mode( (800, 600) )
+
+FPS = 60
+clock = pygame.time.Clock()
+
+x = 400 # начальная координата по оси X
+y = 300 # начальная координата по оси Y
+
+while True:
+ # Рисуем кружок в точке с координатами x,y
+ pygame.draw.circle(display, BLUE, (x, y), 5)
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+ elif event.type == pygame.KEYDOWN:
+ if event.key == pygame.K_LEFT:
+ print('Левая стрелка')
+ x -= 10
+ elif event.key == pygame.K_RIGHT:
+ print('Правая стрелка')
+ x += 10
+ elif event.key == pygame.K_UP:
+ print('Стрелка вверх')
+ y -= 10
+ elif event.key == pygame.K_DOWN:
+ print('Стрелка вниз')
+ y += 10
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+Есть один нюанс. Шарик перемещается только один раз при зажатии одной из клавиш. Немного изменим наш код для того, чтобы он обратывал зажатые клавиш.
+
+```python
+# ... Код выше без изменений
+while True:
+ pygame.draw.circle(display, BLUE, (x, y), 5)
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+ # Найдите 10 отличий
+ # Удаляем elif с KEYDOWN
+ keys = pygame.key.get_pressed() # Словарь всех нажатых клавиш
+ # Обрабатываем каждую клавишу по отдельности
+ if keys[pygame.K_LEFT]:
+ x -= 10
+ if keys[pygame.K_RIGHT]:
+ x += 10
+ if keys[pygame.K_UP]:
+ y -= 10
+ if keys[pygame.K_DOWN]:
+ y += 10
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+События мыши
+В pygame обрабатываются три типа событий мыши: нажатие кнопки (значение свойства type события соответствует MOUSEBUTTONDOWN), отпускание кнопки (MOUSEBUTTONUP), перемещение мыши (MOUSEMOTION). Какая именно кнопка была нажата, записывается в другое свойство события - button. Для левой кнопки это число 1, для средней - 2, для правой - 3, для прокручивания вперед - 4, для прокручивания назад - 5.
+
+Другим атрибутом мышиных типов событий является свойство pos, в которое записываются координаты нажатия (кортеж из двух чисел).
+
+При нажатии левой кнопки мыши будем рисовать оранжевый кружок
+```python
+# Код выше без изменений...
+while True:
+ display.fill(BLACK)
+ pygame.draw.circle(display, BLUE, (x, y), 5)
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+ elif event.type == pygame.MOUSEBUTTONDOWN:
+ if event.button == 1:
+ pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30)
+ keys = pygame.key.get_pressed()
+ if keys[pygame.K_LEFT]:
+ print('Левая стрелка')
+ x -= 10
+ if keys[pygame.K_RIGHT]:
+ print('Правая стрелка')
+ x += 10
+ if keys[pygame.K_UP]:
+ print('Стрелка вверх')
+ y -= 10
+ if keys[pygame.K_DOWN]:
+ print('Стрелка вниз')
+ y += 10
+
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+Добавим появление белых кружков по нажатию правой кнопки мыши.
+```python
+# Код выше без изменений...
+while True:
+ display.fill(BLACK)
+ pygame.draw.circle(display, BLUE, (x, y), 5)
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+ elif event.type == pygame.MOUSEBUTTONDOWN:
+ if event.button == 1:
+ pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30)
+ elif event.button == 3:
+ pygame.draw.circle(display, WHITE, (event.pos[0], event.pos[1]), 30)
+ keys = pygame.key.get_pressed()
+ if keys[pygame.K_LEFT]:
+ print('Левая стрелка')
+ x -= 10
+ if keys[pygame.K_RIGHT]:
+ print('Правая стрелка')
+ x += 10
+ if keys[pygame.K_UP]:
+ print('Стрелка вверх')
+ y -= 10
+ if keys[pygame.K_DOWN]:
+ print('Стрелка вниз')
+ y += 10
+
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+Добавим очищение поверхности при скролле колесика мыши
+
+```python
+# Код выше без изменений...
+while True:
+ display.fill(BLACK)
+ pygame.draw.circle(display, BLUE, (x, y), 5)
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ exit()
+ elif event.type == pygame.MOUSEBUTTONDOWN:
+ if event.button == 1:
+ pygame.draw.circle(display, ORANGE, (event.pos[0], event.pos[1]), 30)
+ elif event.button == 3:
+ pygame.draw.circle(display, WHITE, (event.pos[0], event.pos[1]), 30)
+ elif event.button == 5:
+ display.fill(BLACK)
+ keys = pygame.key.get_pressed()
+ if keys[pygame.K_LEFT]:
+ print('Левая стрелка')
+ x -= 10
+ if keys[pygame.K_RIGHT]:
+ print('Правая стрелка')
+ x += 10
+ if keys[pygame.K_UP]:
+ print('Стрелка вверх')
+ y -= 10
+ if keys[pygame.K_DOWN]:
+ print('Стрелка вниз')
+ y += 10
+
+
+ pygame.display.update()
+
+ clock.tick(FPS)
+```
+
+Задание:
+Создайте еще один перемещающийся объект, назначьте клавиши WASD для его перемещения. Ключи клавиш: W == K_w, A == K_a, D == K_d, S == K_s. Обратите внимание, что вам понадобятся новые переменные для координат, например, x1 и y1.
+
+
+- [Урок 1](#урок-1)
+- [Урок 2](#урок-2)
+
\ No newline at end of file
diff --git a/content/posts/informatics/python-turtle.mdx b/content/posts/informatics/python-turtle.mdx
new file mode 100644
index 0000000..574fbd8
--- /dev/null
+++ b/content/posts/informatics/python-turtle.mdx
@@ -0,0 +1,307 @@
+---
+title: Библиотека Python Turtle
+excerpt: Графическая библиотека turtle
+date: '2023-11-08'
+tags:
+ - Информатика
+ - Программирование
+ - Python
+ - Turtle
+---
+
+
+
+- [Урок 1](#урок-1)
+- [Урок 2](#урок-2)
+
+
+
+# Урок 1
+
+Модуль turtle - это графическая библиотека для работы с 2D-графикой в Python. Сначала его нужно подключить к скрипту.
+
+```python
+import turtle
+```
+
+После этого необходимо создать "перо" и записать ссылку на него в переменную
+
+```python
+import turtle
+pen = turtle.Pen()
+turtle.exitonclick() #Выход при нажатии мышкой в окне Turtle
+```
+
+Команда forward() чертит прямую линию. Она принимает в качестве аргумента длину линии в пикселях.
+
+```python
+import turtle
+pen = turtle.Pen()
+
+pen.forward(100) # Прямая линия длиной в 100 пикселей
+```
+
+Команда left() и right() поворачивает курсор. Они принимают в качестве аргумента угол поворота.
+```python
+import turtle
+pen = turtle.Pen()
+
+pen.forward(200) # Прямая линия длиной в 200 пикселей
+pen.left(135) # Поворачиваем на 135 градусов влево
+
+pen.forward(200) # Прямая линия длиной в 200 пикселей
+pen.right(135) # Поворачиваем на 135 градусов вправо
+
+pen.forward(200) # Прямая линия длиной в 200 пикселей
+```
+
+Мы можем перемещать перо без начертания линий. Для этого нужно сначала поднять перо с помощью команды penup(), затем переместить его в нужную точку с помощью команды setpos(x, y), где x и y - это координаты точки, в которую мы перемещаем наше перо. После всех проделанных манипуляций необходимо опустить перо с помощью команды pendown().
+
+Подведем итог. Для того чтобы переместить перо в другую точку нужно:
+
+1. Поднять перо с помощью команды penup()
+
+2. Переместить перо в точку x, y (x и y - координаты в пикселях, вместо них подставляем числа) командой setpos(x, y)
+
+3. Опустить перо в нужно точке с помощью команды pendown()
+```python
+import turtle
+pen = turtle.Pen()
+
+# Первая линия
+pen.forward(200)
+pen.penup()
+pen.setpos(0, 20)
+pen.pendown()
+
+# Вторая линия
+pen.forward(200)
+pen.penup()
+pen.setpos(0, 40)
+pen.pendown()
+
+# Третья линия
+pen.forward(200)
+pen.penup()
+pen.setpos(0, 60)
+pen.pendown()
+```
+Код, приведенный выше рисует три параллельных линии друг над другом.
+
+С помощью команды color() мы можем изменить цвет линий
+
+В команду color() нужно передать цвет
+
+```python
+import turtle
+pen = turtle.Pen()
+pen.color('red')
+
+pen.forward(200)
+
+pen.penup()
+pen.setpos(0, 20)
+pen.pendown()
+
+pen.color('blue')
+
+pen.forward(200)
+```
+Экспериментируйте! Вот доступные цвета:
+* red
+* blue
+* green
+* yellow
+* orange
+* purple
+* pink
+* violet
+И еще много других цветов
+
+Задачи
+
+1. Нарисуйте квадрат
+
+2. Нарисуйте квадрат, у которого каждая сторона имеет свой цвет
+
+3. Нарисуйте треугольник
+
+4. Разноцветный треугольник
+
+5. Много-много параллельных линий
+
+6. Проявите фантазию, создайте свое неповторимое произведение
+
+# Урок 2
+
+Несколько полезных методов для изменения внешнего вида:
+
+Метод bgcolor получает в качестве аргумента строковую переменную и изменяет цвет фона окна
+
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold') # Цвет фона будет золотым
+```
+
+Метод width изменяет толщину пера. Он принимает в качестве аргумента целое число.
+
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5) # Толщина линий станет 5 пикселей
+```
+
+Методы pu и pd позволяют поднять и опустить перо. Они используются, когда нам нужно переместить перо с помощью метода setpos.
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.forward(100)
+p.pu() # Подняли перо
+p.setpos(-100, -100) # Переместили перо в точку с координатами (-100, -100)
+p.pd() # Опустили перо
+```
+
+Метод cirle рисует окружность. Он принимает в качестве аргумента целое число - радиус окружности в пикселях.
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+p.circle(100) # Окружность с радиусом 100 пикселей
+```
+
+Циклы и рисование фигур
+В прошлой статье мы рисовали квадрат с помощью последовательного перечисления операций. Это совсем неудобно. Есть способ сократить этот код. Для полного понимания прочтите статью про цикл for.
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+for i in range(4): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ПОСЛЕ
+ p.forward(100) # ДВОЕТОЧИЯ ИМЕЕТ ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА
+ p.left(90)
+```
+В примере, приведенном выше я использовал цикл for для повторения двух команд четыре раза. Давайте нарисуем пятиугольник. Я добавлю дополнительную переменную в наш код, в которой буду сохранять количество сторон
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+number_sides = 5 # Количество сторон
+for i in range(number_sides): # Повторяем 5 раз
+ p.forward(100)
+ p.left(360 / number_sides) # Делаем поворот черепашки на 72 градуса
+```
+Таким образом, мы можем нарисовать пятиугольник. Изменив всего одну переменную, получаем шестиугольник
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+number_sides = 6 # Поменяли на 6
+for i in range(number_sides):
+ p.forward(100)
+ p.left(360 / number_sides)
+```
+Поэкспериментируйте
+
+Вложенные циклы
+Мы можем выполнять один цикл в другом, например, нарисовать треугольник с тремя внешними треугольниками:
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+number_sides = 3 # Поменяли на 6
+for i in range(number_sides):
+ p.forward(100)
+ p.left(360 / number_sides)
+ for i in range(number_sides): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ИМЕЕТ
+ p.forward(50) # ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА
+ p.right(360 / number_sides)
+```
+Треугольник с квадратами:
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+number_sides = 3 # Поменяли на 6
+for i in range(number_sides):
+ p.forward(100)
+ p.right(360 / number_sides)
+ for i in range(4): # Меняем number_sides на 4
+ p.forward(50)
+ p.right(360 / 4) # Меняем number_sides на 4
+```
+Больше вложенных циклов!!!!
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+number_sides = 3 # Поменяли на 6
+for i in range(number_sides):
+ p.forward(100)
+ p.left(360 / number_sides)
+ for i in range(number_sides):
+ p.forward(50)
+ p.right(360 / number_sides)
+ for i in range(number_sides):
+ p.forward(20)
+ p.right(360 / number_sides)
+```
+Прием количества сторон от пользователя:
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+number_sides = int(input()) # Приняли число от пользователя
+for i in range(number_sides): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ПОСЛЕ
+ p.forward(100) # ДВОЕТОЧИЯ ИМЕЕТ ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА
+ p.left(360 / number_sides)
+```
+Задаем позиции для квадратиков:
+```python
+import turtle
+p = turtle.Pen()
+turtle.bgcolor('gold')
+p.width(5)
+p.color('dodgerblue')
+squares = int(input('Введите количество квадратиков: ')) # Приняли число от пользователя
+for i in range(squares): # Делаем цикл для рисования каждого квадрата
+ x = int(input('Введите координату х: '))
+ y = int(input('Введите координату y: '))
+ p.pu()
+ p.setpos(x,y)
+ p.pd()
+ for k in range(4): # ОБРАТИТЕ ВНИМАНИЕ, КОМАНДА НА СЛЕДУЮЩЕЙ СТРОЧКЕ ПОСЛЕ
+ p.forward(100) # ДВОЕТОЧИЯ ИМЕЕТ ОТСТУП В ЧЕТЫРЕ ПРОБЕЛА
+ p.left(90)
+```
+
+Задачи
+1. Напишите программу, которая принимает от пользователя длину стороны квадрата и рисует его
+
+2. Напишите программу, которая рисует 5 разноцветных треугольников в различных местах окна (использовать перенос пера с помощью pu, setpos, pd)
+
+3. Напишите программу, которая принимает от пользователя количество кругов для отрисовки и рисует эти круги в разных местах окна
+
+4. Напишите программу, которая принимает количество сторон многоугольника, длину стороны многоугольника и рисует его.
+
+5. Напишите программу, которая принимает количество сторон многоугольника, длину стороны многоугольника и его позицию и рисует его.
+
+6. Творческое задание: напишите две-три программы использующие максимальное количество полученной от статьи информации.
\ No newline at end of file
diff --git a/content/posts/textbook/python.mdx b/content/posts/textbook/python.mdx
index 2c2a08b..84d8c95 100644
--- a/content/posts/textbook/python.mdx
+++ b/content/posts/textbook/python.mdx
@@ -15,6 +15,11 @@ tags:
- [2. Операторы в Python](#2-операторы-в-python)
- [3. Условный оператор в Python](#3-условный-оператор-в-python)
- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
@@ -336,7 +341,11 @@ n школьников делят k яблок поровну, неделящи
- [2. Операторы в Python](#2-операторы-в-python)
- [3. Условный оператор в Python](#3-условный-оператор-в-python)
- [4. Цикл for в Python](#4-цикл-for-в-python)
-
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
@@ -697,6 +706,11 @@ print(not 1 == 0 or 2 == 0) # True, значение первого услови
- [2. Операторы в Python](#2-операторы-в-python)
- [3. Условный оператор в Python](#3-условный-оператор-в-python)
- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
@@ -986,9 +1000,13 @@ else:
- [2. Операторы в Python](#2-операторы-в-python)
- [3. Условный оператор в Python](#3-условный-оператор-в-python)
- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
-
## 4. Цикл for в Python
Цикл в любом языке программирования - это многократное выполнение одного и то же действия.
@@ -1192,11 +1210,28 @@ for x in range(10, 20, 3): # range(10, 20, 3) -> 10, 13, 16, 19
# Вывод:
>> 2.283
```
-Цикл while в Python
-Назад в начало
+
+
+
+- [1. Ввод и вывод данных в Python](#1-ввод-и-вывод-данных-в-python)
+- [2. Операторы в Python](#2-операторы-в-python)
+- [3. Условный оператор в Python](#3-условный-оператор-в-python)
+- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
+
+
+
+
+## 5. Цикл while в Python
+
Цикл while ("пока") позволяет выполнить одну и ту же последовательность действий, пока проверяемое условие истинно. Условие записывается после ключевого слова while и проверяется до выполнения тела цикла.
Цикл while используется, когда невозможно определить точное количество повторений цикла.
+
```python
i = 0 # объявление переменной i для условия цикла
while i < 5: # ключевое слово 'while' и условие выполнение цикла
@@ -1470,4 +1505,1292 @@ print(f'Наименьший делитель равен {div}')
>> 8
# Вывод:
>> 21
-```
\ No newline at end of file
+```
+
+
+
+- [1. Ввод и вывод данных в Python](#1-ввод-и-вывод-данных-в-python)
+- [2. Операторы в Python](#2-операторы-в-python)
+- [3. Условный оператор в Python](#3-условный-оператор-в-python)
+- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
+
+
+
+## 6. Списки в Python
+
+Список - это непрерывная динамическая коллекция элементов. Каждому элементу списка присваивается порядковый номер - его индекс. Первый индекс равен нулю, второй - единице и так далее. Основные операции для работы со списками - это индексирование, срезы, добавление и удаление элементов, а также проверка на наличие элемента в последовательности.
+
+Создание пустого списка выглядит так:
+```python
+empty_list = []
+```
+Создадим список, состоящий из нескольких чисел:
+```python
+numbers = [40, 20, 90, 11, 5]
+```
+Настало время строковых переменных:
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+```
+Не будем забывать и о дробях:
+```python
+fractions = [3.14, 2.72, 1.41, 1.73, 17.9]
+```
+Мы можем создать список, состоящий из различных типов данных:
+```python
+values = [3.14, 10, 'Hello world!', False, 'Python is the best']
+```
+И такое возможно (⊙_⊙)
+```python
+list_of_lists = [[2, 4, 0], [11, 2, 10], [0, 19, 27]]
+```
+Индексирование
+Что же такое индексирование? Это загадочное слово обозначает операцию обращения к элементу по его порядковому номеру ( ( ・ω・)ア напоминаю, что нумерация начинается с нуля). Проиллюстрируем это на примере:
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+print(fruits[0])
+print(fruits[1])
+print(fruits[4])
+```
+```python
+>>> Apple
+>>> Grape
+>>> Orange
+```
+Списки в Python являются изменяемым типом данных. Мы можем изменять содержимое каждой из ячеек:
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+fruits[0] = 'Watermelon'
+fruits[3] = 'Lemon'
+print(fruits)
+```
+```python
+>>> ['Watermelon', 'Grape', 'Peach', 'Lemon', 'Orange']
+```
+Индексирование работает и в обратную сторону. Как такое возможно? Всё просто, мы обращаемся к элементу списка по отрицательному индексу. Индекс с номером -1 дает нам доступ к последнему элементу, -2 к предпоследнему и так далее.
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+print(fruits[-1])
+print(fruits[-2])
+print(fruits[-3])
+print(fruits[-4])
+```
+```python
+>>> Orange
+>>> Banan
+>>> Peach
+>>> Grape
+```
+Создание списка с помощью list()
+Переходим к способам создания списка. Самый простой из них был приведен выше. Еще раз для закрепления:
+```python
+smiles = ['(ಠ_ಠ)', '( ̄﹃ ̄)', '( ͡° ͜ʖ ͡°)', '(╮°-°)╮']
+```
+А есть еще способы? Да, есть. Один из них — создание списка с помощью функции list() В неё мы можем передать любой итерируемый объект (да-да, тот самый по которому можно запустить цикл (• ᵕ •) )
+
+Рассмотрим несколько примеров:
+```python
+letters = list('abcdef')
+numbers = list(range(10))
+even_numbers = list(range(0, 10, 2))
+print(letters)
+print(numbers)
+print(even_numbers)
+```
+
+```python
+>>> ['a', 'b', 'c', 'd', 'e', 'f']
+>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+>>> [0, 2, 4, 6, 8]
+```
+Длина списка
+С созданием списка вроде разобрались. Следующий вопрос: как узнать длину списка? Можно, конечно, просто посчитать количество элементов... (⊙_⊙) Но есть способ получше! Функция len() возвращает длину любой итерируемой переменной, переменной, по которой можно запустить цикл. Рассмотрим пример:
+
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+print(len(fruits))
+```
+
+```python
+>>> 5
+```
+```python
+numbers = [40, 20, 90]
+print(len(numbers))
+```
+```python
+>>> 3
+```
+"...любой итерируемой", а это значит:
+```python
+string = 'Hello world'
+print(len(string))
+# 11
+```
+```python
+>>> 11
+```
+
+```python
+print(len(range(10)))
+```
+```python
+>>> 10
+```
+Срезы
+В начале статьи что-то говорилось о "срезах". Давайте разберем подробнее, что это такое. Срезом называется некоторая подпоследовательность. Принцип действия срезов очень прост: мы "отрезаем" кусок от исходной последовательности элемента, не меняя её при этом. Я сказал "последовательность", а не "список", потому что срезы работают и с другими итерируемыми типами данных, например, со строками.
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+part_of_fruits = fruits[0:3]
+print(part_of_fruits)
+```
+```python
+>>> ['Apple', 'Grape', 'Peach']
+```
+Детально рассмотрим синтаксис срезов:
+
+итерируемая_переменная[начальный_индекс:конечный_индекс - 1:длина_шага]
+
+Обращаю ваше внимание, что мы делаем срез от начального индекса до конечного индекса - 1. То есть i = начальный_индекс и i < конечный индекс
+
+Больше примеров!
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+print(fruits[0:1])
+# Если начальный индекс равен 0, то его можно опустить
+print(fruits[:2])
+print(fruits[:3])
+print(fruits[:4])
+print(fruits[:5])
+# Если конечный индекс равен длине списка, то его тоже можно опустить
+print(fruits[:len(fruits)])
+print(fruits[::])
+```
+```python
+>>> ['Apple']
+>>> ['Apple', 'Grape']
+>>> ['Apple', 'Grape', 'Peach']
+>>> ['Apple', 'Grape', 'Peach', 'Banan']
+>>> ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+>>> ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+>>> ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+```
+Самое время понять, что делает третий параметр среза - длина шага!
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+print(fruits[::2])
+print(fruits[::3])
+# Длина шага тоже может быть отрицательной!
+print(fruits[::-1])
+print(fruits[4:2:-1])
+print(fruits[3:1:-1])
+```
+```python
+>>> ['Apple', 'Peach', 'Orange']
+>>> ['Apple', 'Banan']
+>>> ['Orange', 'Banan', 'Peach', 'Grape', 'Apple']
+>>> ['Orange', 'Banan']
+>>> ['Banan', 'Peach']
+```
+А теперь вспоминаем всё, что мы знаем о циклах. В Python их целых два! Цикл for и цикл while Нас интересует цикл for, с его помощью мы можем перебирать значения и индексы наших последовательностей. Начнем с перебора значений:
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+for fruit in fruits:
+ print(fruit, end=' ')
+```
+```python
+>>> Apple Grape Peach Banan Orange
+```
+Выглядит несложно, правда? В переменную fruit объявленную в цикле по очереди записываются значения всех элементов списка fruits
+
+А что там с перебором индексов?
+```python
+for index in range(len(fruits)):
+ print(fruits[index], end=' ')
+```
+Этот пример гораздо интереснее предыдущего! Что же здесь происходит? Для начала разберемся, что делает функция range(len(fruits))
+
+Мы с вами знаем, что функция len() возвращает длину списка, а range() генерирует диапазон целых чисел от 0 до len()-1.
+
+Сложив 2+2, мы получим, что переменная index принимает значения в диапазоне от 0 до len()-1. Идем дальше, fruits[index] - это обращение по индексу к элементу с индексом index списка fruits. А так как переменная index принимает значения всех индексов списка fruits, то в цикле мы переберем значения всех элементов нашего списка!
+
+Операция in
+С помощью in мы можем проверить наличие элемента в списке, строке и любой другой итерируемой переменной.
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+if 'Apple' in fruits:
+ print('В списке есть элемент Apple')
+```
+```python
+>>> В списке есть элемент Apple
+```
+```python
+fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+if 'Lemon' in fruits:
+ print('В списке есть элемент Lemon')
+else:'
+ print('В списке НЕТ элемента Lemon')
+```
+```python
+>>> В списке НЕТ элемента Lemon
+```
+Приведу более сложный пример:
+```python
+all_fruits = ['Apple', 'Grape', 'Peach', 'Banan', 'Orange']
+my_favorite_fruits = ['Apple', 'Banan', 'Orange']
+for item in all_fruits:
+ if item in my_favorite_fruits:
+ print(item + ' is my favorite fruit')
+ else:
+ print('I do not like ' + item)
+
+>>> Apple is my favorite fruit
+>>> I do not like Grape
+>>> I do not like Peach
+>>> Banan is my favorite fruit
+>>> Orange is my favorite fruit
+```
+Методы для работы со списками
+Начнем с метода append(), который добавляет элемент в конец списка:
+```python
+# Создаем список, состоящий из четных чисел от 0 до 8 включительно
+numbers = list(range(0,10,2))
+# Добавляем число 200 в конец списка
+numbers.append(200)
+numbers.append(1)
+numbers.append(2)
+numbers.append(3)
+print(numbers)
+```
+```python
+>>> [0, 2, 4, 6, 8, 200, 1, 2, 3]
+```
+Мы можем передавать методу append() абсолютно любые значения:
+```python
+all_types = [10, 3.14, 'Python', ['I', 'am', 'list']]
+all_types.append(1024)
+all_types.append('Hello world!')
+all_types.append([1, 2, 3])
+print(all_types)
+```
+```python
+>>> [10, 3.14, 'Python', ['I', 'am', 'list'], 1024, 'Hello world!', [1, 2, 3]]
+```
+Метод append() отлично выполняет свою функцию. Но, что делать, если нам нужно добавить элемент в середину списка? Это умеет метод insert(). Он добавляет элемент в список на произвольную позицию. insert() принимает в качестве первого аргумента позицию, на которую нужно вставить элемент, а вторым — сам элемент.
+```python
+# Создадим список чисел от 0 до 9
+numbers = list(range(10))
+# Добавление элемента 999 на позицию с индексом 0
+numbers.insert(0, 999)
+print(numbers) # первый print
+numbers.insert(2, 1024)
+print(numbers) # второй print
+numbers.insert(5, 'Засланная строка-шпион')
+print(numbers) # третий print
+```
+```python
+>>> [999, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # первый print
+>>> [999, 0, 1024, 1, 2, 3, 4, 5, 6, 7, 8, 9] # второй print
+>>> [999, 0, 1024, 1, 2, 'Засланная строка-шпион', 3, 4, 5, 6, 7, 8, 9] # третий print
+```
+Отлично! Добавлять элементы в список мы научились, осталось понять, как их из него удалять. Метод pop() удаляет элемент из списка по его индексу:
+```python
+numbers = list(range(10))
+print(numbers) # 1
+# Удаляем первый элемент
+numbers.pop(0)
+print(numbers) # 2
+numbers.pop(0)
+print(numbers) # 3
+numbers.pop(2)
+print(numbers) # 4
+# Чтобы удалить последний элемент, вызовем метод pop без аргументов
+numbers.pop()
+print(numbers) # 5
+numbers.pop()
+print(numbers) # 6
+```
+```python
+>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 1
+>>> [1, 2, 3, 4, 5, 6, 7, 8, 9] # 2
+>>> [2, 3, 4, 5, 6, 7, 8, 9] # 3
+>>> [2, 3, 5, 6, 7, 8, 9] # 4
+>>> [2, 3, 5, 6, 7, 8] # 5
+>>> [2, 3, 5, 6, 7] # 6
+```
+Теперь мы знаем, как удалять элемент из списка по его индексу. Но что, если мы не знаем индекса элемента, но знаем его значение? Для такого случая у нас есть метод remove(), который удаляет первый найденный по значению элемент в списке.
+```python
+all_types = [10, 'Python', 10, 3.14, 'Python', ['I', 'am', 'list']]
+all_types.remove(3.14)
+print(all_types) # 1
+all_types.remove(10)
+print(all_types) # 2
+all_types.remove('Python')
+print(all_types) # 3
+```
+```python
+>>> [10, 'Python', 10, 'Python', ['I', 'am', 'list']] # 1
+>>> ['Python', 10, 'Python', ['I', 'am', 'list']] # 2
+>>> [10, 'Python', ['I', 'am', 'list']] # 3
+```
+А сейчас немного посчитаем, посчитаем элементы списка с помощью метода count()
+```python
+numbers = [100, 100, 100, 200, 200, 500, 500, 500, 500, 500, 999]
+print(numbers.count(100)) # 1
+print(numbers.count(200)) # 2
+print(numbers.count(500)) # 3
+print(numbers.count(999)) # 4
+```
+```python
+>>> 3 # 1
+>>> 2 # 2
+>>> 5 # 3
+>>> 1 # 4
+```
+В программировании, как и в жизни, проще работать с упорядоченными данными, в них легче ориентироваться и что-либо искать. Метод sort() сортирует список по возрастанию значений его элементов.
+```python
+numbers = [100, 2, 11, 9, 3, 1024, 567, 78]
+numbers.sort()
+print(numbers) # 1
+fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
+fruits.sort()
+print(fruits) # 2
+```
+```python
+>>> [2, 3, 9, 11, 78, 100, 567, 1024] # 1
+>>> ['Apple', 'Banan', 'Grape', 'Orange', 'Peach'] # 2
+```
+Мы можем изменять порядок сортировки с помощью параметра reverse. По умолчанию этот параметр равен False
+```python
+fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
+fruits.sort()
+print(fruits) # 1
+fruits.sort(reverse=True)
+print(fruits) # 2
+```
+```python
+>>> ['Apple', 'Banan', 'Grape', 'Orange', 'Peach'] # 1
+>>> ['Peach', 'Orange', 'Grape', 'Banan', 'Apple'] # 2
+```
+Иногда нам нужно перевернуть список, не спрашивайте меня зачем... Для этого в самом лучшем языке программирования на этой планете JavaScr..Python есть метод reverse():
+```python
+numbers = [100, 2, 11, 9, 3, 1024, 567, 78]
+numbers.reverse()
+print(numbers) # 1
+fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
+fruits.reverse()
+print(fruits) # 2
+```
+```python
+>>> [78, 567, 1024, 3, 9, 11, 2, 100] # 1
+>>> ['Apple', 'Banan', 'Peach', 'Grape', 'Orange'] # 2
+```
+Допустим, у нас есть два списка и нам нужно их объединить. Программисты на C++ cразу же кинулись писать циклы for, но мы пишем на python, а в python у списков есть полезный метод extend(). Этот метод вызывается для одного списка, а в качестве аргумента ему передается другой список, extend() записывает в конец первого из них начало второго:
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+vegetables = ['Tomato', 'Cucumber', 'Potato', 'Carrot']
+fruits.extend(vegetables)
+print(fruits)
+```
+```python
+>>> ['Banana', 'Apple', 'Grape', 'Tomato', 'Cucumber', 'Potato', 'Carrot']
+```
+В природе существует специальный метод для очистки списка — clear()
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+vegetables = ['Tomato', 'Cucumber', 'Potato', 'Carrot']
+fruits.clear()
+vegetables.clear()
+print(fruits)
+print(vegetables)
+```
+```python
+>>> []
+>>> []
+```
+Осталось совсем чуть-чуть всего лишь пара методов, так что делаем последний рывок! Метод index() возвращает индекс элемента. Работает это так: вы передаете в качестве аргумента в index() значение элемента, а метод возвращает его индекс:
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+print(fruits.index('Apple'))
+print(fruits.index('Banana'))
+print(fruits.index('Grape'))
+```
+```python
+>>> 1
+>>> 0
+>>> 2
+```
+Финишная прямая! Метод copy(), только не падайте, копирует список и возвращает его брата-близнеца. Вообще, копирование списков - это тема достаточно интересная, давайте рассмотрим её по-подробнее.
+
+Во-первых, если мы просто присвоим уже существующий список новой переменной, то на первый взгляд всё выглядит неплохо:
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+new_fruits = fruits
+print(fruits)
+print(new_fruits)
+```
+```python
+>>> ['Banana', 'Apple', 'Grape']
+>>> ['Banana', 'Apple', 'Grape']
+```
+Но есть одно маленькое "НО":
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+new_fruits = fruits
+fruits.pop()
+print(fruits)
+print(new_fruits)
+```
+```python
+# Внезапно, из списка new_fruits исчез последний элемент
+>>> ['Banana', 'Apple']
+>>> ['Banana', 'Apple']
+```
+При прямом присваивании списков копирования не происходит. Обе переменные начинают ссылаться на один и тот же список! То есть если мы изменим один из них, то изменится и другой. Что же тогда делать? Пользоваться методом copy(), конечно:
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+new_fruits = fruits.copy()
+fruits.pop()
+print(fruits)
+print(new_fruits)
+```
+
+```python
+>>> ['Banana', 'Apple']
+>>> ['Banana', 'Apple', 'Grape']
+```
+Отлично! Но что если у нас список в списке? Скопируется ли внутренний список с помощью метода copy() — нет:
+```python
+fruits = ['Banana', 'Apple', 'Grape', ['Orange','Peach']]
+new_fruits = fruits.copy()
+fruits[-1].pop()
+print(fruits) # 1
+print(new_fruits) # 2
+```
+
+```python
+>>> ['Banana', 'Apple', 'Grape', ['Orange']] # 1
+>>> ['Banana', 'Apple', 'Grape', ['Orange']] # 2
+```
+Решение задач
+1. Создайте список из 10 четных чисел и выведите его с помощью цикла for
+
+2. Создайте список из 5 элементов. Сделайте срез от второго индекса до четвертого
+
+3. Создайте пустой список и добавьте в него 10 случайных чисел и выведите их. В данной задаче нужно использовать функцию randint.
+
+```python
+from random import randint
+n = randint(1, 10) # Случайное число от 1 до 10
+```
+
+4.Удалите все элементы из списка, созданного в задании 3
+
+5.Создайте список из введенной пользователем строки и удалите из него символы 'a', 'e', 'o'
+
+6.Даны два списка, удалите все элементы первого списка из второго
+
+```python
+a = [1, 3, 4, 5]
+b = [4, 5, 6, 7]
+# Вывод
+>>> [6, 7]
+```
+
+7.Создайте список из случайных чисел и найдите наибольший элемент в нем.
+
+8.Найдите наименьший элемент в списке из задания 7
+
+9.Найдите сумму элементов списка из задания 7
+
+10.Найдите среднее арифметическое элементов списка из задания 7
+
+Сложные задачи
+1.Создайте список из случайных чисел. Найдите номер его последнего локального максимума (локальный максимум — это элемент, который больше любого из своих соседей).
+
+2.Создайте список из случайных чисел. Найдите максимальное количество его одинаковых элементов.
+
+3.Создайте список из случайных чисел. Найдите второй максимум.
+
+```python
+a = [1, 2, 3] # Первый максимум == 3, второй == 2
+```
+4.Создайте список из случайных чисел. Найдите количество различных элементов в нем.
+
+
+
+- [1. Ввод и вывод данных в Python](#1-ввод-и-вывод-данных-в-python)
+- [2. Операторы в Python](#2-операторы-в-python)
+- [3. Условный оператор в Python](#3-условный-оператор-в-python)
+- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
+
+
+
+## 7. Методы работы со списками в Python
+
+Список - это изменяемый и последовательный тип данных. Это значит, что мы можем добавлять, удалять и изменять любые элементы списка.
+
+Начнем с метода append(), который добавляет элемент в конец списка:
+
+```python
+# Создаем список, состоящий из четных чисел от 0 до 8 включительно
+numbers = list(range(0,10,2))
+# Добавляем число 200 в конец списка
+numbers.append(200)
+print(numbers)
+# [0, 2, 4, 6, 8, 200]
+numbers.append(1)
+numbers.append(2)
+numbers.append(3)
+print(numbers)
+# [0, 2, 4, 6, 8, 200, 1, 2, 3]
+```
+
+Мы можем передавать методу append() абсолютно любые значения:
+
+```python
+all_types = [10, 3.14, 'Python', ['I', 'am', 'list']]
+all_types.append(1024)
+all_types.append('Hello world!')
+all_types.append([1, 2, 3])
+print(all_types)
+# [10, 3.14, 'Python', ['I', 'am', 'list'], 1024, 'Hello world!', [1, 2, 3]]
+```
+Метод append() отлично выполняет свою функцию. Но, что делать, если нам нужно добавить элемент в середину списка? Это умеет метод insert(). Он добавляет элемент в список на произвольную позицию. insert() принимает в качестве первого аргумента позицию, на которую нужно вставить элемент, а вторым — сам элемент.
+```python
+# Создадим список чисел от 0 до 9
+numbers = list(range(10))
+# Добавление элемента 999 на позицию с индексом 0
+numbers.insert(0, 999)
+print(numbers)
+# [999, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+numbers.insert(2, 1024)
+print(numbers)
+# [999, 0, 1024, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+numbers.insert(5, 'Засланная строка-шпион')
+print(numbers)
+# [999, 0, 1024, 1, 2, 'Засланная строка-шпион', 3, 4, 5, 6, 7, 8, 9]
+```
+
+Отлично! Добавлять элементы в список мы научились, осталось понять, как их из него удалять. Метод pop() удаляет элемент из списка по его индексу:
+
+```python
+numbers = list(range(10))
+print(numbers)
+# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+# Удаляем первый элемент
+numbers.pop(0)
+print(numbers)
+# [1, 2, 3, 4, 5, 6, 7, 8, 9]
+numbers.pop(0)
+print(numbers)
+# [2, 3, 4, 5, 6, 7, 8, 9]
+numbers.pop(2)
+print(numbers)
+# [2, 3, 5, 6, 7, 8, 9]
+# Чтобы удалить последний элемент, вызовем метод pop без аргументов
+numbers.pop()
+print(numbers)
+# [2, 3, 5, 6, 7, 8]
+numbers.pop()
+print(numbers)
+# [2, 3, 5, 6, 7]
+```
+Теперь мы знаем, как удалять элемент из списка по его индексу. Но что, если мы не знаем индекса элемента, но знаем его значение? Для такого случая у нас есть метод remove(), который удаляет первый найденный по значению элемент в списке.
+
+```python
+all_types = [10, 'Python', 10, 3.14, 'Python', ['I', 'am', 'list']]
+all_types.remove(3.14)
+print(all_types)
+# [10, 'Python', 10, 'Python', ['I', 'am', 'list']]
+all_types.remove(10)
+print(all_types)
+# ['Python', 10, 'Python', ['I', 'am', 'list']]
+all_types.remove('Python')
+print(all_types) # [10, 'Python', ['I', 'am', 'list']]
+```
+А сейчас немного посчитаем, посчитаем элементы списка с помощью метода count()
+
+```python
+numbers = [100, 100, 100, 200, 200, 500, 500, 500, 500, 500, 999]
+print(numbers.count(100))
+# 3
+print(numbers.count(200))
+# 2
+print(numbers.count(500))
+# 5
+print(numbers.count(999))
+# 1
+```
+
+В программировании, как и в жизни, проще работать с упорядоченными данными, в них легче ориентироваться и что-либо искать. Метод sort() сортирует список по возрастанию значений его элементов.
+
+```python
+numbers = [100, 2, 11, 9, 3, 1024, 567, 78]
+numbers.sort()
+print(numbers)
+# [2, 3, 9, 11, 78, 100, 567, 1024]
+fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
+fruits.sort()
+print(fruits)
+# ['Apple', 'Banan', 'Grape', 'Orange', 'Peach']
+```
+
+Мы можем изменять порядок сортировки с помощью параметра reverse. По умолчанию этот параметр равен False
+
+```python
+fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
+fruits.sort()
+print(fruits)
+# ['Apple', 'Banan', 'Grape', 'Orange', 'Peach']
+fruits.sort(reverse=True)
+print(fruits)
+# ['Peach', 'Orange', 'Grape', 'Banan', 'Apple']
+```
+
+Иногда нам нужно перевернуть список, не спрашивайте меня зачем... Для этого в самом лучшем языке программирования на этой планете JavaScr..Python есть метод reverse():
+
+```python
+numbers = [100, 2, 11, 9, 3, 1024, 567, 78]
+numbers.reverse()
+print(numbers)
+# [78, 567, 1024, 3, 9, 11, 2, 100]
+fruits = ['Orange', 'Grape', 'Peach', 'Banan', 'Apple']
+fruits.reverse()
+print(fruits)
+# ['Apple', 'Banan', 'Peach', 'Grape', 'Orange']
+```
+Допустим, у нас есть два списка и нам нужно их объединить. Программисты на C++ cразу же кинулись писать циклы for, но мы пишем на python, а в python у списков есть полезный метод extend(). Этот метод вызывается для одного списка, а в качестве аргумента ему передается другой список, extend() записывает в конец первого из них начало второго:
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+vegetables = ['Tomato', 'Cucumber', 'Potato', 'Carrot']
+fruits.extend(vegetables)
+print(fruits)
+# ['Banana', 'Apple', 'Grape', 'Tomato', 'Cucumber', 'Potato', 'Carrot']
+```
+
+В природе существует специальный метод для очистки списка — clear()
+
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+vegetables = ['Tomato', 'Cucumber', 'Potato', 'Carrot']
+fruits.clear()
+vegetables.clear()
+print(fruits)
+# []
+print(vegetables)
+# []
+```
+
+Осталось совсем чуть-чуть всего лишь пара методов, так что делаем последний рывок! Метод index() возвращает индекс элемента. Работает это так: вы передаете в качестве аргумента в index() значение элемента, а метод возвращает его индекс:
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+print(fruits.index('Apple'))
+# 1
+print(fruits.index('Banana'))
+# 0
+print(fruits.index('Grape'))
+# 2
+```
+
+Финишная прямая! Метод copy(), только не падайте, копирует список и возвращает его брата-близнеца. Вообще, копирование списков - это тема достаточно интересная, давайте рассмотрим её по-подробнее.
+
+Во-первых, если мы просто присвоим уже существующий список новой переменной, то на первый взгляд всё выглядит неплохо:
+
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+new_fruits = fruits
+print(fruits)
+# ['Banana', 'Apple', 'Grape']
+print(new_fruits)
+# ['Banana', 'Apple', 'Grape']
+Но есть одно маленькое "НО":
+
+fruits = ['Banana', 'Apple', 'Grape']
+new_fruits = fruits
+fruits.pop()
+print(fruits)
+# ['Banana', 'Apple']
+print(new_fruits)
+# Внезапно, из списка new_fruits исчез последний элемент
+# ['Banana', 'Apple']
+```
+
+При прямом присваивании списков копирования не происходит. Обе переменные начинают ссылаться на один и тот же список! То есть если мы изменим один из них, то изменится и другой. Что же тогда делать? Пользоваться методом copy(), конечно:
+
+```python
+fruits = ['Banana', 'Apple', 'Grape']
+new_fruits = fruits.copy()
+fruits.pop()
+print(fruits)
+# ['Banana', 'Apple']
+print(new_fruits)
+# ['Banana', 'Apple', 'Grape']
+```
+
+Отлично! Но что если у нас список в списке? Скопируется ли внутренний список с помощью метода copy() — нет:
+
+```python
+fruits = ['Banana', 'Apple', 'Grape', ['Orange','Peach']]
+new_fruits = fruits.copy()
+fruits[-1].pop()
+print(fruits)
+# ['Banana', 'Apple', 'Grape', ['Orange']]
+print(new_fruits)
+# ['Banana', 'Apple', 'Grape', ['Orange']]
+```
+
+
+
+- [1. Ввод и вывод данных в Python](#1-ввод-и-вывод-данных-в-python)
+- [2. Операторы в Python](#2-операторы-в-python)
+- [3. Условный оператор в Python](#3-условный-оператор-в-python)
+- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
+
+
+
+## 8. Функции в Python
+
+Функция - это именованный блок кода, к которому можно обратиться из любого места программы. У функции есть имя и список входных параметров, а также возвращаемое значение.
+
+Функция позволяет использовать в программе один и тот же фрагмент кода несколько раз.
+
+Oбъявление функции в Python выглядит так:
+
+```python
+def function_name(argument1, argument2, ...):
+ # код функции
+# def - DEclare Function - "объявить функцию"
+# function_name - имя функции
+# (argument1, argument2, ...) - список аргументов, поступающих на вход функции при ее вызове
+# тело функции - это весь код, который идет после двоеточия
+```
+```python
+# Объявление функции
+
+def hello(name):
+ print('Hello, ' + name)
+
+# Вызовы функции
+
+hello('Max')
+hello('Ivan')
+hello('Alex')
+hello('Kate')
+```
+```python
+# Вывод
+
+>> Hello, Max
+>> Hello, Ivan
+>> Hello, Alex
+>> Hello, Kate
+```
+
+Оператор return возвращает значение из функции.
+
+Представьте себе обычный калькулятор. Вы вводите первое число, операцию и второе число. Калькулятор возвращает нам результат операции над этими числами. Всё просто, не так ли? Функции точно так же умеют возвращать значение с помощью специального оператора return.
+
+```python
+# Объявление функции
+
+def sum2(a, b):
+ return a + b
+
+# Вызовы функции
+
+s1 = sum2(10, 2)
+s2 = sum2(108, 100)
+s3 = sum2(3, 1)
+
+print(f's1 = {s1}')
+print(f's2 = {s2}')
+print(f's3 = {s3}')
+```
+```python
+>> s1 = 12
+>> s2 = 208
+>> s3 = 4
+```
+```python
+# Функция умножения двух чисел
+
+def mult2(a, b):
+ return a * b
+
+# Вызовем нашу функцию
+
+m1 = mult2(10, 2)
+m2 = mult2(108, 100)
+m3 = mult2(3, 1)
+
+print(f'm1 = {m1}')
+print(f'm2 = {m2}')
+print(f'm3 = {m3}')
+```
+```python
+>> m1 = 20
+>> m2 = 10800
+>> m3 = 3
+```
+Для параметров функции можно указывать значения по умолчанию. Это дает возможность вызывать функцию с меньшим числом параметров.
+```python
+# Аргумент name по умолчанию равен 'world'
+
+def hello(name='world'):
+ print('Hello, ' + name)
+
+hello()
+hello('Ivan')
+```
+```python
+>> Hello, world
+>> Hello, Ivan
+```
+
+Примеры
+1. Квадрат
+# Написать функцию square(), вычисляющую квадрат числа.
+
+def square(number):
+ return number * number # Возвращаем результат работы функции обратно в программу
+
+a = square(2)
+print(a)
+
+>> 4
+
+2. Периметр
+# Напишите функцию perimetr, вычисляющую периметр прямоугольника со сторонами a и b.
+```python
+def perimetr(a, b):
+ return 2 * (a + b)
+
+p = perimetr(4, 3)
+print(p)
+```
+```python
+>> 14
+```
+
+3. Четное число
+# Напишите функцию isEven, возвращающую True, если число четное, и False, если - нечетное.
+```python
+def isEven(x):
+ return x % 2 == 0
+
+print(isEven(10))
+print(isEven(11))
+```
+```python
+>> True
+>> False
+```
+4. Сумма списка
+
+```python
+# Напишите функцию amountList, которая возвращает сумму всех элементов списка.
+
+def amountList(lst):
+ amount = 0
+ for x in lst:
+ amount += x
+ return amount
+
+print(amountList([1, 2, 3]))
+
+mylist = [1, 2, 4, 8, 16]
+s = amountList(mylist)
+
+print(f'Сумма списка {mylist} равна {s}')
+```
+```python
+>> 6
+>> Сумма списка [1, 2, 4, 8, 16] равна 31
+```
+
+5. Фибоначчи
+```python
+# Напишите функцию fib, которая возвращает n-ное число Фибоначчи.
+# Последовательность Фибоначчи выглядит так: 1 1 2 3 5 8 13 21 34
+
+def fib(n):
+ a, b = 0, 1
+ if n == 0: return 0
+ for i in range(1, n):
+ a, b = b, a + b
+ return b
+
+print(fib(2))
+print(fib(3))
+print(fib(4))
+print(fib(5))
+print(fib(10))
+```
+```python
+>> 1
+>> 2
+>> 3
+>> 5
+>> 55
+```
+6. Факториал
+```python
+# Напишите функцию fact, вычисляющую значение факториала числа N.
+# Факториал числа - это произведение всех чисел от 1 до N.
+# Например, факториал числа 5 равен 120 (5! = 120).
+
+def fact(n):
+ result = 1
+ while n > 1:
+ result *= n
+ n -= 1
+ return result
+
+print(fact(2))
+print(fact(3))
+print(fact(4))
+print(fact(5))
+```
+```python
+>> 2
+>> 6
+>> 24
+>> 120
+```
+Решение задач
+1. Площадь круга
+Напишите функцию, которая получает в качестве аргумента радиус круга и находит его площадь.
+```python
+# Не забудьте написать функцию circle...
+
+print(circle(4))
+print(circle(1))
+```
+```python
+# Вывод:
+>> 50.24
+>> 3.14
+```
+
+2. На три
+Напишите функцию, которая возвращает True, если число делится на 3, и False, если - нет.
+```python
+# Не забудьте написать функцию three...
+
+print(three(4))
+print(three(3))
+```
+```python
+# Вывод:
+>> False
+>> True
+```
+3. Максимум в списке
+Напишите функцию, которая возвращает максимальный элемент из переданного в нее списка.
+```python
+# Напишите функцию maxList...
+mylist = [1, 3, 2]
+print(maxList(mylist))
+```
+```python
+# Вывод:
+>> 3
+```
+4. Сколько четных
+Напишите функцию, которая возвращает количество четных элементов в списке.
+```python
+# Напишите функцию evenCounter...
+mylist = [1, 10, 2, 4, 6]
+evens = evenCounter(mylist)
+print(even)
+```
+```python
+# Вывод:
+>> 4
+```
+5. Уникальные
+Напишите функцию, которая возвращает список с уникальными (неповторяющихся) элементам.
+```python
+# Напишите функцию unique...
+mylist = [1, 1, 2, 1, 3, 2, 3]
+print(unique(mylist))
+```
+```python
+# Вывод:
+>> [1, 2, 3]
+```
+
+
+
+- [1. Ввод и вывод данных в Python](#1-ввод-и-вывод-данных-в-python)
+- [2. Операторы в Python](#2-операторы-в-python)
+- [3. Условный оператор в Python](#3-условный-оператор-в-python)
+- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
+
+
+
+## 9. Словари в Python
+
+Словарь — неупорядоченная структура данных, которая позволяет хранить пары «ключ — значение».
+
+```python
+# Создание словаря c помощью литерала
+
+student = {'name': 'Ivan', 'age': 12}
+credentials = {'email': 'hacker1337@mail.ru', 'password': '123456'}
+```
+```python
+# Создание словаря c помощью функции dict()
+
+student = dict(name='Ivan', age=12)
+credentials = dict(email='hacker1337@mail.ru', password='123456')
+```
+Для получения значения конкретного ключа используются квадратные скобки [].
+
+```python
+# Получаем значение с ключом 'name'
+
+student = dict(name='Ivan', age=12)
+print(student['name']) # -> Ivan
+```
+
+Обновление существующих значений происходит абсолютно также.
+```python
+# Получаем значение с ключом 'name'
+
+student = dict(name='Ivan', age=12)
+student['name'] = 'Vasya'
+
+print(student['name']) # -> Vasya
+```
+Для удаления ключа и соответствующего значения из словаря можно использовать del
+
+```python
+# Удаление ключа 'age'
+
+student = dict(name='Ivan', age=12)
+del student['age']
+
+print(student) # -> {'name': 'Ivan'}
+```
+
+Метод get() возвращает значение по указанному ключу. Если указанного ключа не существует, метод вернёт None. Также можно указать значение по умолчанию, которое будет возвращено вместо None, если ключа в словаре не окажется.
+```python
+# Использование метода get()
+
+student = dict(name='Ivan', age=12)
+
+print(student.get('name')) # -> Ivan
+print(student.get('lastname')) # -> None
+print(student.get('lastname', 'No key')) # -> No key
+```
+
+Метод pop() удаляет ключ и возвращает соответствующее ему значение.
+
+```python
+# Использование метода pop()
+
+sneakers = dict(brand='Adidas', price='9990 RUB', model='Nite Jogger')
+
+model = sneakers.pop('model')
+
+print(sneakers) # -> {'brand': 'Adidas', 'price': '9990 RUB'}
+print(model) # -> Nite Jogger
+```
+Метод keys() возвращает специальную коллекцию ключей в словаре.
+```python
+# Использование метода keys()
+
+sneakers = dict(brand='Adidas', price='9990 RUB', model='Nite Jogger')
+
+print(sneakers.keys()) # -> dict_keys(['brand', 'price', 'model'])
+
+# dict_keys - это неизменяемая коллекция элементов.
+
+keys = list(sneakers.keys())
+print(keys) # -> ['brand', 'price', 'model']
+```
+
+Метод values() возвращает специальную коллекцию значений в словаре.
+```python
+# Использование метода values()
+
+sneakers = dict(brand='Adidas', price='9990 RUB', model='Nite Jogger')
+
+print(sneakers.values()) # -> dict_values(['Adidas', '9990 RUB', 'Nite Jogger'])
+
+# dict_values - это неизменяемая коллекция элементов.
+
+values = list(sneakers.values())
+print(values) # -> ['Adidas', '9990 RUB', 'Nite Jogger']
+```
+
+Метод items() возвращает пары «ключ — значение» в формате кортежей.
+```python
+# Использование метода items()
+
+sneakers = dict(brand='Adidas', price='9990 RUB', model='Nite Jogger')
+
+print(sneakers.items()) # -> dict_items([('brand', 'Adidas'), ('price', '9990 RUB'), ('model', 'Nite Jogger')])
+
+# dict_items - это неизменяемая коллекция элементов.
+
+items = list(sneakers.items())
+print(items) # -> [('brand', 'Adidas'), ('price', '9990 RUB'), ('model', 'Nite Jogger')]
+
+sneakers = dict(brand='Adidas', price='9990 RUB', model='Nite Jogger')
+
+# Вывод ключей словаря с помощью цикла for
+
+for key in sneakers:
+ print(key)
+
+# -> brand
+# -> price
+# -> model
+
+# Вывод значений словаря с помощью цикла for
+
+for value in sneakers.values():
+ print(value)
+
+# -> Adidas
+# -> 9990 RUB
+# -> Nite Jogger
+
+# Вывод ключей и значений словаря с помощью цикла for
+
+for key, value in sneakers.items():
+ print(key, value)
+
+# -> brand Adidas
+# -> price 9990 RUB
+# -> model Nite Jogger
+```
+Метод setdefault() возвращает значение ключа, но если его нет, создает ключ с указанным значением (по умолчанию None).
+```python
+# Метод setdefault()
+
+student = dict(name='Ivan', age=12)
+student.setdefault('lastname', 'Ivanov')
+
+print(student) # -> {'name': 'Ivan', 'age': 12, 'lastname': 'Ivanov'}
+```
+Решение задач
+1. Пользователь
+```python
+# Пользователь вводит имя, фамилия, возраст. Создайте словарь user и запишите данные пользователя в него.
+firstname = input('Enter your firstname: ')
+lastname = input('Enter your lastname: ')
+age = input('Enter your age: ')
+
+user = dict(firstname=firstname, lastname=lastname, age=age)
+print(user)
+```
+
+2. Найти слово
+```python
+# Выведите самое часто встречающееся слово в введенной строке.
+list_of_words = ['hello', 'hello', 'hi']
+words = {}
+
+for word in list_of_words:
+ words[word] = words.get(word, 0) + 1
+
+# Функция max может получать функцию в качестве второго аргумента
+freq_word = max(words, key=words.get)
+
+print(freq_word)
+```
+
+Задачи для самостоятельного решения
+1. Фрукты
+Пользователь вводит число K - количество фруктов. Затем он вводит K фруктов в формате: название фрукта и его количество. Добавьте все фрукты в словарь, где название фрукта - это ключ, а количество - значение. Например:
+```python
+# Ввод:
+>> 3 # Количество фруктов
+>> Яблоко
+>> 3
+>> Апельсин
+>> 3
+>> Мандарин
+>> 10
+# Вывод:
+>> {'Яблоко': 3, 'Апельсин': 3, 'Мандарин': 10}
+```
+2. Старший и младший
+Пользователь вводит число N. Затем он вводит личные данные (имя и возраст) своих N друзей. Создайте список friends и добавьте в него N словарей с ключами name и age. Найдите самого младшего из друзей и выведите его имя.
+```python
+# Ввод:
+>> 3 # Количество друзей
+>> Иван
+>> 11
+>> Саша
+>> 12
+>> Леша
+>> 10
+# Вывод:
+>> Леша
+```
+3. Еще немного о друзьях
+Пользователь вводит число N. Затем он вводит личные данные (имя и возраст) своих N друзей. Создайте список friends и добавьте в него N словарей с ключами name и age. Выведите средний возраст всех друзей и самое длинное имя.
+```python
+# Ввод:
+>> 3 # Количество друзей
+>> Иван
+>> 12
+>> Иннокентий
+>> 20
+>> Леша
+>> 10
+# Вывод:
+>> 14
+>> Иннокентий
+```
+4. Английский словарь
+"Пора учить английский язык", - сказал себе Степа и решил написать программу для изучения английского языка. Программа получает на вход слово на английском языке и несколько его переводов на русском языке. Составьте словарь, в котором ключ - это английское слово, а значение - это список русских слов. В этой задаче нужно использовать строчный метод split().
+```python
+# Ввод:
+>> 4 # Количество слов
+>> apple - яблоко
+>> orange - оранжевый, рыжий, апельсин
+>> grape - виноград, виноградный, гроздь
+>> easy - простой, легкий, нетрудный, удобный, несложный
+# Вывод:
+>> {'apple': ['яблоко'], 'orange': ['оранжевый', 'рыжий', 'апельсин'], 'grape': ['виноград', 'виноградный', 'гроздь'], 'easy': ['простой', 'легкий', 'нетрудный', 'удобный', 'несложный']}
+```
+
+
+
+- [1. Ввод и вывод данных в Python](#1-ввод-и-вывод-данных-в-python)
+- [2. Операторы в Python](#2-операторы-в-python)
+- [3. Условный оператор в Python](#3-условный-оператор-в-python)
+- [4. Цикл for в Python](#4-цикл-for-в-python)
+- [5. Цикл while в Python](#5-цикл-while-в-python)
+- [6. Списки в Python](#6-списки-в-python)
+- [7. Методы работы со списками в Python](#7-методы-работы-со-списками-в-python)
+- [8. Функции в python](#8-функции-в-python)
+- [9. Словари в python](#9-словари-в-python)
+
+
\ No newline at end of file
diff --git a/public/sitemap-0.xml b/public/sitemap-0.xml
index 01f49be..aa07bf3 100644
--- a/public/sitemap-0.xml
+++ b/public/sitemap-0.xml
@@ -1,13 +1,14 @@
-https://edu.krasnikov.pro/posts/exam/minimum-knowledge-of-python2023-10-17T17:59:34.071Zdaily0.7
-https://edu.krasnikov.pro/posts/informatics/ms-word2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro/posts/informatics/python-task2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro/posts/informatics/python-well2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro/posts/informatics/textbook-python2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro/posts/olimp/practice-test-10-11-robotics2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro/posts/olimp/practice-test-5-6-robotics2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro/posts2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro2023-10-17T17:59:34.072Zdaily0.7
-https://edu.krasnikov.pro/about2023-10-17T17:59:34.072Zdaily0.7
+https://edu.krasnikov.pro/posts2023-11-08T04:40:37.596Zdaily0.7
+https://edu.krasnikov.pro2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/about2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/exam/minimum-knowledge-of-python2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/informatics/ms-power2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/informatics/ms-word2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/informatics/python-pygames2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/informatics/python-task2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/informatics/python-turtle2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/informatics/python-well2023-11-08T04:40:37.597Zdaily0.7
+https://edu.krasnikov.pro/posts/textbook/python2023-11-08T04:40:37.597Zdaily0.7
\ No newline at end of file