Обложка Python 3. Основы.

Python 3. Основы.

Эджи

0% прочитано
Стандартный
Эджи

Python 3. Основы.

Если во время прочтения появились баги!!!

Если во время чтения у вас появились какие-то проблемы или вопросы, просто напишите их в комментариях и, по возможности, оставьте ссылку на скриншот. НО сначала загляните сюда. Эта глава будет дополнятся со временем.

1) Проблема отсутствия расцветки. (от комментатора fangz, 09.09.2023)

Скорее всего у вас включена собственная расцветка текста.

Её можно поменять читая произведение. Убирайте галочку в настройках, когда читаете эту книгу, потом ваши настройки сами вернутся, если вновь поставить галочку.

Если это не так, просьба написать в сообщении.

1. Переменные, типы: int, str и float.

*** Если у вас будут вопросы, то не стесняйтесь задавать их в комментариях***

Чтобы работать на python, вам нужно установить интерпретатор на официальном сайте - .

Ещё вам нужна ide, в которой вы будете набирать и запускать код. Для новичков отлично подойдет Thonny, а после познания основ можно начать осваивать PyCharm.

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

Пример 1:

1 | name = "Эдже"

Разбор:

1) name - имя переменной

2) = оператор присваивания т. е. мы присваиваем переменной name значение "Эдже".

3) "Эдже" - значение типа string.

Тип str - это строка с текстом. Чтобы его создать, нужно написать текст и заключить в одинарные или двойные кавычки. ("dog" и 'dog' одно значение)

Пример 2:

1 | String1 ="двойные"

2 | String2 ='одинарные'

Но не одновременно.

Пример 3:

1 | STR ="string'

Консоль:

SyntaxError: unterminated string literal (detected at line 1)

Также есть типы int и float.

Пример 4:

1 | Int = 780

2 | Float = 89.005

Тип int - это целые отрицательные, целые положительные числа и ноль. Их нужно просто записывать без дополнительных обозначений на подобии ".

Тип float - это числа с плавающей запятой. Если в жизни мы ставим запятые (78,03) , то здесь нам нужно использовать точки (56.5).

В ЯП Python числа вроде 9.0 является типа float, хоть после точки есть только ноль.

Можно создать сразу несколько переменных.

Пример 5:

1 | a, b, c = 5, "0", 89

Разбор: имеется в виду: a =5 ; b ="0" ; c =89 .

Какие имена можно использовать для переменных:

1. с английскими буквами;

2. с цифрами, если они не в самом начале;

3. без знаков + , . - / и т. д., кроме _

Нельзя использовать имена которые уже имеют свое назначение в python (str, int, is) без дополнений (int_ , int1, int_str, Int), и названия функций, хотя функции вы потом использовать не сможете.

String и string или Print и print - разные названия.

Значение переменных можно менять.

Пример 1:

1 | a =89

2 | b =10

3 | c =5

4 | c, b = b, a

5 | a =100

Разбор:

1) Переменным дали значения a =89, b =10, c =5.

2) В 4 строке были даны новые значения 2 переменным c = 10, b = 89.

3) В 5 строке поменяли значение последней переменной a =100.

Задания на практику:

1) Напечатать каждый код из главы.

2) Создать переменные: три str, 2 int и 5 float.

3) Задать вопрос, если что-то вам не понятно. (буду отвечать и редактировать главы)

4) Продолжить изучать программирование.

2. Функция print()

"Что такое функция?" - Этот вопрос сам всплывет в вашей голове, когда вы будете читать главу. Однако вам это знать пока не нужно

Функция print() - Выводит в консоль переданные данные. Чтобы передать элемент в функцию, нужно записать их в скобки.

Форма записи:

1 | print( элемент )

Сейчас мы напишем первую программу: Hello, world.

Пример 1:

1 | print( "Hello, world!" )

Вывод:

> > > Hello, world!

Чтобы вывести несколько элементов в строчку, нужно добавить между ними запятую.

Пример 2:

1 | INT =89

2 | old ="лет."

3 | print( "Привет!" )

4 | print( "Мне", INT, old )

Вывод:

> > > Привет!

> > > Мне 89 лет.

Разбор:

print() выводит элементы без изменений и ставит между ними пробелы.

Если ничего не передать этой функции, то она просто сделает пробел.

Пример 3:

1 | print( "4567899k" )

2 | print( )

3 | print( "cat" )

Вывод:

> > > 4567899k

> > >

> > > cat

Разбор:

Каждый раз, когда мы используем print(), она автоматически отделяет новый вывод от прошлого, делая Enter.

1 строка. вывод

2 строка. Enter и без вывода т. к. скобки пустые.

3 строка. Enter + вывод.

Поэтому у нас получается 2 раза Enter.

Если вам нужно разделить не пробелами, а другим знаком, то можно использовать аргумент sep.

Пример 4:

1 | print( "крот", "кнопка", "нож", "люк", sep=";" )

2 | print( "синий", "белый", "серый", "красный", sep=" или " )

3 | print( "Н", "о", "г", "а", sep="" )-

4 | print( "серый", "белый", "рыжий", sep=" кот, " )-

Вывод:

> > > крот;кнопка;нож;люк

> > > синий или белый или серый или красный

> > > Нога

> > > серый кот, белый кот, рыжий

Разбор:

Вывод "Нога" был без пробелов и других знаков, потому что мы передали аргументу sep пустую строку т. е. в кавычках ничего нет => просто вывести без пробелов (слепить все вместе).

Теперь разберем вывод "серый кот, белый кот, рыжий". Я хотел передать " кот, ", чтобы в конце тоже был кот. Я случайно улетел в мысли, пытаясь придумать уместный разделитель, поэтому сам себя запутал, но получился хороший пример, что sep именно разделяет (серыйsepбелыйsepрыжий), ставя разделитель между элементами.

Но я хочу, чтобы у нас был еще и рыжий кот, поэтому воспользуемся аргументом end (не путать с and - и). Этот метод объединяет два вывода. Для начала передадим ему строку только с пробелом.

Пример 5:

1 | print( "серый", "белый", "рыжий", sep=" кот, ", end=" " )

2 | print( "кот." )

3 | print( "Готово!" )

Вывод:

> > > серый кот, белый кот, рыжий кот.

> > > Готово!

Разбор:

С помощью end мы говорим 1 выводу объединиться со следующим. Мы передали строку с пробелом " ", чтобы между "серый кот, белый кот, рыжий" и "кот." был пробел, иначе у нас был бы другой вывод "серый кот, белый кот, рыжийкот." слепленный в одно целое.

Также можно не выводить по отдельности, как в примере 6. В sep можно передать "\n".

\n - значит сделать Enter (см. прим. 7). Также это можно записать прямо в строке (см. прим. 8).

У примеров 6, 7 и 8 общий вывод (просто у 8 еще пробелы, но они стоят для улучшения восприятия написанного), поэтому я решил написать его только один раз.

Пример 6:

1 | print( "верх" )

2 | print( "центр" )

3 | print( "низ" )

Пример 7:

1 | print( "верх", "центр", "низ", sep="\n" )

Пример 8:

1 | a ="верх \n центр \n низ"

2 | print( a )

Общий вывод (прим.6,7,8):

> > > верх

> > > центр

> > > низ

Задания на практику:

1) Напечатать каждый код из главы.

2) Сделать несколько рисунков в консоли, используя print().

Пример (кошка):

1 | print( " /\__/\" )

2 | print( "( 0 ~ 0 )" )

3) Вывести в консоль таблицу или анкету, нарисованную с помощью print().

Пример :

1 | print( "|~~~~~~~~~~~~|" )

2 | print( "| name: Andi ...........|" )

3 | print( "|~~~~~~~~~~~~|" )

4) Придумать пару программок, которые выводят какой-то интересный текст.

(Ну вы поняли, просто практикуйтесь и включайте креативность на полную. В будущем, когда научитесь создавать маленькие программы, вам это пригодится, чтобы решать задачи, а потом придумывать идеи и код для игр\приложений)

5) Задать вопрос, если что-то вам не понятно. (буду отвечать и редактировать главы)

6) Продолжить изучать программирование.

Вам нужно придумать идею проекта, для которого вы будете изучать программирование. Я могу предложить игру-квест из символов, которую мы сможем написать и без библиотек, но лучше будет изучить PyGame, но это потом. Для начала научимся делать калькулятор и будем его улучшать. Параллельно мы будем проходить и другие темы. (4к знаков, а мне еще это редактировать, красить и нумеровать (0_0))

3.Работа с типом int. Часть 1.

Раз я решил начать с калькулятора, то нам стоит научится проводить операции с числами.

С этим типом данных вы уже знакомы, поэтому мы сразу можем приступить к делу.

Операции с числами:

1) + - сложение;

2) - - вычитание;

3) * - умножение;

4) ** - Возведение в степень;

Пример 1:

1 | print( 5+4 )

2 | print( 10-3 )

3 | print( 6*8 )

4 | print( 2**3 )

5 | print( 5** (-2) )

Вывод:

> > >9

> > >7

> > >48

> > >8

> > >0.04

Разбор:

5 в (-2) степени это дробь 1/25, а это 0,04.

Операции с числами:

5) / - деление (всегда ответом будет тип float);

6) // - деление без остатка;

7) % - остаток от деления.

Пример 2:

1 | print( 7/3 )

2 | print( 10/2 )

3 | print( 5//2 )

4 | print( 8//4 )

5 | print( 9%4 )

6 | print( 9%3 )

Вывод:

> > >2.3333333333333335

> > >5.0

> > >2

> > >2

> > >1

> > >0

Последовательность действий в Python:

1) скобки

2) умножение, деление, степени и т.п.

3) Вычитание и сложение

Тут просто обычная математика.

int() - функция, которая меняет тип на int.

Пример 3:

1 | print( int( "895" ) )

2 | print( int( 90.6 ) )

3 | print( int( 90.3 ) )

Вывод:

> > >895

> > >90

> > >90

Разбор:

"895" - тип str. int( "895" ) = 895 - тип int.

int( ) отбрасывает дробную часть float, а не сокращает, поэтому 90.6 = 90 и 90.3 = 90.

Стоит помнить, что, если в строке записано дробное число, то int( ) выдаст ошибку.

Пример 4:

3 | print( int( "89.5" ) )

Вывод:

> > >ValueError: invalid literal for int() with base 10: '89.5'

Задания на практику:

1) В году 12 месяцев. Найдите среднее арифметическое количества дней в месяцах. Обозначим, что в Феврале 28 дней.

2) В году 12 месяцев. Найдите среднее арифметическое количества дней в месяцах. Обозначим, что в Феврале 29 дней.

3) Найдите разницу между ответами первой и второй задач.

4) Напечатать каждый код из главы.

5) Задать вопрос, если что-то вам не понятно. (буду отвечать и редактировать главы)

6) Продолжить изучать программирование.

4.Работа с float. Часть 1.

Математические операции с типом int и типом float почти одинаковые. Эти два типа можно складывать с друг другом и делать остальные вещи. Однако стоит помнить, что, если после точки будет слишком много знаков, то Python может выдать неправильный ответ.

Операции с числами:

1) + - сложение;

2) - - вычитание;

Пример 1:

1 | print( 5.6+2.4 )

2 | print( 6.2+7 )

3 | print( 5.6-2.4 )

4 | print( 7.2-6 )

Вывод:

> > > 8.0

> > > 13.2

> > > 3.1999999999999997

> > > 1.2000000000000002

Операции с числами:

3) * - умножение;

4) ** - Возведение в степень;

Пример 2:

1 | print( 5.6*2.4 )

2 | print( 6.2*7 )

3 | print( 5.6**2.4 )

4 | print( 7.2** (-6) )

5 | print( 6**7.2 )

Вывод:

> > > 13.44

> > > 43.4

> > > 62.467088533128695

> > > -139314.069504

> > > 400579.7606882809

Операции с числами:

5) / - деление (всегда ответом будет тип float);

Пример 3:

1 | print( 8.2/2.05 )

2 | print( 8/2.05 )

3 | print( 8.2/2 )

Вывод:

> > > 4.0

> > > 3.9024390243902443

> > > 4.1

Операции с числами:

6) // - деление без остатка. Если при делении будет float, то ответ тоже будет float, иначе ответ будет int.

Пример 4:

1 | print( 5.3//4.2 )

2 | print( 5.3//4 )

3 | print( 5//4.78 )

4 | print( 5//4 )

Вывод:

> > > 1.0

> > > 1.0

> > > 1.0

> > > 1

Операции с числами:

7) % - остаток от деления.

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

Пример 5:

1 | print( 5.3%4.2 )

2 | print( 5.3%4 )

3 | print( 5%4.78 )

4 | print( 5%4 )

Вывод:

> > > 1.2619047619047619

> > > 1.325

> > > 1.0460251046025104

> > > 1.25

Чтобы поменять тип на float, нужно использовать функцию float().

Пример 6:

1 | print( float( '6.6' ) )

2 | print( float( 90 ) )

3 | print( float( '0' ) )

Вывод:

> > > 6.6

> > > 90.0

> > > 0.0

1) Найти корень из 25.

2) Найти корень из 8.

Подсказка: используйте **.

3) Найти суммы этих корней.

4) Напечатать каждый код из главы.

5) Задать вопрос, если что-то вам не понятно. (буду отвечать и редактировать главы)

6) Продолжить изучать программирование.

5. Функция input()

*В конце главы решение задач из прошлой*

Эту главу я написал еще в начале лета. осталось только раскрасить и добавить решения задач.

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

Задача 1. Напишите программу, которая складывает два числа.

Решение 1:

1 | a =89

2 | b = 78

3 | print( a + b )

Вывод :

> > > 167

Посмотрев на код в решении 1, можно заметить, что мы сами выбрали числа, с которыми код будет работать. Получается, что нужно знать основы программирования, чтобы просто не считать в уме или в столбик? Конечно нет! Дабы пользователю не пришлось постоянно менять код, нужно сделать так, чтобы код сам запрашивал значения через консоль.

Функция input() - ввод текста с клавиатуры. Пользователь пишет текст в консоли, а input() передает его программе.

Пример 1:

1 | print( "Назови своё имя." )

2 | name =input( )

3 | print( "Привет,", name )

Вывод:

> > > Назови своё имя.

> > > Максим

> > > Привет, Максим

Когда будете самостоятельно запускать этот код на своем компьютере, обратите внимание, что код, доходя до input(), становится на паузу, ожидая нажатия вами Enter.

Разбор:

1) Код спокойно выполняет свою работу.

2) Код доходит до input() и ждет.

3) Вы пишите текст, но код все еще ждет.

4) Вы нажимаете Enter - код продолжает работать.

5) input() копирует написанный вами текст и передает его программе.

6) Программа присваивает переданный функцией input() текст переменной name.

7) Код спокойно доходит ко конца - программа заканчивает свою работу.

Не забывайте, что input() всегда возвращает объект типа str. Если вы попытаетесь передать число, например 48, то все равно input() вернет строку '48', а не число 48.

Теперь напишем калькулятор, который складывает два числа.

Пример 2:

1 | print( "Введите два числа по очереди." )

2 | a =int( input() )

3 | b =int( input() )

4 | summa = a + b

5 | print( summa )

Вывод:

> > > Введите два числа по очереди.

> > > 34

> > > 90

> > > 124

Разбор примера 2:

Чтобы передать функции объект, с которым ей нужно будет работать, нужно записать его в скобки после функции. Когда функция завершает свою работу, она возвращает итог работы в то место кода, в котором она стоит сама.

1) Функция input() возвращает скопированную строку и заменяет ей себя, поэтому у нас получается код a =int( '34' ).

2) Функция int() принимает на вход строку '34', а затем возвращает число 34 и заменяет им себя, поэтому у нас получается обычное присваивание a =34.

После разбора второго примера у вас мог появиться вопрос: "Что будет, если вставить функцию в случайное место?"

Пример 3:

1 | a =6789

2 | b =567

3 | 10

4 | c =67+ b * a

5 | int( a - b )

6 | print( a )

Вывод:

> > > 6789

Разбор: В строках 3 и 5 у новичков создается ощущение ошибки, но, если немного подумать, то можно заметить, что в коде все нормально. На самом деле у более опытных людей были бы претензии к 2, 3, 4, 5 строке кода.

Дело в том, что с правила самого Python по написанию кода соблюдены, только сам редактор кода будет ругаться и то на нас, а не на ошибку. Мы создали несколько бесполезных переменных, записали число с которым ничего не происходит, как и с данными, которые возвращает функция int() - все это там просто есть. Все это ненужно. Все это только ухудшает читаемость кода для других программистов, а также зря тратит место в памяти. Для этого люди и создали список правил оформления кода, чтобы улучшить читаемость. К этому мы вернемся позже.

Это длинное объяснение примера 2 можно было оставить для главы про функции, но я беспокоился, что кто-то не понял. А пример 3 мне было уже лень объяснять полностью.

Также мы можем не делать print(), а просто передать сообщение пользователю, записав его в скобки функции input().

Пример 4:

1 | a =int(input("Первое слагаемое: "))

2 | b =int(input("Второе слагаемое: "))

3 | print("Сумма:", a + b)

Вывод:

> > > Первое слагаемое: 78

> > > Второе слагаемое: 3

> > > Сумма: 81

Задания на практику:

1) Напишите калькулятор на подобии примера 4, но с вычитанием.

2) Сделайте тоже самое, но для каждой алгоритмической операции. Также сохраните все созданные калькуляторы в нескольких или сразу в одном коде, потом мы их объединим и позволим пользователю выбирать.

4) Напечатать каждый код из главы.

5) Задать вопрос, если что-то вам не понятно. (буду отвечать и редактировать главы)

6) Продолжить изучать программирование.

Решение задач прошлой главы:

Чтобы извлечь корень из числа, нужно возвести его в 0.5 степень.

Решение:

1 | a =25**0.5

2 | print( "Корень:", a )

3 | b =8**0.5

4 | print( "Корень:", b )

Вывод:

> > > Корень: 5.0

> > > Корень: 1.5157165665103982

Да, корень должен быть положительным. Если просят найти корень от 25, то значит оно под корнем и ответ будет положительный (5, нам просто нужен модуль). Если корень уравнения х**2=25, то нужно найти значения, при которых будет правильным, (х1=5, х2= -5). Поэтому некоторых в школе заставляли дописывать, что х равен +- корень из 25.

7. Конструкция if-else-elif

*В конце главы решение задач из прошлой*

Напоминаю, что эту книгу лучше читать на компьютере или ноутбуке и без книжного режима чтения. Не забудьте про проблему из первой главы. Я серьёзно.

В обычном калькуляторе, чтобы выбрать нужное действие мы нажимаем на кнопки, но сейчас вы умеете работать только с консолью. Мы можем использовать input( ) для взаимодействия с пользователем, а сегодня разберем как менять ход программы, основываясь на полученных данных.

if - если.

Форма записи:

1 | if-условие:-

2 |---| блок кода-

Разбор:

1) Блок кода - часть кода, которая содержится внутри if. В Python нужно обязательно ставить отступы. Отступов должно быть на один больше чем у самого if. У нашего их 0, поэтому у всех команд внутри него будет по 1 отступу. (для отступа нажмите на Tab)

2) Условие - обстоятельство, при которых блок кода внутри if будет выполнен.

Задача 1: запрограммируйте автомат, который при наличии у человека 10 валюты Python (назовем это PyMoney) будет выдавать маленькую игрушечную змею.

Решение 1:

1 | PyMoney =-int( input( "Сколько у вас PyMoney: " ) )-

2 | if PyMoney >=-10:-

3 |---| print( "Вот ваша змея." )-

4 |---| print( "*Из автомата выпадает небольшая коробка*" )-

5 | print( "Приходите еще!" )-

Запуск 1:

> > > Сколько у вас PyMoney: 52

> > > Вот ваша змея.

> > > *Из автомата выпадает небольшая коробка*

> > > Приходите еще!

Запуск 2:

> > > Сколько у вас PyMoney:-5

> > > Приходите еще!

(Это разные выводы. Просто у нас есть несколько вариантов событий. Попробуйте запустить этот код сами и вы всё сразу поймете)

Операторы сравнения (в 8-й главе я подробно это объясню):

1) > - больше ( 4 > 2 )

2) < - меньше ( 2 < 4 )

3) >= - больше или равно

4) <= - меньше или равно

5) == - сравнение ( 5 == 5 )

Разбор:

В коде мы используем знак >= - больше или равно. Код внутри if будет выполнен, если число в переменной будет больше 10 либо равно 10.

Берем под руку еще один проект - "Торговый автомат".

Мы видим, что наше детище обслуживает опытных программистов очень хорошо, но новички, что еще не накопили достаточно PyMoney, она просто спрашивает, а потом прощается. Добавим код, который будет обслуживать тех, у кого PyMoney не хватает.

else - иначе

Используется вместе с if, иначе будет ошибка.

Форма записи:

1 | if-условие:-

2 |---| блок кода-

3 | else:-

4 |---| блок кода-

Если условие не будет выполнено, то запустится блок кода внутри else.

Решение 2:

1 || PyMoney =-int( input( "Сколько у вас PyMoney: " ) )-

2 || if PyMoney >=-10:

3 ||---| print( "Вот ваша змея." )-

4 ||---| print( "*Из автомата выпадает небольшая коробка*" )-

5 || else:-

6 ||---| print( "Вам не хватает", 10 - PyMoney, " PyMoney." )-

7 ||---| print( "Продолжайте изучать Python, чтобы заработать больше PyMoney" )-

8 ||---| print( "*Ты смотришь на кучу змей, от которых тебя отделяет лишь стекло. Одна из змей приковывает твое внимание*" )-

9 ||---| print( "*Блеск в ее глазах, сделанных из бусин, ты воспринимаешь за грусть. Она не сводит с тебя глаз*" )-

10|---| print( "*Ты зарежешься мотивацией, поэтому уже и не важно, что это просто игрушка, а тебе пора пить таблетки*" )-

11| print( "Приходите еще!" )-

Запуск 1:

> > > Сколько у вас PyMoney:-78

> > > Вот ваша змея.

> > > *Из автомата выпадает небольшая коробка*

> > > Приходите еще!

Запуск 2:

> > > Сколько у вас PyMoney:-6

> > > Вам не хватает 4 PyMoney.

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

> > > *Блеск в ее глазах, сделанных из бусинок, ты воспринимаешь за грусть. Она не сводит с тебя глаз*

> > > *Ты заражаешься мотивацией, поэтому и не важно, что это просто игрушка, а тебе пора пить таблетки*

> > > Приходите еще!

Прекрасно! Если раньше мы просто игнорировали новичков, то теперь мы их мотивируем и вгоняем в депрессию.

Идем дальше. Пусть, если программисту не хватает PyMoney, наш автомат попробует продать значок с рисунком змеи за 5 PyMoney. Также, если нет 5 PyMoney, автомат попробует продать наклейку за 1 PyMoneyю.

elif - иначе, если

Используется вместе с if, иначе будет ошибка.

Форма записи:

1 | if-условие-1:-

2 |---| блок кода-

3 | elif-условие-2:-

4 |---| блок кода -

Заметка:

1 || if-условие-1:-

2 ||---| блок кода-

3 || elif-условие-2:-

4 ||---| блок кода-

5 || elif-условие-3:-

6 ||---| блок кода-

7 || . . .-

8 || elif-условие 789: (В одной связке может быть бесконечное количество блоков elif)

9 ||---| блок кода-

10| else: (По желанию или нужде можно добавить один блок else в конце, но это не обязательно)

11|---| блок кода-

Важно помнить, что все это - одна условная инструкция

Разбор:

1) Если условие 1, которое принадлежит if, будет правдивым, то выполнится блок кода внутри if, а все elif и else будут пропущены.

2) Если условие 1, которое принадлежит if, будет ложным, то блок кода внутри if не будет выполнен, а затем будет проверятся условие 2, которое принадлежит первому elif.

3) Дальше будут проверятся условия всех elif. Так будет пока мы не наткнемся на одно из правильных условий, тогда блок кода elif, которому принадлежит это условие, будет выполнено, а все остальные elif и else будут пропущены. Либо условия всех elif будут ложными и их блоки кода будут пропущены.

4) Остается только else. Раз if и все elif были не правдивы, мы просто выполняем блок кода else.

А теперь я объясню вам все нормально.

Пример 1:

1 || PyMoney =-90-

2 || if PyMoney >-10000:-

3 ||---| print( "У вас больше чем 10000 PyMoney!" )-

4 || elif PyMoney >-101:-

5 ||---| print( "У вас больше чем 101 PyMoney!" )-

6 || elif PyMoney >-100:-

7 ||---| print( "У вас больше чем 100 PyMoney!" )-

8 || elif PyMoney >-80:-

9 ||---| print( "У вас больше чем 80 PyMoney!" )-

10| else:-

11|---| print( "У вас мало PyMoney..." )-

Вывод:

> > > У вас больше чем 80 PyMoney!

Пример 2:

1 || PyMoney =-100-

2 || if-500-< PyMoney:-(условие не верное)

3 ||---| print( 5 ) (пропускаем)

4 || elif-10-< PyMoney: (условие верное)

5 ||---| print( 0.1 ) (выводим)

6 || elif-5-<-100: (условие верное, но мы все пропускаем)

7 ||---| print( 100 )-

8 || else: (else тоже пропускается)

9 ||---| print( "hi" )-

10|-

11| if-70->-0: (тут уже начинается условная инструкция) (условие верное)

12|---| print( "you" ) (выводим)

13| else:-(условие от if верное - else пропускается)

14|---| print( 0 )-

15| print( "bye" )-

Вывод:

> > > 0.1

> > > you

> > > bye

Разбор:

1) В 6 строке все верно, но у нас уже есть правдивый elif поэтому все остальное в этой связке пропускается, доже если условия остальных elif правдивы.

2) Новая условная инструкция всегда начинается с if. (Я специально добавил пустую строку кода, чтобы вам было проще мысленно их отделять)

3) Первый else связан с if-500-< PyMoney, а второй else связан с if-70->-0.

4) Перед print( "bye" ) нет отступа, поэтому он не относится к else и этот участок кода работает на тех же правах, что и переменная PyMoney: эти части кода будут выполняться всегда.

Возвращаемся к нашему автомату.

Решение 3:

1 || PyMoney =-int( input( "Сколько у вас PyMoney: " ) )-

2 || if PyMoney >=-10:-

3 ||---| print( "Вот ваша змея." )-

4 ||---| print( "*Из автомата выпадает небольшая коробка*" )-

5 || elif PyMoney >=-5:-

6 ||---| print( "У вас не хватает на игрушку." )-

7 ||---| print( "Вот ваш значок." )-

8 ||---| print( "*Из автомата выпадает небольшая коробка*" )-

9 || elif PyMoney >=-1:-

10|---| print( "У вас не хватает на игрушку и на значок." )-

11|---| priint( "Вот ваша наклейка." )-

12|---| print( "*Из автомата выпадает небольшой конверт*" )-

13| else:-

14|---| print( "Вам не хватает PyMoney." )-

15| print("Приходите еще!")-

Задания на практику(12шт.):

1) Запустить код из решения 3 и попробовать ввести разные значения.

2) Также поступите и со всеми другими кодами. (можете сократить выводы в консоль)

3) Попробуйте сделать обычный торговый автомат. (Можете взять в пример решение задачи из прошлой главы)

4) Создайте программу, которая будет спрашивать возраст пользователя и говорить где он учится: в школе или институте.

5) Усовершенствуйте решение задачи 4 добавив: работает, ходит в садик, на пенсии, не ходит даже в садик.

6) Сделайте систему регистрации. Учтите все нюансы (насколько можете).

7) Сделайте систему входа. Учтите все нюансы (насколько можете).

8) Продолжить изучать программирование.

9) Сделайте калькулятор, основываясь на примере далее.

Я сейчас заглянул в прошлую главу и не могу сказать, что там что-то нужно объяснять, поэтому объединим коды, которые были под номерами 1 и 2. +даем пользователю выбор.

Пример:

1 || a =-int( input( "Введите первое число: " ) )-

2 || b =-int( input( "Введите второе число: " ) )-

3 || znak =-input( "Какое действие нужно сделать: " )-

4 || if znak ==-"+":-

5 ||---| print( "Сумма:", a + b )-

6 || elif znak ==-"-":-

7 ||---| print( "Разница:", a - b )-

8 || elif znak ==-"*":-(и дальше по шаблону)

9 ||---| print( "Произведение:", a * b )-

10| else:-

11|---| print( "Программа не воспринимает этот знак." )-

(я думаю рассказать вам в примерно так 9 главе: как разобраться с проблемой сравнения строк)

10) Переделайте программу из задачи 9 так, чтобы пользователь мог передавать дробные числа.

11) Переделайте программу из задачи 9 так, чтобы, если в ответе будет дробное число без остатка(7.0), то в ответ оно выходило целым(7).

12) Напишите код, который будет спрашивать есть ли яйца и молоко. Если нет ничего, то выводим "Закажите доставку". Если есть только яйца - "Будем готовить яичницу". Если ест и молоко и яйца - "Приготовим омлет."

(Подсказка: одну условную конструкцию можно вставлять в любой из блоков кода другой.)

*Все решения, как и обычно, будут в 8-й главе*

8. Тип bool и логические операции

*В конце главы решение задач из прошлой*

Тип bool имеет только 2 значения: True (правда, истина), False (ложь).

Когда мы используем логические выражения, например 6->-5, нам возвращается True или False - правда или ложь. Если ответ True, то 6 и правда больше 5-и. Если ответ False, то 6 не больше 5-и, но, возможно, что 6 меньше или ровно 5-и.

Пример 1:

1 | print( 7 < 4 )-

Вывод:

> > >-False

Пример 2:

1 |-if-25-/-5-==-5 :-

2 |---|-print( 'yes' )-

3 |-else:-

4 |---|-print( 'no' )-

Вывод:

> > >-yes

Разбор:

1) Первым делом у нас идет деление. 25 делить на 5 равно 5. Теперь 25-/-5 заменят себя на 5. if-5-==-5.

2) Дальше идет сравнение. Равны ли 5 и 5? Да. Теперь 5-==-5 заменяет заменяет себя на True.

3) И сейчас самое интересное. Если условие равно True (т.е. правдивое, как я говорил в прошлой главе), то выполняется блок кода внутри if, но, если в итоге получится False (ложное условие), блок кода if будет пропускаться, а дальше просто вспоминаем прошлую главу.

Также можно сразу подставить значение bool:

Пример 3:

1 |-if-False :-

2 |---|-print( 'yes' )-

3 |-else:-

4 |---|-print( 'no' )-

Вывод:

> > >-no

Логические выражения (начнем с более простого)

1) == - Обычное сравнение,

Пример:

1 |-print( 10-==-5 )-

2 |-print( 6-==-6 )-

3 |-print( 3-==-7 )-

Вывод:

> > >-False

> > >-True

> > >-False

2) > - болльше,

Пример:

1 |-print( 10->-5 )-

2 |-print( 6->-6 )-

3 |-print( 3->-7 )-

Вывод:

> > >-True

> > >-False

> > >-False

3) < - меньше,

Пример:

1 |-print( 10-<-5 )-

2 |-print( 6-<-6 )-

3 |-print( 3-<-7 )-

Вывод:

> > >-False

> > >-False

> > >-True

4) >= - больше или равно,

Пример:

1 |-print( 10->=-5 )-

2 |-print( 6->=-6 )-

3 |-print( 3->=-7 )-

Вывод:

> > >-True

> > >-True

> > >-False

5) <= - меньше или равно,

Пример:

1 |-print( 10-<=-5 )-

2 |-print( 6-<=-6 )-

3 |-print( 3-<=-7 )-

Вывод:

> > >-False

> > >-True

> > >-True

6) != - не равно.

пример:

1 |-print( 10-!=-5 )-

2 |-print( 6-!=-6 )-

3 |-print( 3-!=-7 )-

Вывод:

> > >-True

> > >-False

> > >-True

Теперь немного сложнее.

and - и

Если оба значения равны True, and возвращает True, иначе возвращает False.

Пример 4:

1 |-print( 1->-0-and-5---1-==-4 )-

2 |-print( 4-!=-5-and-6-<-4 )-

3 |-print( 7->-100-and-80-/-10-==-10 )-

Вывод:

> > >-True

> > >-False

> > >-False

or - или

Если хотя бы одно из двух значений равно True, or возвращает True, иначе False.

Пример 5:

1 |-print( 1->-0-or-4-!=-5 )-

2 |-print( 1->-0-or-6-<-4 )-

3 |-print( 6-<-4-or-80-/-10-==-10 )-

Вывод:

> > >-True

> > >-True

> > >-False

not - не

Меняет стоящее перед ним значение типа bool на противоположное.

Пример 6:

1 |-print( not-True )-

2 |-print( not-False )-

3 |-print( not-10-==-10 )-

4 |-print( not-4-==-5 )-

Вывод:

> > >-False

> > >-True

> > >-False

> > > True

В качестве условий можно использовать просто числа или строки, т.к. их можно преобразовать в тип bool:

- True : все дробные и целые числа (кроме 0 и кроме 0.0); не пустые строки; не пустые множества (даже, если в нем только пустая строка/множество).

- False : 0; 0.0; пустые строки; пустые множества.

Пример:

1 |-if-5 :-

2 |---|-print( 'yes' )-

3 |-print( 5 )-

Вывод:

> > >-yes

> > >-5

print( 5 ) выводит просто 5, т.к. только if, elif и циклы могут сами менять тип на bool. На помощь приходит функция bool( ), которая меняет тип на bool.

пример:

1 |-print( bool( 'abc' ) )-

2 |-print( bool( 90 ) )-

3 |-print( bool( 0.0 ) )-

Вывод:

> > >-True

> > >-True

> > > False

Интересный факт: bool является подтипом int (объясню в другой главе).

Применим функцию int( ) и float( ).

Пример:

1 |-print( int( False ) )-

2 |-print( int( True ) )-

3 |-print( float( False ) )-

4 |-print( float( True ) )-

Вывод:

> > >-0

> > >-1

> > >-0.0

> > >-1.0

Можно использовать сразу много and, or, not. Вы можете ставить дополнительные скобки, если вам будет трудно такое записывать или читать, т.к. код спокойно сможет это читать. ( 0-or-True-and-not-False )

Логические выражения тоже имеют свой порядок выполнения, как и в математике:

1) скобки

2) not

3) and

4) or

Также можно совмещать и логические операторы из начала главы (<, >, ==, и т.д.). Помните двойные сравнения из школьной программы? В школе нам показывали способ сравнения x сразу с двумя значениями и называли это диапазоном ( 10-< x <-100). В Python мы можем также, но мы можем объединять таким оброзом бесконечное количество сравнений.

Условие будет ровно True, только если все условия ровны True.

Помните, что тут итог отдельного сравнения (тип bool) не влияет на остальные сравнения, как, к примеру с and и or. Мы отдельно сравниваем: 7 и a; a и сумму b+1; сумму b+1 и 11; 11 и b; b и 15. Просто нам нужно чтобы каждое из них (конечно, отдельно от друг друга) получило в итоге True, тогда и сама эта цепочка будет ровна True.

Пример:

1 | a =8-

2 | b = 10-

3 |-if-7-<= a < ( b +1 ) ==-11->= b <-15-: (Все сравнения правдивы - код if выполнится)

4 |---|-print( "of course" )-

Вывод:

> > >of course

Задачи на практику:

1) Самостоятельно найти ответы без пк:

a. not ( True-or-True ) and not not-False

b. not ( True-or-True-and not not-False)

c. ( not-True-or-True ) and not not-False

d. not-True-or-True-and not not-False

можете найти в интернете еще несколько.

2) Поиграйтесь с функцией bool( ).

3) Поиграйтесь со всеми логическими выражениями из этой главы.

4) продолжайте изучать программирование.

Теперь разберемся с прошлой главой. Если ваш код отличается или вы не додумались до каких-либо фичей, то это не страшно. Старайтесь всегда проявлять максимум креативности и сокращать код, чтобы не тратить много памяти.

Задача 3. Попробуйте сделать обычный торговый автомат.

Решение:

1 || price_of_goods = -1-

2 || (тут нужно вывести список продуктов)

3 || number = input( "Назовите номер: " )-

4 || money = int( input( "Сколько у вас с собой денег: " ) )-

5 || if number == "A1" :-

6 ||---| price_of_goods = 20-

7 || elif number == "A2" :-

8 ||---| price_of_goods = 50-

9 || elif number == "B1" :-

10|---| price_of_goods = 200-

11| elif number == "B2" :-

12|---| price_of_goods = 124-

13| (если есть список товаров и их номеров, то else нам особо не нужен)

14| if money >= price_of_goods :-

15|---| print( "*выбранный товар падает вниз, и вы его забираете*" )-

16| elso:-

17|---| print( "У вас недостаточно денежных средств." )-

Задача 4 и 5: Создайте программу, которая будет спрашивать возраст пользователя и говорить где он учится: в школе или институте. Усовершенствуйте решение задачи 4 добавив: работает, ходит в садик, на пенсии, не ходит даже в садик.

Решение: (будем брать средние показатели)

1 || old =-iint( input( "Сколько вам лет: " ) )-

2 ||-if old <-3 :-

3 ||---|-print( "Вы еще не ходите в садик." )-

4 ||---|-print( "Как вы запустили программу?" )-

5 ||-elif old >=-3 : (можно как вложить одну условную конструкцию в другую, так и ....)

6 ||---| if old <-7: (этот if внутри этого elif. компьютер обратит внимание на него, только если условие elif будет верно )

7 ||---|---|-print( "Вы ходите в садик." )-

8 ||-elif-7-<= old <=-18 :-(... так и воспользоваться новыми знаниями)

9 ||---|-print( "Вы ходите в школу." )-

10|-elif-18-< old <=-23 : (В институтах учатся 4-6, если считать в среднем. Я возьму 5 лет)

11|---|-print( "Вы учитесь в институте." )-

12|-elif-23-< old <-60 : (Возраст пенсии зависит от пола, поэтому можете дополнительно спросить пол. А мне просто нравятся круглые числа)

13|---|-print( "Вы работаете." )-

14|-else:-

15|---|-print( "Вы на пенсии" )-

Задача 6. Сделайте систему регистрации. Учтите все нюансы (насколько можете).

Решение:

1 | name =-input( "Придумайте ник: " )-

2 | мpassword_1 =-input( "Придумайте пароль: " )-

3 | password_2 =-input( "Подтвердите пароль: " )-

4 |-if password_1 != password_2 :-

5 |---|-print( "Ошибка: пароли не совпадают!" )-

6 |-else:-

7 |---|-print( "Теперь вы новый пользователь системы." )-

Пользователю придется опять запускать окно с регистрацией, если он допустит ошибку. Как решить эту проблему? Это мы выясним в другой главе)

Задача 7. Сделайте систему входа. Учтите все нюансы (насколько можете).

Решение:

1 || name =-"Эдже"-

2 || password =-"Python"-

3 || name_0 =-input( "Ник: " )-

4 || password_0 =-input( "Пароль: " )-

5 ||-if name != name_0 :-

6 ||---|-print( "Ошибка: пользователь не найден!" )-

7 ||-elif password != password_0 :-

8 ||---|-print( "Ошибка: пароли не совпадают!" )-

9 ||-else:-

10|---|-print( "Добро пожаловать!" )-

Да, можно просто объединить if и elif, добавив вывод "Не верный ник или пароль", а в случае попытки взлома будет не ясно есть ли такой аккаунт вообще. Меня, обычного пользователя, такое бесит + в мелких программах взламывать что-то не имеет смысла.

Задача 10. Переделайте программу из задачи 9 так, чтобы пользователь мог передавать дробные числа.

Решение: вместо int( input( ) ), используем float( input( ) )

Задача 11. Переделайте программу из задачи 9 так, чтобы, если в ответе будет дробное число без остатка (7.0), то на экран оно выходило целым (7).

Решение:

1 || a =-int( input( "Введите первое число: " ) )-

2 || b-=-int( input( "Введите второе число: " ) )-

3 || znak =-input( "Какое действие нужно сделать: " )-

4 || otvet = "Нет ответа" (если введут не тот знак, то в конце будет этот вывод)

5 || if znak ==-"+" :-

6 ||---| otvet =-a + b-

7 || elif znak ==-"-" :-

8 ||---| otvet = a - b-

9 || elif znak ==-"*" :-

10|---| otvet = a * b-

11| else:-

12|---| print( "Программа не воспринимает этот знак." )-

13| if otvet / 1 == 0 :-

14|---| otvet = int( otvet )-

15| print( "Ответ:", otvet )-

Задача 12. Напишите код, который будет спрашивать есть ли яйца и молоко. Если нет ничего, то выводим "Закажите доставку.". Если есть только яйца - "Будем готовить яичницу.". Если есть и молоко и яйца - "Приготовим омлет."

Решение:

1 | milk = input( "У вас есть молоко: " )-

2 | eggs =-input( "У вас есть яйца: " )-

3 | if eggs ==-"да"-or eggs ==-"Да" : (Модем добавить or чтобы решить проблему регистра.) (в 9 главе уладим этот вопрос)

4 |---|-if milk ==-"да"-or milk ==-"Да" :-

5 |---|---|-print( "Приготовим омлет." )-

6 |---|-else:-

7 |---|---|-print( "Будем готовить яичницу." )-

8 |-else:-

9 |---|-print( "Закажите доставку." )-

9. Работа с типом str. Часть 1.

*В конце главы решение задач из прошлой*

В прошлых главах я добавлял объяснения прямо в примерах с помощью скобок, что могло смутить людей, которые знакомы с комментариями. Я забыл знакомил ли вас с ними, поэтому просто забил)

Как не странно, программисты используют их, чтобы оставлять комментарии для других разработчиков, например "эта переменная содержит к-во коробок"

Чтобы закомментировать строку кода, нужно поставить перед ней #, после чего код не будет обращать на него никакого внимания.

Пример:

1 | a =-7-

2 | b =-8-

3 |-# в этой программе мы закомментируем строку кода-

4 | c = a + b-

5 |-print( c )-

6 |-# c += 1-

7 |-print( c )-

Вывод:

> > >-15

> > >-15

Разбор: Второй вывод не выводит 16, т. к. строка 6 без кода - там только комментарий, который программа пропускает.

+= это оператор, который прибавляет значение справа к значению переменной, которая находится слева. Итог присваивается переменной слева. Это сокращенная запись от с = с +1. Также можно и с другими математическими действиями, например -= или *=.

Теперь приступим к строкам. Сегодня пройдем более лайтовые.

Конкатенация - объединение строк в одну.

Пример:

1 | a =-'2'-

2 | b =-'года'-

3 | c = a +-' '-+ b + '.'-

4 |-# ' ' - эта строка не пустая, там пробел-

5 | print( c )-

Вывод:

> > >-2 года.

Задача 1: Выведите слово куб три раза в одну строку.(не забудьте про пробел)

Решение 1:

1 |-print( 'куб', 'куб', 'куб' )-

Вывод:

> > >-куб куб куб

Решение 2:

1 |-print( 'куб '-*-3 )-

Вывод:

> > >-куб куб куб

Во втором выводе будет лишний пробел в конце, чтобы этого избежать, мы можем использовать метод str.strip().

Метод - функция, которая работает только с конкретным типом.

str.strip() - метод, который удаляет лишние пробелы и Enter-ы в начале и в конце строки, возвращая новую строку и не изменяя изначальную.

Форма записи методов:

значение.метод( )

Пример:

1 |-print( "----dog cat you---\n----".strip( ), end-=-"" ) # объединяем выводы, ничего не добавляя между-

2 |-# \n - Enter-

3 |-# мы добавим |, чтобы видеть сколько пробелов осталось конце-

4 |-print( '|' )-

Вывод:

> > >-dog cat you|

str.upper( ) - приводит все символы строки к верхнему регистру, возвращая новую строку и не изменяя изначальную.

str.lower( ) - приводит все символы строки к нижнему регистру, возвращая новую строку и не изменяя изначальную.

Пример:

1 | otvet =-input( "Да или нет: " )-

2 |-if otvet.lower( ) ==-'да' :-

3 |---| # мы ввели 'Да', lower( ) меняет это на 'да'-

4 |---| # комментарии внутри блоков кода можно ставить без отступа-

5 |-# попробуйте сами, но это портит читаемость-

6 |---| print( 'OK'.lower( ) )-

7 |-print( 'bye'.upper( ), 'bro!', sep-=-', ' )-

Вывод:

> > >-Да или нет: Да

> > >-ok

> > >-BYE, bro!

str.capitalize( ) - делает первую букву строки заглавной, а остальные приводит к нижнему регистру, возвращая новую строку и не изменяя изначальную.

Пример:

1 |-print( 'HHHH'.capitalize( ) )-

2 |-print( 'hhhh'.capitalize( ) )-

3 |-print( 'hHHH'.capitalize( ) )-

4 |-print( 'Hhhh'.capitalize( ) )-

Вывод:

> > >-Hhhh

> > >-Hhhh

> > >-Hhhh

> > >-Hhhh

Если метод не меняет первоначальную строку, а просто возвращает новую, то это значит, что его итог нужно куда-то присваивать, как с функциями, которые вы уже знаете. Есть методы, которые влияют на саму переменную, но это потом.

Пример:

1 || a =-"TTTT"-

2 || b =-80.8-

3 || c =-90-

4 ||-print( a.capitalize( ) )-

5 ||-print( int( b ) )-

6 ||-# мы не меняем сами переменные a и b-

7 || c =-float( c )-

8 ||-print( c )-

9 ||-# float( ) сама не меняет переменную c-

10|-# мы сами присваиваем её итог, меняя значение переменной-

11|-print( a, b, c )-

Вывод:

> > >-Tttt

> > >-80

> > >-90.0

> > >-TTTT 80.8 90.0

Методы можно использовать вместе, как и функции, к стати говоря.

Пример:

1 |-print( int( float( int( str( "89" ) ) ) ) )-

2 |-# если с функциями все просто-

3 |-# это как скобки в скобках 5+ (4 + (3 + 6) )-

4 |-# или просто справа налево, если упустить как работают функции-

5 |-print( "Hello".upper( ).upper( ).lower( ) )-

6 |-# то в случае методов работает другое правило-

7 |-# все выполняется слева направо-

Вывод:

> > >-89

> > >-hello

Теперь разберемся с прошлой главой.

Задача 1: (ответы)

a - False

b - False

c - False

d - False

Это упражнение было на порядок действий, поэтому посмотрите в интернете еще несколько примеров с разными ответами.

Он вернулся?!

Привет всем!

Как вы знаете, я - начинающий программист, который решил завести учебник-заметки. Во всяком случая я таковым был. И... к сожалению таким и остался. Да. Все верно, я забросил прогать.

На самом деле я уже бросал несколько раз это удивительное дело, например, когда начал переделывать книгу с другого аккаунта. Тогда я просто сделал перерыв, отвлекшись на другую сферу, а потом вернулся, захотел привязать другую почту, но сделал что-то не так, поэтому больше не могу зайти на старый аккаунт.

Попробовав понемногу другие профессии, мне стало не хватать старого родного кода, заполненного багами, а также нескольких бессонных ночей за их исправлением.

Ладно уж, где я был мы уже разобрались. Теперь поговорим о вас. Меня пол года не было, какие 1.5к просмотров?! Я посмотрел статистику там буквально каждый день но 1-5 человек стабильно заходит. Это уже не моя заслуга, а вашего интереса к программированию, что вы все нашли эту, казалось бы, всеми забытую книгу.

Также я хотел еще кое-что обсудить, а именно проблемы этой книги. За время моего отсутствия, под книгой даже появился новый комментарий:

Я кривозубый крестьянин, который не знает буквы, простите)

Если что, это не ответ комментатору, это - шутка про меня.

Как вы уже поняли мы немного обсудим мое знание грамматики, хотя комментарий был и не совсем про это.

Мне просто хочется сказать, что я знаю об этой проблеме. Она меня преследует с 1 класса, поэтому просто оставьте меня в покое.

Мне всегда сложно давались гуманитарные науки, но я старался +- все усвоить. Никогда не собирался заучивать кучу сложных правил, которые не особо та и сходятся, как мне всегда казалось. Я выучил обычные правила, хоть мне и явно стоит их вспомнить.

А касательно "установить на сайте", я много раз слышал, что люди говорят так тоже, поэтому это не такая уж большая проблема, там, где я родился это как "одень шапку", поэтому я даже не буду ничего менять(мне лень). Хотя я определенно намотаю это себе на ус, так сказать, поэтому спасибо.

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

Поэтому приглашаю вас в свой новый тг канал: https://t.me/sueta_po_skriptu.

Там я уже не учитель, там я - это ваш друг, проводник или как вам больше нравится. Он будет местом связи моих увлечений и там тоже будет немного о программировании и новостях в мире IT.

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

Сейчас еще быстренько настрою чат, затем быстренько постараюсь разобраться с книгой и ее судьбой.

Спасибо за чтение

Вернуться к книге