PPFPT_1
# **Python начало**
# Введение
Данный курс состоит из двух логических частей: в первой части мы знакомимся с конструкциями языка, учимся ими пользоваться, а во второй рассматриваем аспекты связанные непосредственно с испытаниями на проникновение. А именно: работа с протоколами, парсингом, многопоточностью, многопроцессностью. Что касается структуры курса - будут даваться домашние задания, которые необходимы для лучшего усвоения материала, на итоговую аттестацию наличие домашних работ влиять не будет. Также домашние задания не обязаельно сдавать в срок, но, так как на примерах выполненых работ будут разбираться основные ошибки, их рекомендуется сдавать до начала следующей пары.
В конце курса необходимо будет выполнить итоговое здание. Части этой задачи будут написаны по ходу курса.
**необходимо**
На powershell, терминале или иных подобных сервисах необходимо иметь третью версию python
проверить версию можно при вводе "python3".

# Теория
Python (Пайтон или Питон)- это свободный интерпретируемый язык программирования высокого уровня с динамической типизацией. В Руthon поддерживаются парадигмы структурного и объектно-ориентированного программирования.
Создатель: Гвидо ван Россум (Голландия).
Время создания: начало 90-х.
Сфера применения: от простых скриптов и прототипов до сложных веб-сервисов и программных продуктов.
Кто использует: Microsoft, IBM, Gоogle, HP и другие.

Как собственно работает программа?
Сам код это просто исходный текст в формате m.py, виртуальная машина python исполняет m.pyc файлы, т.е. нами написанные файлы скомпилированные в байт-код.
# Начало работы с языком Python
Для начала создадим файл с именем hallo.py

Первым шагом по традиции будет написание команды для вывода фразы "Hallow World".

Затем сохраняем код.
Для запуска программы необходимо указать её интерпретатор (если таких загруженно несколько) и и имя.

(Если программа не работает, то стоит попробовать прописать полный путь к интерпретатору)

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

Мы будем часто работать в данном режиме, так как он позволяет лучше понят структуру программы.
Переходим к среде разработки. Рекомендуется использовать Pycharm, но если что-то кажется удобнее - используйте, ограничений нет.
Создаем новый проект.
При создании проекта среда спросит куда помещать папки, её рекомендуется зарание создать специальную папку на диске, чтобы в дальнейшем облегчить себе поиски. Также обратите внимание нашла ли среда необходимый интерпретатор.
> [ Если интерпретатор не найден.
Создаем проект затем
File => Settings.. => Project:(имя программы) => Python Interpreter => ( если в списке есть, выбираем. если нет => Add => указываем место расположения файла ). ]
**Непосредственно создание файла Python:**

Для запуска программы необходимо нажать правую кнопку мыши и выбрать "Run" или ctrl+Shift+f10

**Режим интропретатора в Pycharm**
В Pycharm также есть режим интерпретатора, с которым мы в дальнейшем будем работать. Он включается кнопкой Python Console, находящейся в нижней части экрана.
В нем можно например посмотреть текущее значение переменной. Для этого необходимо ввести имя этой переменной и нажать Enter.
> [ (имя переменной) - выводит текущее значение ]
>
Для вывода типа переменной необхожимо ввести type(имя переменной).
> [ type(имя переменной) - выводит тип переменной ]
>
**Виды переменных**
int - целочисленные данные
> [причем в отличае от некоторых языков у python нет ограничения в значения целочисленных переменных ]
>
float - вещественные данные (числа с плавающей запятой)
> [ у типа float есть ограничения в 15 знаков после запятой, и максимальным значением в 1.8 х 10308. Числа больше Python будет помечать в виде строки inf: >>> 1.79e308 1.79e+308 >>> 1.8e308 inf. Число 2.0 так же считается вещественным ]
>
complex - числа с мнимой единицей (комплексные)
> [ записываются как " m - nj ", где m & n - натуральные числа]
str - строковые данные
> ['' = "" они не отличимы]
# Функции в python
**бинарные операторы:**
`+ ` (плюс)
`- ` (минус)
`* ` (умножение)
`/ ` (деление)
`**` (возведение в степень)
`//` (целочисленное деление)
`% ` (взятие остатка от деления).
> [если после операции значение переменной меняет тип (например из целочисленного в вещественные), то и переменная автоматически меняет тип]
a = 3 - присваивание
print()- выводит данные
input()- вводит данные в программу
> [ вводимая информация сохраняется в виде строки]
#. - коментирование
**задача 1**
*Пользователь вводит 2 числа и мы должны вывести на экран их сумму*

> Данный вариант решения не подходит, так как input принимает строки, а нам нужны числа.
> Поэтому используем функцию int
>

> Так же можно сразу при вводе использовать функцию int

**задача 2**

> Закоментированный код - основное решение задачи. Незакоментированный код - решение этой же задачи в одну строчку (для продвинутых).
# Ветвление
До сих пор все наши программы выполнялись линейно, однако очевидно, что в програмировании часто приходится сталкиваться с условностями и условиями, когда программа должна пойти по той или иной дороге. Именно для таких ситуаций используются условные операторы, иначе называемые ветвлением.
Во всех языках ветвление выглядит примерно одинаково. Ключевое слово - if (если), и зачастую есть слово else (иначе).
Класическое (полное) ветвление выглядит так:

> То есть если условие истинно делаем что-то одно, если иначе делаем чтото другое.
Для того чтобы понять как собственно проверяется условие, нам необходимо познакомиться с еще одним типом данных, а именно с булевым (логическим типом данных) .
**bool**
В отличае от других типов данных булевые переменные могут принимать всего два значения true и false (да или нет). Чаще всего они принимают вид логических выражений, например а=5>7, следовательно а= false.
>
Логическа ветка if выполняется, если булевое значение истинно.
> **Пример**
>
> 
>
> В данном примере мы считываем значение, а затем выводим отношение между этим числом и нулем. То есть если введенное число больше 0, то булевое выражение n>0 принимает значение true, а значит мы идем по ветви if и выводим n>0 и "Hurah!". Если n меньше или равно нулю, то будевое выражение n>0 принимает значение false, следовательно мы идем по ветви else и выводим n<=0.
>
> 
Обратим внимание, что у python нет фигурных скобок, их роль выполняет отступ и двоеточие. То есть для того чтобы показать, какие именно команды необходимо выполнять на ветви if, нам необходимо поставить двонеточие, а затем записать команды, выделяя их отступом.
Так же стоит отметить, что кроме else и if при ветвлении можно использовать конструкцию elif, которая по сути является их симбиозом. Таких конструкций можно писать сколько угодно, выглядит это приблизительно так:

Так же в python возможно использование однострочного ветвления
> Пример:
> Вводится 2 числа - выведите их в порядке убывания, используя только if и print().
> 
**Логические операторы:**
(`==`) равенство
(`!=`) неравенство
(`>`) больше
(`<`) меньше
> (также могут применяться комбинации, например: a>x>b - то есть х больше b и меньше a)
>
(`and `) используется если необходимо соединить две или больше логических операций. Возвращает истину только в том случае, если все логические операции истинны. во всех остальных случиях возвращается ложь.
(`or`) используется если необходимо соединить две или больше логических операций. Возвращает истину в том случае, если среди всех логических операций есть хотя бы одна истина. Tщесть выводить ложь, только втом случае, когда все логические операции ложны.
**Неявное приведение типов к bool**
До этого мы использовали приведение при считывании строки (a= int(input())) тут мы считываем строку и преводим её к типу int. Так же работает и проведение к bool.
При приведении любых значений кроме 0 (пустых значений) функция возвращает True, при приведении 0 фукция соответственно возвращает False, то есть она возврает False если приводится любая пустая строка.

Часто в коде можно встретить подобную конструкцию:

Она абсолютно идентична выражению: n не равно пустой строке или n!="".
# Циклы
Циклы используются, если необходимо повторить участок кода некоторое количество раз.
**while**
В цикле while пишется логическое условие, пока это условие истинно итерация повторяется. Если операции цикла не меняют значения логического условия, операция будет повторяться бесконечно. Соответственно чтобы такого не происходило, необходимо менять условие.
> Пример:
> 
>
>>Также стоит отметить что строки 5 и 6 идентичны по значению, это просто разные варианты написания одного и того же действия.
>>То же самое верно и для других бинарных операторов.
>>Пример :
>>
Так же у python есть интересная особенность. У циклов существует else.
Но перед этим необходимо добавить несколько деталей.
У строковых данных индиксация начинается с 0. То есть, если мы зададим строку и попросим вернуть конкретный символ, то выглядеть это будет примерно так:

Так же существует функция len(), она возвращает длинну любой последовательности.
(Индексы и количество элементов - разные значения. В данном случае количество элемнтов 14, а максимальный индекс 13)
Рассмотрим значение фуекции else на примере.

В данном случае приграмма выводит

То есть программа выполняет основной блок цикла, завершает его, а затем проработывает блок else, после чего переходит обратно к основному коду.
Для чего же тогда необходим else? Else выполняет роль некого флажка завершения цикла, тоесть он прорабатывается только тогда, когда цикл заканчивается естественным путем, а не прерывается насильно, например оператором breake.
Оператор breake работает следующим образом.
Например нам нужно найти каким по счету в строке являестя символ i. Тогда мы проходим по всей строке, а когда находим i, нам уже нет смысла обрабатывать строку дальше и мы пишем следующее:

> Операция else выполняет роль маркера, говорящего о том, что i не найдена, нотак как мы выходим из цикла путем breake, операция соответственно выполняться не будет.
Стоить заметить, что оператор Breake прерывает только ближайший вложенный цикл.