Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя
Python Middle Developer   · 23 июн 2022  · happypython.ru

Полноценная шпаргалка по Python для новичков.

Я сразу оговорюсь, что описание примеров — личный опыт, наблюдения и много практики. Если мое мнение не соответствует вашему — значит так и должно быть. Если вы считаете, что здесь не полностью раскрыты некоторые моменты — значит так и должно быть. В общем и целом — знакомимся, помечаем, сохраняем, учимся.
Точка входа ( Прописываем место начала выполнения кода)
В питоне нашем любимом и самом лучшем языке в мире ( ага, да) код выполняется сверху вниз без т.н «точки входа» или корневой функции в которой все начинается. Если посмотреть на C# или другие OOП — ориентированные языки, то там все стартует из main функции, ну или кратко сказать — там указано откуда старт. Хорошим тоном и в целом правильно ( по моему мнению) будет создание этой точки в ваших скриптах. Так вы укажете последовательность запуска функций и избавитесь от многих ошибок.
if __name__ == '__main__': 
 some_main_func()
Списки ( упорядоченная изменяемая последовательность элементов)
По спискам уже было написано переписано, серьезно, и мной и вообще по всему интернету вот тут можете мою статью посмотреть
Короче срезы: [от : до : с шагом]
lst = [from_inclusive : to_exclusive : step_size]
Добавляем элементы в список. Просто запоминаем. ( Это два варианта, а не один)
lst.append(item)
lst += [item]
Объединяем два списка в один. Все просто ( И тут два варианта, мало ли)
lst.extend(second_lst) 
lst += second_lst
Сортировка беспощадная. Прямая, обратная, по элементам. Все как мы любим
lst.sort()
lst.reverse() 
lst = sorted(lst)
lst = reversed(lst)
sorted_by_second = sorted(lst, key=lambda item: item[1])
sorted_by_both = sorted(<collection>, key=lambda item: (item[1], item[0]))
Суммирование элементов коллекции
sum_of_elements = sum(lst)
elementwise_sum = [sum(pair) for pair in zip(list_a, list_b)]
Преобразование нескольких списков в один ( не путать с append)
flatter_list = list(itertools.chain.from_iterable(lst)) 
product_of_elems = functools.reduce(lambda out, x: out * x, lst)
Делаем список из слова (Разбиваем по символам)
list_of_chars = list(some_string)
Один из способов получить индекс элемента в коллекции
index = lst.index(item)
Вставка и удаление по индексу. Сразу расскажу, что pop удаляет элемент по его индексу возвращая этот или крайний элемент коллекции, а remove удаляет элемент при первом его обнаружении ( в случае если такого нету ждите ошибку ValueError). Ну и clear чистит все, логично.
lst.insert(index, item) item = lst.pop([index])
lst.remove(item) 
lst.clear() 
Словари
Получаем ключи, значения и пары ключ-значение из словарей самое основное и часто путаемое.
view = <dict>.keys() 
view = <dict>.values() 
view = <dict>.items()
Как получить значение по ключу. Скопируйте, запомните, запишите.
  1. Возвращает default если ключ не найден
  2. Создает значение в словаре, если такого ключа нет.
value = <dict>.get(key, default=None)  
value = <dict>.setdefault(key, default=None) 
Делаем словари со значениями по умолчанию.
<dict> = collections.defaultdict(some_value) # Создаёт словарь с дефолтным значением some_value
<dict> = collections.defaultdict(lambda: 1)# Создаёт словарь с дефолтным значением 1.
Также можно создавать словари из последовательностей пар ключ-значение или из двух последовательностей:
dict = dict(lst)
dict = dict(zip(keys, values))
Опять pop. Только тут pop удаляет значение по ключу.
value = dict.pop(key)
Фильтруем значения словаря по ключам, костыль еще тот, зато наглядно.
{key: val for key, val in dict.items() if key in keys}
Множества (неупорядоченная неизменяемая совокупность УНИКАЛЬНЫХ значений)
Как и в случае со списками, в множество мы можем воткнуть как одно значение, так и коллекцию.
set_my = set() set_my.add(item) 
set_my.update(collection)
Самый полезный скилл всех множеств, пересечение, объединение, разность множеств. Те механики, которые часто используют, что бы отфильтровать повторяющиеся значения или найти дубликаты в двух последовательностях.
(Конечно любую последовательность мы переводим в множество сначала)
set_my = set_1.union(set_2) # Или: set_1 | set_2 
set_my = set_1.intersection(set_2) # Или: set_1 & set_2 
set_my = set_1.difference(set_2) # Или: set_1 - set_2 
set_my = set_1.symmetric_difference(set_2) # Или: set_1 ^ set_2
И тут мы хотим найти есть ли коллекция или ее часть внутри множества.
<bool> = <set>.issubset(<coll.>) # Или: <set> <= <set>
<bool> = <set>.issuperset(<coll.>) # Или: <set> >= <set>
Удаляем элементы из множества ( Первый способ вызовет исключение, если такого нету)
<set>.remove(item) 
<set>.discard(item)
Именованный кортеж 
Кортеж — сам по себе это неизменяемый список. А именованный кортеж — просто содержит имена этих элементов. Из него можно получить элемент как по индексу, так и по имени ( и тут пошли мысли про словарь, но помним про неизменяемость)
from collections import namedtuple
Point = namedtuple('Point', 'x y') 
p = Point(1, y=2) 
Point(x=1, y=2) 
p[0] 
#1 
p.x 
#1
Функции-генераторы
В отличие от обычных функций, функции-генераторы поставляют значения, приостанавливая свою работу для передачи результата вызывающей программе. При этом они сохраняют информацию о состоянии, чтобы возобновить работу с места, где были приостановлены ( кстати именно такую вещь я использовал в качестве декоратора в Django, что бы вызывать функцию еще раз в случае ошибки)
def count(start, step):
     while True:
              yield start
              start += step
              counter = count(10, 3)
              next(counter), next(counter), next(counter)

 (10, 13, 16)
Определяем тип
Да, питон с динамической типизацией, но это не спасет вас от ошибок с типами данных. Учимся проверять тип данных.
some_var = type(some_item)
# <class 'int'> / <class 'str'> / etc.

from numbers import Integral, Rational, Real, Complex, Number
<bool> = isinstance(<el>, Number) #возвращает True или False 
Работа со строками (часто используются эти моменты)
Очищаем строку от лишних пробелов или символов в начале и конце:
<str> = <str>.strip() <str> = <str>.strip('<chars>')
Делим строку по пробелу или по определенному символу
<list> = <str>.split()  
<list> = <str>.split(sep=None, maxsplit=-1)
Используем join, что бы слепить несколько отдельных элементов в строку ( join перед собой может принимать еще и символ, который будет стоять перед каждым словом, чаще всего это пробел)
<str> = <str>.join(<list>)
Замена слов (или букв) в строке
old — старое слово или символ
new — новое соответственно
<str> = <str>.replace(old, new [, count]) 
Как проверить ,что строка начинается или оканчивается с определенного значения 
<bool> = <str>.startswith(<sub_str>) 
<bool> = <str>.endswith(<sub_str>)
Как узнать состоит ли строка из цифр
<bool> = <str>.isnumeric()
Ввод данных с клавиатуры
Как ввести данные с клавиатуры, для работы внутри кода.
prompt — это текст, который будет выведен в строке ожидания ввода (типа «введите число». Явно указывать prompt не обязательно.
<str> = input(prompt=None)
<str> = input ("Введите число: )
Аргументы функции
На первом месте всегда находятся позиционные аргументы, а на втором - именованные, то есть сначала указываем наши аргументы, а потом дефолтный, если нужно ( если никаких аргументов передавать не требуется или он всегда один
def f(<nondefault_args>, <default_args>): # def f(x, y=0) <function>(<positional_args>, <keyword_args>) # f(0, y=0)
Можем передавать список аргументов произвольной длины.
В этом случае последовательность *args передаётся в качестве позиционных аргументов. Пары ключ-значение из словаря **kwargs передаются как отдельные именованные аргументы, выше про них говорил.
args = (1, 2)
kwargs = {'x': 3, 'y': 4, 'z': 5} 
func(*args, **kwargs)
Аналогично будет так.
func(1, 2, x=3, y=4, z=5) 
Синтаксических сахар (упрощаем код и пишем красиво)
Анонимные функции, генераторы и прочие страшные вещи.
<function> = lambda: <return_value>
<function> = lambda <argument_1>, <argument_2>:<return_value>
Генератор списка
<list> = [i+1 for i in range(10)] 
# [1, 2, , 10] 
Генератор множества
<set> = {i for i in range(10) if i > 5} 
# {6, 7, 8, 9} 
Генератор словаря
<dict> = {i: i*2 for i in range(10)} 
# {0: 0, 1: 2, , 9: 18}
В генераторе можно производить действия с каждым элементов перед формированием коллекции
<iter> = (i+5 for i in range(10)) 
# (5, 6, , 14)
Применяем функцию к каждому элементу последовательности:
<iter> = map(lambda x: x + 1, range(10)) 
# (1, 2, , 10)
Отфильтруем элементы последовательности, которые больше 5:
<iter> = filter(lambda x: x > 5, range(10)) 
# (6, 7, 8, 9) 
Следующая функция вычисляет сумму элементов последовательности:
from functools import reduce
<int> = reduce(lambda out, x: out + x, range(10)) 
# 45
Декораторы
Страшная тема, которую как огня боятся новички ( честно, не вру, часто встречал и спрашивал)
По сути своей декоратор берет на вход функцию (прописывается над нашей функцией), добавляет к ней дополнительные действия при каждом вызове.
@decorator_name
def function_that_gets_passed_to_decorator():
 
Например, декоратор для отладки, возвращающий имя функции при каждом вызове, выглядит следующим образом:
from functools import wraps 
def debug(func):
     @wraps(func)
          def out(*args, **kwargs):
                   print(func.__name__)         
                   return func(*args, **kwargs)    
          return out
@debug
def add(x, y):     
   return x + y
wraps - это вспомогательный декоратор, который копирует метаданные функции add() в функцию out()
Без неё 'add.name' возвращает 'out'
Классы
Да, Питон поддерживает и процедурное программирование, и ООП ему не особо и важен, но это для новичков. Профи всегда делают красиво и классы нужно знать
Метод  init вызывается при создании нового экземпляра класса. Метод str вызывается при выполнении преобразования объекта в строку для вывода.
class <name>:
     def __init__(self, a):
              self.a = a     
     def __str__(self):
             return str(self.a) 
Вот наследование класса от другого класса. Мы можем взять родитель и переопределить в нем некоторые поля или добавить новые.
Это как берем уже готовый кабриолет и ставим на него крышу, есть ли смысл делать новый кабриолет?
class Person:
     def __init__(self, name, age):
              self.name = name         
              self.age = age 
             class Employee(Person):      
             def __init__(self, name, age, staff_num):          super().__init__(name, age)          self.staff_num = staff_num
Обработка исключений
Если у вас есть ошибки (а они будут), то вы всегда можете задать определенные действия в случае появления таковых. это блок try except
while True:     try:        x = int(input('Пожалуйста, введите число: '))     except ValueError:        print('Упс! Ввод неверный! Попробуйте ещё раз')     else:       print('Thank you.')       break
Вы сами можете вызвать исключение, и не ждать появления ошибки.
raise ValueError('Свое сообщение об ошибке') 
Вот интрукция finally заставит в любом случае выполнить код внутри него, вне зависимости от исключений. Оно будет, но код в finally выполнится.
try:   raise KeyboardInterrupt
finally:   print('Goodbye, world!')
Goodbye, world! Traceback (most recent call last):    File "<stdin>", line 2, in <module> KeyboardInterrupt
Аргументы командной строки
Вы можете передать аргументы сразу при вызове вашего .py скрипта из командной строки, для этого нужен модуль 
sys
:
import sys script_name = sys.argv[0] arguments = sys.argv[1:]
#пример
python main.py 1 
script_name будет содержать 1
Работа с файлами
Для того, чтобы открыть файл в Python, передаём путь 
<path>
в 
open
:
Но стоит сказать, что в таком случае вам придется файл принудительно закрыть. Что бы этого не случилось используем конструкцию with ( с ней пример ниже):
<file> = open('<path>', mode='r', encoding=None) 
Итак, режимы:
'r'  - чтение (по умолчанию)
'w'  - запись (предыдущее данные в файле удаляются)
'x'  - запись или ошибка, если файл уже существует
'a'  - добавление
'w+' - чтение и запись (с предварительным удалением)
'r+' - режим чтения и записи с начала
'a+'- то же самое, только с конца
't' - текстовый режим (по умолчанию)
'b' - бинарный режим
Чтение из файла( с конcтрукцией with):
def read_file(filename):
     with open(filename, encoding='utf-8') as file:
              return file.readlines()
Запись в файл:
def write_to_file(filename, text):
     with open(filename, 'w', encoding='utf-8') as file:
              file.write(text)
Работ с папками (директориями)
Для работы с файловой системой ОС используется модуль os
В примере проверяем:
Существует ли такой файл или каталог ( проще сказать такой путь)
То, что находится по нашему пути — файл?
То, что находится по нашему пути — каталог?
from os import path, listdir
 <bool> = path.exists('<path>') 
 <bool> = path.isfile('<path>') 
 <bool> = path.isdir('<path>')
Все, что лежит в каталоге смотрим так
<list> = listdir('<path>')
Найдём все файлы с расширением .gif: (используем стандартный модуль glob)
 from glob import glob
 glob('../*.gif') ['1.gif', 'yandex.gif']
Используем интерфейс для базы данных 
Стандартно Питон очень дружит с SQLite. Вот как подключаемся и закрываем подключение к ней
import sqlite3 db = sqlite3.connect('путь к файлу БД')
#делаем дела темные
db.close()
Что бы отправить запрос ( на языке SQL ) к базе данных, используем execute
cursor = db.execute('<запрос>')
if cursor:
     <tuple> = cursor.fetchone() # Первая запись.     
     <list> = cursor.fetchall() # Все записи.
Если мы меняем значения в БД или добавляем новые, то обязательно сохраняем все действия в БД
db.execute('<запрос>)
db.commit() 
От Автора: 
Все примеры были найдены на просторах гитхаб, но описывать прям все в одной статье оказалось очень сложно и перегружено. Подписывайтесь на наш паблик ВК, и там вы найдете очень много похожих материалов, а так же продолжение этого карманного справочника.
Паблик помощи новичкам в Python (пишем парсеры с фриланс заказов)Перейти на happypython.ru
4 эксперта согласны
Борис Державец
подтверждает
Очень хорошо написано. Вот только каждому по заслугам его не воздастся.
Тимур Галимов
подтверждает
Полезная и доступная информация в сжатых рамках👍🏼
Не понял про точку входа. Все определения объектов, которые записаны в файле (def, глобальные присваивания и т.д.) – это исполняемые операторы. Они должны выполниться, чтобы можно было использовать описанные в них объекты. О какой точке входа идёт речь?
@Вадим Румянцев, в этой ситуации я хотел показать аналогию т.н main() функции которая есть в ООП-языках типа C# и плюсов, когда выполнение программы начинается из строго определенного места вне зависимости от того, какие модули подключены к коду и какие функции или переменные подключены в начале.
По дефолту в Python весь код начинает выполняться сверху вниз и использовать точку входа не обязательно, но в больших проектах, когда у вас код разбит на несколько файлов использование такой конструкции if name == 'main': дает вам возможность назначить главный файл откуда начнется выполнение и вызов всех остальных подключенных скриптов. Точка входа - это просто название, которое перешло уже из ООП- ориентированных языков)