Найти тему
Удалёнка

Шпаргалка по 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()

Наука
7 млн интересуются