====== Переменные, операторы, циклы ====== ===== Общее ===== Консольные скрипты хранятся с расширением **.py**, графические **.pyw**.\\ Стандартная кодировка для файлов **UTF-8 без BOM**, если файл в другой кодировке, то ее следует указать в первой (или второй) строке так: #-*- coding: cp1251 -*- В Unix системах, внутри скрипта следует указывать путь к интерпретатору (аналогично bash), **#!/usr/bin/python**\\ Несколько команд в одной строке можно разделять точкой с запятой, а в целом, ее использование не рекомендуется.\\ Комментарии однострочные, символом решетки, многострочный можно выделить тремя символами двойной кавычки (форматирование сохраняется)\\ :!: по факту это будет строковая переменная, которая так же используется для документирования\\ ==== Вывод ==== print([<Объекты>] [, sep=' '] [, end='\n'] [, file=sys.stdout] [, flush=False]) :!: В аргументе **end** можно указать пробел (end=" "), тогда после команды **print()** не будет **перевода строки**\\ print("""Str1 Str2 Str3""") Так же, есть функция **sys.stdout.write()**, она не вставляет символ перевода строки в конце\\ ==== Ввод ==== Для ввода есть функция **input()**, она возвращает введенное **значение в виде строки**\\ MyVar= input("Input String: ") **Входные аргументы**\\ Array= sys.argv[:] for n in Array: ... ==== Обработка исключений ==== Блок **try: .. except** try: commands.. except EOFError: ActionsIsError ===== Переменные ===== Все данные в языке представлены объектами. У каждого есть тип и значение.\\ Для доступа к объекту и есть **переменные**. При инициализации, в переменную сохраняется ссылка на объект (его адрес в памяти).\\ ==== Именование ==== Не начинать с цифр, с подчеркиваний\\ Не пересекаться со встроенными функциями т.к. :!: их можно переопределить\\ Чувствительны к регистру\\ ==== Типы данных ==== * **bool** - логический * **NoneType** - объект со значением None т.е. отсутствие значения * **int,float** - целочисленные **ограничены только объемом ОЗУ** * **complex** - комплексные числа * **str** - Unicode-строки * **bytes** - неизменяемая последовательность байт * **bytearray** - изменяемая последовательность байт * **list** - списки. Аналогичен массивам **type([1,2,3])** * **tuple** - кортежи **type( (1,2,3) )** * **range** - диапазон **type(range(1,10))** * **dict** - словари. Аналогичен ассоциативным массивам **type({"five":5, "ten": 10})** * **set** - множество (уникальных объектов) **type({"a", "b", "c"})** * **frozenset** - неизменяемое множество **type(["a", "b", "c"])** * **ellipsis** - используется в расширенном синтаксисе получения среза.. хз * **function, module, type** - ф-ции, модули, классы * **изменяемые** - bytearray, т.е. можно обратится к элементу и заменить его * **не изменяемые** - int, str, tuplr, range, bytes, тут уже только сложени/конкатенация и т.д. Так же, **последовательности** и **отображения**, к последним относится **словарь**.\\ Они поддерживают итераторы, с помощью метода **__next__()** или функции **next()** arr=[1,2] i= iter(arr) i.__next__() || next(i) Но лучше всего делать **перебор в цикле for** for i in arr: print(i+ " -", end=" ") # или dict d= {"one":1, "two":2, "three":3} for i in d: print(d[i]) ==== Присваивание значения ==== После присваивания, в переменной сохраняется **ссылка на объект а не сам объект**\\ Несколько переменных могут ссылаться на один и тот же объект в памяти. Например при множественном присваивании изменяемых объектов (list/dict/bytearray) это происходит автоматически\\ :?: на счет изменяемых объектов под вопросом\\ x,y,z= 1,2,3 # Разные объект (но интерпретатор для оптимизации может автоматом сделать один) x,y,z= [1,2,3] # Тут присвоили list и объект в памяти один, три ссылки на него x is y # Ссылается ли x на y sys.getrefcount([1,2,3]) # Кол-во ссылок на объект в памяти (удаляется при 0) Так же работает позиционное присваивание. Если кол-во не совпадает будет ошибка, но если указать звездочку, то одна из переменных, автоматом станет списком x,y= y,x # Так можно поменять местами значение переменных a,b,*c= 1,2,3,4,5 ==== Проверка типа ==== type(a) # Сообщение с указанием типа if(type(x)== int): # Целое число if isinstance(s, str): # Строка ==== Преобразование ==== * bool(), float() * int(<объект>, <система счисления>= 10) * str(), str(<>,<кодировка>,<обработчик ошибок>) * bytes(), bytes(<>,<кодировка>,<обработчик ошибок>) * bytearray(), bytearray(<кодировка>,<обработчик ошибок>) * list(), tuple() int(7.5); int("0o71",8); int("A",16) # 7, 57, 10 float("Infinity"); float("-inf") # inf, -inf ==== Удаление ==== del x del x,y ===== Операторы ===== ==== Математические операторы ==== Стоит отменить: / - деление, **результатом всегда будет вещественный тип** // - деление с округлением вниз (слеши вместе) % - остаток от деления ** - возведение в степень Работа с десятичными числами может быть неочевидной, для операций с фиксированной точностью стоит использовать модель **Decimal**\\ Decimal("3.0") + Decimal("4.0")\\ ==== Двоичные операторы ==== # Инверсия(~), И(&), ИЛИ(|), Исключающее ИЛИ(^), сдвиг влево/вправо(<>) ==== Для работы с последовательностями ==== Конкатенация(+), повторение(*), проверка на вхождение(in), проверка на не вхождение(not in)\\ ==== Операторы присваивания ==== Комбинируется со всеми мат операторами.\\ ===== Условные операторы и циклы ===== **Любой объект** может интерпретироваться как логическое выражение, в т.ч. списки, словари и т.д.\\ False будет только **пустое или нулевое** значение\\ В сравнении все обычно, присутствуют **and**, **or**, **not**, **is**, **!=, ==** и т.д.\\ ==== Ветвление ==== Условие можно помещать в круглые скобки, но не обязательно, даже не желательно видимо\\ Блок можно размещать в одно строке, даже несколько д-й разделенных ;\\ if x % 2== 0: # chet else: # ne chet if var== "abc": #act1; act2 elif not var: # else: #act1; act2 ==== Цикл for ==== По сути это **foreach**, работает только с последовательностями\\ В конце можно добавить блок **else**, который выполнится (если не было **break**) после цикла\\ # Перебор словаря arr= {"one":1, "two":2, "three":3} for key in arr.keys(): # метод keys() возвращает перечень ключей print(key, arr[key]) else print("complete") # Конкретно для цикла можно обойтись и без keys() for key in arr: print(key, arr[key]) # Тут элементы списка кортежей arr= [(1,2), (3,4)] for a,b in arr: print(a,b) ==== range() и enumerate() ==== **range(<Начало>=0,<Конец>,<Шаг>=1)**- создается особый объект- **диапазон**, поддерживающий итераторы\\ Содержит два метода: * **index(<значение>)**- возвращает индекс элемента по значению * **count(<значение>)**- кол-во элементов с указанным значением for i in range(1, 100): print(i) # 1-100 for i in range(100, 0, -1): print(i) # 100-1 **enumerate(<объект>, =0)**- возвращает кортеж из **индекса и значения** текущего элемента, можно задать начало\\ Функция **не создает список, а возвращает итератор**\\ arr= [1,2,3,4,5,6,7] for i, elem in enumerate(arr): arr[i] *= 2 ==== Цикл while(), continue/break ==== Все так же, в цикле тоже есть ветка **else**\\ print("Input digit") summ=0 while True: x= input("Input: ") if x== "stop": break summ += int(x) print("Summ== ", summ)