- Сравнение объектов
- Итерирование объектов
- Добавление и извелечение
- Интерполяция и подстановка
- Коллекции
- Параметры функций
- Lambda функции
- Импорт модулей
- Классы
- Декораторы
- Функции высшего порядка
- With - менеджер контекста
- Виртуальное окружение
- Популярные библиотеки
Сравнение объектов
== - сравнивает содержимоеis - сравнивает указатель на объект
аналог between в sql:
>>> 0 <= a <= 10
Итерирование объектов
foreachfor country in ["Denmark", "Finland", "Norway", "Sweden"]: print(country)
обход мапы:
for name, email in emails.items():items() - преобразовывает мапу в список туплов
обход списка с условием
[expression for item in iterable if condition]
реализация итерируемого объекта:
class Repeater: def __init__(self, value): self.value = value def __iter__(self): return self def __next__(self): return self.valueчто делает for:
repeater = Repeater('Привет') iterator = repeater.__iter__() while True: item = iterator.__next__() print(item)
Метод итератор через yield
def letter_range(a, z): while ord(a) < ord(z): yield a a = chr(ord(a) + 1)
Добавление и извелечение
добавление элемента в список (список мутирует)>>> seeds = ["sesame", "sunflower"] >>> seeds += ["pumpkin"]объединение словарей (3,5+):
zs = {**xs, **ys}substr
seq[start:end:step]reverse str
s[::-1]кроме regex есть встроенные проверки на разные типы у строки:
s.isdigit()
Интерполяция и подстановка
подставновка"The novel '{0}' was published in {1}".format("Hard Times", 1854) "{who} turned {age} this year".format(who="She", age=88)подстановка с обращением к элементу множества:
{0[1]} #так же можно обращаться объектам через точкуподстановка с форматированием
"{0:25}".format(s) # минимальная ширина поля вывода 25 "{:%B %d, %Y}".format(datetime.now()) #форматирование датыподстановка через f (3.6+)
f'{datetime.now():%Y-%m-%d %H:%M:%S%z}'краткая подстановка (deprecated)
'Привет, %s' % nameУдобный просмотрт объекта:
json.dumps(mapping, indent=4, sort_keys=True)поддерживает не все типы данных, для всего лучше подходит:
pprint.pprint(mapping)
Коллекции
именнованный tuple (аналог case class scala)collections.namedtuple("название", "список полей через пробел")как case class позволяет менять часть полей (repalce), копировать через make
Но есть еще более близкий аналог в либе SimpleNamespace:
from types import SimpleNamespace car1 = SimpleNamespace(цвет='красный') car1.цвет = 'asd'
генерация списка
list(range(n))
В set могут попадать только immutable объекты, к которым применим hash
почти все коллекции в питоне мутабельные
Клонирование коллекции
поверхностное копирование - если в списке есть ссылочные объекты, то копируется ссылка
songs[:] #через равно была бы ссылкадля рекурсивного клонирования всего, нужно исопльзовать:
copy.deepcopy(x)
доступ к словарю с значением по умолчанию
userid.get(userid, 'всем') #всем будет, если userid не найдетсячерез мапу с гетом удобно делать ветвление, если в значение положить функцию
Сортировка по элементу объекта
sorted(xs.items(), key=lambda x: x[1]) #пример: по значению мапы
оператор членства
>>> p = (4, "frog", 9, -33, 9, 2) >>> 2 in p #Trueработает со строками как со списком байт:
"v" in "Peace is no longer permitted during Winterval"
Параметры функций
параметры функций изменяемые для всех вызовов функции:def append_if_even(x, lst=[]): # плохо!распаковка параметров функции
def product(*args): for arg in args:kwargs - содержит именнованные параметры
отключение позиционных параметров:
def heron2(a, b, c, *, units="meters"):к параметру units можно обратиться только по имени
получание мапы именнованных параметров:
def print_setup(**options): print(options['a']) print_setup(a="123")
функции можно создавать с аннотациями типов:
def is_unicode_punctuation(s : str) -> bool:
Lambda функции
s = lambda x: "" if x == 1 else "s" s(123) #s
Функции фильтрации, обхода и reduce:
list(map(lambda x: x ** 2, [1, 2, 3, 4])) list(filter(lambda x: x > 0, [1, -2, 3, -4])) functools.reduce(lambda x, y: x * y, [1, 2, 3, 4])
Импорт модулей
import os.pathаналог:
from os import pathпакет - каталог и файл __init__.py
в файле можно указывать:
- список модулей для загрузки всего:
__all__ = ["Bmp", "Jpeg", "Png", "Tiff", "Xpm"]
Предопредленные переменные:
__name__ - будет равно имени модуля при импорте, и __main__ - при запуске из консоли
if __name__ == "__main__": import doctest doctest.testmod()
динамическое программирование
__import__(...) - импорт модуля по имени
compile(source, file, - объект с результатом компиляции объекта
Классы
все классы неявные наследники objectвстроенные методы:
__new__() - заготовка объекта, вызывается до init
__init__() - конструктор
__eq__() - для сравнения
__repr__() - строка, которую с помощью eval можно превратить обратно в объект
__str__() - представление при выводе в консоль
переменная объявленная в классе может модифицироваться из всех объектов
если создать внутри функции как self.var1 , то только из конкретного объекта
нет приватных методов, но их можно эмулировать через __var (префикс __ - дандер)
переменная переименовывается в _класс__переменная
декоратор @property - метод только для чтения
метод класса - удобно использовать для фабрики, когда возращается новый класс
@classmethod def margherita(cls): return cls(['моцарелла', 'помидоры'])
есть множественное наследование
class FileStack(Undo, LoadSave):
вместо общих ошибок, с кастомным текстом, лучше делать сразу кастомные exception через наследование
class NameTooShortError(ValueError): pass def validate(name): if len(name) < 10: raise NameTooShortError(name)
Декораторы
реализация своего декоратора - определяет новую локальную функцию, которая вызывает оригинальную функциюdef positive_result(function): def wrapper(*args, **kwargs): result = function(*args, **kwargs) assert result >= 0, function.__name__ + "() result isn't >= 0" return result wrapper.__name__ = function.__name__ wrapper.__doc__ = function.__doc__ return wrapperболее котороткий вариант, включает доку и название
def positive_result(function): @functools.wraps(function) def wrapper(*args, **kwargs): result = function(*args, **kwargs) assert result >= 0, function.__name__ + "() result isn't >= 0" return result return wrapper
декоратор с параметрами: @bounded(0, 100)
def bounded(minimum, maximum): def decorator(function): @functools.wraps(function) def wrapper(*args, **kwargs): result = function(*args, **kwargs) if result < minimum: return minimum elif result > maximum: return maximum return result return wrapper return decorator
в декораторе есть название функции и передаваемые параметры, т.е. его удобно использовать для логирования и отладки (__debug__ - признак отладки)
к функции может быть применено несколько декораторов
Функции высшего порядка
Реализация через класс:class Strip: def __init__(self, characters): self.characters = characters def __call__(self, string): return string.strip(self.characters) strip_punctuation = Strip(",;:.!?") #__init__ класса strip_punctuation("Land ahoy!") # __call__: 'Land ahoy'
Через вложенные функции:
def make_strip_function(characters): def strip_function(string): return string.strip(characters) return strip_function
Частично подготовить функции можно через functools:
reader = functools.partial(open, mode="rt", encoding="utf8") reader("file.txt")
With - менеджер контекста
замена try + finnalywith expression as variable: suiteexpression должен реализовывать __enter__() и __exit__()
contextlib - однострочный вариант нескольких конекстов:
with contextlib.nested(open(source), open(target, "w")) as (fin, fout): for line in fin:
Виртуальное окружение
создание виртуальной среды питон в папке ./venv:python3 -m venv ./venv
активация (переход) в виртуальную среду
source ./venv/bin/activateПри активации прописываются пути в path:
PATH="$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH" export PATHв коде дополнительно появляются переменные __VENV*__ с информацией об окружении
установка пакетов будет идти в виртуальной папке и теперь не нужны права админа:
pip install schedule
выход из виртуальной среды
deactivate
Комментариев нет:
Отправить комментарий