Кстати, друзья. Почему-то очень как-то мимо прошла тема про деструктуризацию словарей и списков в Python. В отличие от этого в js эта тема была рассмотрена подробнее (spread и rest).
Не могу найти толковых статей по поводу этой фишки на Python, но увидела я интересные примеры в видео https://youtu.be/HrGg6KTJwhA.
Также нашла не очень понятную статью https://codecamp.ru/blog/python-list-destructuring-aka-packing-and-unpacking/, где только про списки.
Все мы помним любимые
но что это значит? https://pythonz.net/references/named/argymenty-vyzova/
они "собирают" в себя все аргументы, превышающие заданный набор.
На самом деле так собирать и разбирать можно не только в рамках аргументов функций, но и просто разбирать списки:
Аналогичная история со словарями, но работает через . Собираются они не так. Если разложить keys = [*dict], то в keys получаем ключи словаря.
```person = {"name": "Olga", "age": 15, "weight": 55}
other_params = {'eye_color': 'brown', 'father': 'David'}
all_data = {**person, **other_params}
В all_data будет {'name': 'Olga', 'age': 15, 'weight': 55, 'eye_color': 'brown', 'father': 'David'}
```В JS если что это работает через ...array или ...object.
Если есть что добавить - пишите. #JS, #Python
Не могу найти толковых статей по поводу этой фишки на Python, но увидела я интересные примеры в видео https://youtu.be/HrGg6KTJwhA.
Также нашла не очень понятную статью https://codecamp.ru/blog/python-list-destructuring-aka-packing-and-unpacking/, где только про списки.
Все мы помним любимые
*args и **kwargs
но что это значит? https://pythonz.net/references/named/argymenty-vyzova/
они "собирают" в себя все аргументы, превышающие заданный набор.
На самом деле так собирать и разбирать можно не только в рамках аргументов функций, но и просто разбирать списки:
first, second, *later = tasks # заберем первую и вторую, остальные отложим
first будет 'todo1'
second будет 'todo2'
later заберет в себя оставшийся список ['todo3', 'todo4']
Допустим нам пришли еще задачки:
new_tasks = ['todo5', 'todo6']
Их можно собрать, разложив два списка:
all_tasks = [*later, *new_tasks]
Получим список ['todo3', 'todo4', 'todo5', 'todo6']
Аналогичная история со словарями, но работает через . Собираются они не так. Если разложить keys = [*dict], то в keys получаем ключи словаря.
```person = {"name": "Olga", "age": 15, "weight": 55}
other_params = {'eye_color': 'brown', 'father': 'David'}
all_data = {**person, **other_params}
В all_data будет {'name': 'Olga', 'age': 15, 'weight': 55, 'eye_color': 'brown', 'father': 'David'}
```В JS если что это работает через ...array или ...object.
Если есть что добавить - пишите. #JS, #Python
Дневник разработчицы
Python VS JS. Функция reduce. В Python https://pythonz.net/references/named/reduce/ В JS https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce Смысл функции в том, что она последовательно пройдет по всем элементам массива…
Через JS открываю для себя Python.
Признаю, что я облажалась. Я тут внезапно для себя открыла, что в Python есть функции map(), filter(), reduce()
https://book.pythontips.com/en/latest/map_filter.html
Просто яо них не знала (на самом деле про map у меня даже в конспекте есть) ими никогда не пользовалась.
Ну да, когда начинаешь учиться и что-то сложно понять, оно просто не запоминается. Зачем использовать какие-то непонятные функции, когда есть циклы?)
А вот в JS уже это было как-то понятно, плюс была некоторая практика на этих функциях.
Мне стыдно. Но ура, теперь, надеюсь, я буду ими пользоваться. #JS, #Python
Признаю, что я облажалась. Я тут внезапно для себя открыла, что в Python есть функции map(), filter(), reduce()
https://book.pythontips.com/en/latest/map_filter.html
Просто я
Ну да, когда начинаешь учиться и что-то сложно понять, оно просто не запоминается. Зачем использовать какие-то непонятные функции, когда есть циклы?)
А вот в JS уже это было как-то понятно, плюс была некоторая практика на этих функциях.
Мне стыдно. Но ура, теперь, надеюсь, я буду ими пользоваться. #JS, #Python
~xОчень редкий зверь - значок тильды в python. Не так просто найти о нем информацию.
Еще иногда встречается использование & и |, когда я впервые увидела их использование, меня это поставило в тупик: а что это и как это понимать.
Самый лучший список всех-всех вариантов разных операторов я нашла тут https://pythonworld.ru/osnovy/peregruzka-operatorov.html
Если стандартные операторы довольно часто используются и легко найти как их "перегружать", то вот с битовым операциями сложнее. И как гуглить такое непонятно. Поэтому сохраняю в закладки).
В некоторых библиотеках перегружают такие операторы для удобства работы.
Например, в Pandas для объединения условий внутри выражения используется как раз операторы & и |:
df.loc[(df.cnt < 1000) & (df.workingday == 0), 'hum']
В исходниках можно найти как они реализованы:
# -------------------------------------------------------------
# Logical Methods
def _logical_method(self, other, op):
return NotImplemented
@unpack_zerodim_and_defer("__and__")
def __and__(self, other):
return self._logical_method(other, operator.and_)
@unpack_zerodim_and_defer("__rand__")
def __rand__(self, other):
return self._logical_method(other, roperator.rand_)
@unpack_zerodim_and_defer("__or__")
def __or__(self, other):
return self._logical_method(other, operator.or_)
@unpack_zerodim_and_defer("__ror__")
def __ror__(self, other):
return self._logical_method(other, roperator.ror_)
Глубже не осилила.
Просто решила поделиться. #Python
Пришел ко мне мой друг Никита и принес вот такое задание от своего знакомого:
И вроде слова все знакомые, но с ходу я даже не поняла, а что вообще требуется.
Мы начали обсуждать и Никита поделился своим вариантом решения, в котором он по сути реализовал дерево с помощью вложенных списков (на базе класса, конечно).
Тут уже у меня возник вопрос, а при чем тут ООП, кроме того, что структура задается с помощью класса. Где тут инкапсуляция, наследование, полиморфизм.
И зацепила меня мысль о том, а как вообще корректно сделать индексы в классе. И как индексы совместить со структурой дерева. Вроде вложенные списки это логично, но это же уже есть в Python, что-то не так.
В общем, пока размышляла, вспомнила, что есть замечательный магический метод getitem, который как раз обеспечивает доступ по индексу или ключу. В итоге, добавив к решению Никиты магические методы, как мне кажется, мы решили задачу.
Заодно поигрались с созданием новых нод в дереве через указание конкретных индексов и просто добавлением в конец списка. Заодно добавили инкапсуляцию)
Вроде задачка простая, все слова знакомые, но лично я раньше не прописывала методы getitem и setitem, поэтому решение пришло не сразу.
А закончили мы еще интересным обсуждением эффекта:
Так как экземпляры внутри списка того же класса, то обращения вида tree[0][0][2] двигаются по ступенькам, очень похоже на рекурсию, только это не вызов самого себя, а просто проход по разным экземплярам одного класса, где используются одни и те же методы для получения следующего. Как глубока кроличья нора!)
Интересная структура и интересная задачка, да. #Python
на собеседовании попросили от руки написать на листочке класс который бы реализовывал хранение данных с доступом по индексу в виде дерева
И чтобы можно было получить доступ по индексу в этом дереве
И вроде слова все знакомые, но с ходу я даже не поняла, а что вообще требуется.
Мы начали обсуждать и Никита поделился своим вариантом решения, в котором он по сути реализовал дерево с помощью вложенных списков (на базе класса, конечно).
Тут уже у меня возник вопрос, а при чем тут ООП, кроме того, что структура задается с помощью класса. Где тут инкапсуляция, наследование, полиморфизм.
И зацепила меня мысль о том, а как вообще корректно сделать индексы в классе. И как индексы совместить со структурой дерева. Вроде вложенные списки это логично, но это же уже есть в Python, что-то не так.
В общем, пока размышляла, вспомнила, что есть замечательный магический метод getitem, который как раз обеспечивает доступ по индексу или ключу. В итоге, добавив к решению Никиты магические методы, как мне кажется, мы решили задачу.
Заодно поигрались с созданием новых нод в дереве через указание конкретных индексов и просто добавлением в конец списка. Заодно добавили инкапсуляцию)
class Node:
def __init__(self, data=None):
self.nodes: List[Node] = []
self.data = data
def add(self, data):
self.nodes.append(Node(data))
def _create_empty_elements(self, key):
for n in range(len(self.nodes), key + 1):
self.nodes.append(Node())
def __setitem__(self, key, value):
if key > -1 and len(self.nodes) < key + 1:
self._create_empty_elements(key)
self.nodes[key].data = value
def __getitem__(self, item):
if item > -1 and len(self.nodes) < item + 1:
self._create_empty_elements(item)
return self.nodes[item]
Вроде задачка простая, все слова знакомые, но лично я раньше не прописывала методы getitem и setitem, поэтому решение пришло не сразу.
А закончили мы еще интересным обсуждением эффекта:
tree[0][0][2] = 'data'
tree[0][0][2].data # вернет 'data'
Так как экземпляры внутри списка того же класса, то обращения вида tree[0][0][2] двигаются по ступенькам, очень похоже на рекурсию, только это не вызов самого себя, а просто проход по разным экземплярам одного класса, где используются одни и те же методы для получения следующего. Как глубока кроличья нора!)
Интересная структура и интересная задачка, да. #Python
Познакомилась с интересной библиотекой для работы с excel. Хочу поделиться.
https://formulas.readthedocs.io/en/stable/
Итак, у меня был здоровый excel с формулами, ссылающимися на разные листы, а листов было довольно много. Внутри куча справочников, зависимостей и тд и тп. Переносить такую логику на бекенд придется месяц, разбирая по ниточке все нюансы.
Почему бы не оставить всю логику в excel и просто заполнять нужные данные? Потому что для получения результата нужно исполнение всех этих формул = открыть excel, чтобы он посчитал.
Что делает магическая библиотека formulas? Она берет excel, парсит из него все формулы и данные, переводит это на python и пересчитывает все, что нужно. Можно даже данные в исходном excel не менять.
Как пользоваться?
Подробности и разные варианты использования смотрите в документации.
Обращаю внимание, что библиотека использует numpy, поэтому ее также придется подключать к проекту. В файле не должно быть битых ссылок, перед использованием проверьте, что все ок.
Пробовала в аргумент outputs для calculate() передать массив значений, которые я хочу получить в результате, но что-то пошло не так и я получила все равно все подряд. Также пыталась вытащить график зависимостей из файла, но тоже безуспешно. #Python, #Tools, #Работа
https://formulas.readthedocs.io/en/stable/
Итак, у меня был здоровый excel с формулами, ссылающимися на разные листы, а листов было довольно много. Внутри куча справочников, зависимостей и тд и тп. Переносить такую логику на бекенд придется месяц, разбирая по ниточке все нюансы.
Почему бы не оставить всю логику в excel и просто заполнять нужные данные? Потому что для получения результата нужно исполнение всех этих формул = открыть excel, чтобы он посчитал.
Что делает магическая библиотека formulas? Она берет excel, парсит из него все формулы и данные, переводит это на python и пересчитывает все, что нужно. Можно даже данные в исходном excel не менять.
Как пользоваться?
input_fileds = {"'[файл]НАЗВАНИЕ ЛИСТА(uppercase)'!A1": "значение"} # А1 - номер ячейки как в excel. Это словарь, можно указать в нем список всех нужных значений для расчета.
solution = xl_model.calculate(inputs=input_fileds) # в результате получаем граф со всеми-всеми заполненными ячейками из excel
result = solution.get_node("'[файл]НАЗВАНИЕ ЛИСТА(uppercase)'!B1") # Для получения конкретного поля из solution
result[0].value[0, 0] # пример как можно вытащить само значение для выбранного поля
Подробности и разные варианты использования смотрите в документации.
Обращаю внимание, что библиотека использует numpy, поэтому ее также придется подключать к проекту. В файле не должно быть битых ссылок, перед использованием проверьте, что все ок.
Пробовала в аргумент outputs для calculate() передать массив значений, которые я хочу получить в результате, но что-то пошло не так и я получила все равно все подряд. Также пыталась вытащить график зависимостей из файла, но тоже безуспешно. #Python, #Tools, #Работа
👍1
Закончилась короткая, но дивная неделька!
Познакомилась с новым:
- декоратор lru_cache.
https://pythonz.net/references/named/functools.lru_cache/
Эта штука кэширует результат выполнения функции для одинаковых атрибутов. В моем случае при использовании библиотеки formulas парсинг excel файла занимал около 9 секунд. Закэшировав функцию с парсингом, я получила постоянный и быстрый доступ к уже готовой xl_model:
```python
@lru_cache(maxsize=2)
def get_model():
xl_model = formulas.ExcelModel().loads(EXCEL_SOURCE).finish(circular=True)
return xl_mod
```
- По умолчанию в PyCharm стоит длина строки 120, а в PEP 79. Я была уверена, что PyCharm мне показывает 79, но нет. Пришлось идти в настройки и править. 79 символов - это так мало(
Есть еще такая штука https://tirinox.ru/flake8-pycharm/, но надо настраивать. Попробую как-нибудь.
- Правильный импорт файла, если он лежит в той же директории, что и скрипт:
- 1_000_000 == 1000000. Божечки-кошечки, это круто. Смысл в том, что число с пробелами не напишешь, а вот так норм.
- ssh и работа с ним (сейчас у опытных чуваков рука-лицо, но да, я никогда не делала этого).
Научилась выполнять команды на сервере через ssh-подключение без переключения на терминал внутри сервера.
Это типа таких вещей:
```shell
scp -i ~/.ssh/key user@host:file . # копирует файл с сервера к себе (если ключ по дефолту, то указывать его не нужно
ssh user@host 'rm file' # в кавычках команда для выполнения
```
Спасибо коллегам за развитие. Познавательно.
И вроде столько всего делала сама, но из таких мелочей, наверное, начинает складываться мастерство. #Python, #Работа, #Tools
Познакомилась с новым:
- декоратор lru_cache.
https://pythonz.net/references/named/functools.lru_cache/
Эта штука кэширует результат выполнения функции для одинаковых атрибутов. В моем случае при использовании библиотеки formulas парсинг excel файла занимал около 9 секунд. Закэшировав функцию с парсингом, я получила постоянный и быстрый доступ к уже готовой xl_model:
```python
@lru_cache(maxsize=2)
def get_model():
xl_model = formulas.ExcelModel().loads(EXCEL_SOURCE).finish(circular=True)
return xl_mod
el```
- По умолчанию в PyCharm стоит длина строки 120, а в PEP 79. Я была уверена, что PyCharm мне показывает 79, но нет. Пришлось идти в настройки и править. 79 символов - это так мало(
Есть еще такая штука https://tirinox.ru/flake8-pycharm/, но надо настраивать. Попробую как-нибудь.
- Правильный импорт файла, если он лежит в той же директории, что и скрипт:
DIR_PATH = os.path.dirname(os.path.realpath(__file__))
EXCEL = 'file.xlsx'
EXCEL_SOURCE = os.path.join(DIR_PATH, EXCEL)
Я видела, конечно, как в Django прописаны импорты, но никогда не делала сама.- 1_000_000 == 1000000. Божечки-кошечки, это круто. Смысл в том, что число с пробелами не напишешь, а вот так норм.
- ssh и работа с ним (сейчас у опытных чуваков рука-лицо, но да, я никогда не делала этого).
Научилась выполнять команды на сервере через ssh-подключение без переключения на терминал внутри сервера.
Это типа таких вещей:
```shell
scp -i ~/.ssh/key user@host:file . # копирует файл с сервера к себе (если ключ по дефолту, то указывать его не нужно
ssh user@host 'rm file' # в кавычках команда для выполнения
```
Банально и все знают? Я раньше не работала с ssh, для меня это все было в новинку.Спасибо коллегам за развитие. Познавательно.
И вроде столько всего делала сама, но из таких мелочей, наверное, начинает складываться мастерство. #Python, #Работа, #Tools
Дневник можно переименовать в еженедельник)
Отчет за недельку:
Докер
Продолжаю познавать докер и перестаю его бояться. Узнала про команды:
- docker stats - выводит состояние запущенных контейнеров (использование CPU, памяти, сети и тп).
Узнала знаете как? Первый раз у меня докер сожрал 18 ГБ памяти, а второй раз проц ушел в полку. Я решила, что хватит это терпеть, пора все же посмотреть, что там происходит.
- docker-compose up container -d
Эта приставка -d делает так, чтобы докер не начал срать своими логами в терминал, когда его запускаешь. Надоело переоткрывать терминал, поэтому сходила и посмотрела как это нормально делается.
Ну и плюс узнала как задать лимит по памяти для контейнера. Но почему-то то, что работало у меня на компе, не завелось на сервере.
logging
Когда я писала логирование для своего проекта, я просто узнала как логировать, написала свою простенькую функцию для логирования (вроде писала о ней выше) и мне было норм. Все мои логи aws заботливо собирает в CloudWatch, там прекрасный интерфейс и я довольная всегда имею доступ ко всем последним событиям на своем проекте, и не только к последним. AWS все сделал за меня! Почти все, функции обкладывала логами все же сама.
А тут на работе понадобилось логи складывать в текстовые файлики и очищать их со временем чем-нибудь, чтобы не засоряли пространство. При этом еще стоило их разделять на отдельные файлики. И пришлось мне таки разобраться как вообще работает logging.
Мне посоветовали https://www.youtube.com/watch?v=qqdgynJ5ATU это видео, но это уже после того как я перерыла кучу инфы в интернете и наваяла вот это:
```python
import logging
import logging.handlers
import os
def get_logger(filename: str):
"""
Функция возвращает logger по имени и сохраняет логи в файлы с
соответствующим названием, разделяя по часам
:param filename: название для logger
:return: logger
"""
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
logger = logging.getLogger(filename)
logger.propagate = False
if not logger.handlers:
log_path = os.path.join(LOG_DIR, f"{filename}.log")
file_handler = logging.handlers.TimedRotatingFileHandler(
log_path, when='h', interval=1, backupCount=90
)
log_formatter = logging.Formatter("[%(levelname)s] "
"%(asctime)s %(message)s")
file_handler.setFormatter(log_formatter)
logger.addHandler(file_handler)
logger.setLevel('INFO')
return logger
```
- обработчики (handlers) сделают всю грязную работу за меня. TimedRotatingFileHandler разделяет файлы по заданным промежуткам времени, параметр backupCount указывает на то, через какое количество созданных файлов их надо чистить.
- форматирование Formatter. Для него полезно знать о том, какие атрибуты вообще есть у лог-записи https://docs.python.org/3/library/logging.html#logrecord-attributes. Я там обнаружила, что есть та вещь, которую я в свое время прописывала ручками в своей функции, а именно funcName - название функции, в рамках которой залогирована запись.
Это круто. Я понимаю, что языки программирования не дураки пишут и библиотеки тоже. Дураки (незнающие) пользуются всем этим добром криво-косо и страдают. А там такое вот чудо.
О дивный новый мир. #Python, #Docker, #Работа
Отчет за недельку:
Докер
Продолжаю познавать докер и перестаю его бояться. Узнала про команды:
- docker stats - выводит состояние запущенных контейнеров (использование CPU, памяти, сети и тп).
Узнала знаете как? Первый раз у меня докер сожрал 18 ГБ памяти, а второй раз проц ушел в полку. Я решила, что хватит это терпеть, пора все же посмотреть, что там происходит.
- docker-compose up container -d
Эта приставка -d делает так, чтобы докер не начал срать своими логами в терминал, когда его запускаешь. Надоело переоткрывать терминал, поэтому сходила и посмотрела как это нормально делается.
Ну и плюс узнала как задать лимит по памяти для контейнера. Но почему-то то, что работало у меня на компе, не завелось на сервере.
logging
Когда я писала логирование для своего проекта, я просто узнала как логировать, написала свою простенькую функцию для логирования (вроде писала о ней выше) и мне было норм. Все мои логи aws заботливо собирает в CloudWatch, там прекрасный интерфейс и я довольная всегда имею доступ ко всем последним событиям на своем проекте, и не только к последним. AWS все сделал за меня! Почти все, функции обкладывала логами все же сама.
А тут на работе понадобилось логи складывать в текстовые файлики и очищать их со временем чем-нибудь, чтобы не засоряли пространство. При этом еще стоило их разделять на отдельные файлики. И пришлось мне таки разобраться как вообще работает logging.
Мне посоветовали https://www.youtube.com/watch?v=qqdgynJ5ATU это видео, но это уже после того как я перерыла кучу инфы в интернете и наваяла вот это:
```python
import logging
import logging.handlers
import os
def get_logger(filename: str):
"""
Функция возвращает logger по имени и сохраняет логи в файлы с
соответствующим названием, разделяя по часам
:param filename: название для logger
:return: logger
"""
if not os.path.exists(LOG_DIR):
os.makedirs(LOG_DIR)
logger = logging.getLogger(filename)
logger.propagate = False
if not logger.handlers:
log_path = os.path.join(LOG_DIR, f"{filename}.log")
file_handler = logging.handlers.TimedRotatingFileHandler(
log_path, when='h', interval=1, backupCount=90
)
log_formatter = logging.Formatter("[%(levelname)s] "
"%(asctime)s %(message)s")
file_handler.setFormatter(log_formatter)
logger.addHandler(file_handler)
logger.setLevel('INFO')
return logger
```
Главные открытия:- обработчики (handlers) сделают всю грязную работу за меня. TimedRotatingFileHandler разделяет файлы по заданным промежуткам времени, параметр backupCount указывает на то, через какое количество созданных файлов их надо чистить.
- форматирование Formatter. Для него полезно знать о том, какие атрибуты вообще есть у лог-записи https://docs.python.org/3/library/logging.html#logrecord-attributes. Я там обнаружила, что есть та вещь, которую я в свое время прописывала ручками в своей функции, а именно funcName - название функции, в рамках которой залогирована запись.
Это круто. Я понимаю, что языки программирования не дураки пишут и библиотеки тоже. Дураки (незнающие) пользуются всем этим добром криво-косо и страдают. А там такое вот чудо.
О дивный новый мир. #Python, #Docker, #Работа
Мои курсы:
0. Когда-то давно для общего развития скорее проходила курсы "Специалист" (от МГТУ им. Баумана) по php и в целом по программированию. Еще проходила https://tutorial.djangogirls.org/ru/, думала с них начать приобщение к питону, но это не сильно все помогло. Но дало хотя бы базовые знания, чтобы совсем не теряться в общении с программистами.
1. Началом изучения программирования я считаю курс https://www.udemy.com/course/bestpython/. До него я пробовала проходить курс от MIT, но шел он довольно тяжело не из-за сложности, а из-за английского и слабого понимания темы. На русском курс пошел легче и стало все как-то понятнее. Прошла его за пару недель (после этого курс автор еще расширил темой про многопоточку и я к нему возвращалась еще на пару недель). Для базы - курс отличный.
2. Курс-любовь, курс-огонь. https://cs50.harvard.edu/x/2021/ Бесплатный, старые лекции можно найти на русском. Это базовый курс, есть еще по разным направлениям (web, ml, мобилки). Первые задания придется выполнять на C, это гораздо больнее, чем на питончике. Но инфраструктура для учебы, офигенные интересные задачи, увлекательные лекции, все это к-к-комбо. Самый лучший курс, который я когда-либо проходила.
3. Начинала курс по алгоритмам https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0. Прошла 6 или 7 лекций. К ним еще есть практика http://judge.mipt.ru/mipt_cs_on_python3/. Уважаю МФТИ и этого лектора в частности за то, что дают доступ к своим лекциям. Это круто. Но... как же я горела с задач, этот поток несвязных цифр на входе и на выходе, эти кривые тесты для проверки... Когда-нибудь я допройду этот курс. Но практику буду искать на кодварс или литкоде.
4. Вдумчиво разбирала первые лекции с канала https://www.youtube.com/c/lbTechOfficial/videos. Тут про паттерны проектирования. SOLID, чистый код, про рефакторинг и тд. Очень хочу вернуться позже к этому каналу, так как на момент прохождения было мало опыта, знаний и понимания.
5. Какой-то курс по вебпаку, что-то по докеру. Дальше вот этот канал был https://www.youtube.com/channel/UCWEHue8kksIaktO8KTTN_zg. На самом try django 2.2 начинала еще на самом старте, но это было так, попытка схватиться за что-нибудь. Упоролась, но прошла курс https://www.youtube.com/watch?v=f1R_bykXHGE. 12 часов растянулись на неделю или две. Но я хотела подсмотреть какие-то практики работы с джангой.
6. А, и еще я где-то там начала проходить курс по web от cs50, сдала половину проектов и просмотрела все лекции, но в итоге не закончила его, так как они меняли контент, я ждала, а в итоге переключилась на другое и не видела большого смысла для себя возвращаться к нему. https://cs50.harvard.edu/web/2020/. Они, кстати, заставляют снимать видео для демо проектов https://www.youtube.com/watch?v=MmLte1ii_5A. А тут я даже в кадре что-то пытаюсь рассказывать https://www.youtube.com/watch?v=fAZq7Qdsvp8
7. Дальше я выла с того, что мне нужен js, а я его не понимаю. Я вроде что-то делала на нем, но как-то не очень получалось. Поэтому я собралась и взяла курс https://www.udemy.com/course/javascript_full/. Прошла, стало как-то понятнее и легче ориентироваться в JS.
8. Параллельно JS, чтобы разнообразить себе жизнь и подтянуть еще одно свое слабое место проходила курс по AWS https://www.youtube.com/playlist?list=PLg5SS_4L6LYsxrZ_4xE_U95AtGsIB96k9. Посмотрела до 45 лекции. Иногда смотрю у этого же автора какие-то темы по инфре, например, у него же смотрела про github actions. Вообще, когда смотрела казалось, что вроде он ничего особенно и не рассказывает, тык-тык, что-то там делает, что я из этого пойму. Но на самом деле потом осознала, что мне стало легче ориентироваться в aws. Я внезапно начала лучше понимать их сокращения и архитектуру сервисов. #Курсы, #Учеба, #Python, #JS
0. Когда-то давно для общего развития скорее проходила курсы "Специалист" (от МГТУ им. Баумана) по php и в целом по программированию. Еще проходила https://tutorial.djangogirls.org/ru/, думала с них начать приобщение к питону, но это не сильно все помогло. Но дало хотя бы базовые знания, чтобы совсем не теряться в общении с программистами.
1. Началом изучения программирования я считаю курс https://www.udemy.com/course/bestpython/. До него я пробовала проходить курс от MIT, но шел он довольно тяжело не из-за сложности, а из-за английского и слабого понимания темы. На русском курс пошел легче и стало все как-то понятнее. Прошла его за пару недель (после этого курс автор еще расширил темой про многопоточку и я к нему возвращалась еще на пару недель). Для базы - курс отличный.
2. Курс-любовь, курс-огонь. https://cs50.harvard.edu/x/2021/ Бесплатный, старые лекции можно найти на русском. Это базовый курс, есть еще по разным направлениям (web, ml, мобилки). Первые задания придется выполнять на C, это гораздо больнее, чем на питончике. Но инфраструктура для учебы, офигенные интересные задачи, увлекательные лекции, все это к-к-комбо. Самый лучший курс, который я когда-либо проходила.
3. Начинала курс по алгоритмам https://www.youtube.com/playlist?list=PLRDzFCPr95fK7tr47883DFUbm4GeOjjc0. Прошла 6 или 7 лекций. К ним еще есть практика http://judge.mipt.ru/mipt_cs_on_python3/. Уважаю МФТИ и этого лектора в частности за то, что дают доступ к своим лекциям. Это круто. Но... как же я горела с задач, этот поток несвязных цифр на входе и на выходе, эти кривые тесты для проверки... Когда-нибудь я допройду этот курс. Но практику буду искать на кодварс или литкоде.
4. Вдумчиво разбирала первые лекции с канала https://www.youtube.com/c/lbTechOfficial/videos. Тут про паттерны проектирования. SOLID, чистый код, про рефакторинг и тд. Очень хочу вернуться позже к этому каналу, так как на момент прохождения было мало опыта, знаний и понимания.
5. Какой-то курс по вебпаку, что-то по докеру. Дальше вот этот канал был https://www.youtube.com/channel/UCWEHue8kksIaktO8KTTN_zg. На самом try django 2.2 начинала еще на самом старте, но это было так, попытка схватиться за что-нибудь. Упоролась, но прошла курс https://www.youtube.com/watch?v=f1R_bykXHGE. 12 часов растянулись на неделю или две. Но я хотела подсмотреть какие-то практики работы с джангой.
6. А, и еще я где-то там начала проходить курс по web от cs50, сдала половину проектов и просмотрела все лекции, но в итоге не закончила его, так как они меняли контент, я ждала, а в итоге переключилась на другое и не видела большого смысла для себя возвращаться к нему. https://cs50.harvard.edu/web/2020/. Они, кстати, заставляют снимать видео для демо проектов https://www.youtube.com/watch?v=MmLte1ii_5A. А тут я даже в кадре что-то пытаюсь рассказывать https://www.youtube.com/watch?v=fAZq7Qdsvp8
7. Дальше я выла с того, что мне нужен js, а я его не понимаю. Я вроде что-то делала на нем, но как-то не очень получалось. Поэтому я собралась и взяла курс https://www.udemy.com/course/javascript_full/. Прошла, стало как-то понятнее и легче ориентироваться в JS.
8. Параллельно JS, чтобы разнообразить себе жизнь и подтянуть еще одно свое слабое место проходила курс по AWS https://www.youtube.com/playlist?list=PLg5SS_4L6LYsxrZ_4xE_U95AtGsIB96k9. Посмотрела до 45 лекции. Иногда смотрю у этого же автора какие-то темы по инфре, например, у него же смотрела про github actions. Вообще, когда смотрела казалось, что вроде он ничего особенно и не рассказывает, тык-тык, что-то там делает, что я из этого пойму. Но на самом деле потом осознала, что мне стало легче ориентироваться в aws. Я внезапно начала лучше понимать их сокращения и архитектуру сервисов. #Курсы, #Учеба, #Python, #JS
👎1🔥1
Давно сюда не писала. Но хочу поделиться ботом, которого перенесла на свой бекенд сегодня, @s_channel_bot.
Это бот, который позволяет отслеживать наиболее популярные посты в каналах.
Изначально он был собран другим человеком через простенький скрипт. Я перенесла этот функционал на свой бекенд проекта Noctua.
Пришлось много поплакать над библиотекой telethon, чтобы добиться адекватного сохранения данных о просмотрах и репостах постов. Нет, на самом деле это не великая проблема, но когда поток сообщений высокий, аккаунтов больше, чем 1, начинаются пляски с бубном.
Жаль, что тележка не предоставляет возможность работать с чужими каналами через бота, и приходится так выворачиваться.
К слову, кто не в курсе, бота нельзя добавить в канал обычным смертным, только админом. Поэтому, чтобы получать сообщения из каналов, приходится заводить пользователей и добавляться в канал как пользователь через кастомный клиент тележки как раз с помощью библиотеки telethon.
Недавно осознала, что перестала бояться незнакомого для меня функционала, новых библиотек и так далее. Вообще перестала так бояться и стрессовать при выкатах и разработке. Все можно порешать, со всем можно разобраться. Если раньше конкретно нервничала, когда что-то шло не так или я не знала как это делать, то сейчас... Ахаха, могу просто залипнуть над решением и орать, если меня отвлекают. Орать. Потому что не трогайте меня, когда я сосредоточена. Нет, большую часть времени я расслабленно что-то делаю, но если я погрузиласть в поток, то не трогайте меня, я не хочу есть/чай/ничего, дайте дописать код спокойно)
На счет нового и интересного функционала, с которым столкнулась. Надо ж поделиться полезным:
1. https://docs.python.org/3/library/textwrap.html встроенная библиотека для того, чтобы разделять текст на нужные по размеру куски. Та же тележка имеет ограничение на объем сообщения. Раньше я ручками писала функции, чтобы резать тексты до нужного объема, но оказывается есть вот такая штука. Удобно.
2. https://docs.python.org/3/library/difflib.html. Мне периодически нужен нечеткий поиск. Недавно я вообще столкнулась с задачей, где в таблице есть список людей, у который в фамилиях есть спецсимволы (ну там немцы, чехи, кто-то там еще со своими умлаутами или как их там). А нужен простенький скрипт, который будет искать нужных людей по фамилии. И вот как быть с этими умлаутами? Короче, эта библиотека - мое спасение. Она сравнивает строки и оценивает их "похожесть", что дает возможность найти нужную фамилию. Работает примерно так:
запрос - caceres
1. A. Cáceres | Совпадение = 0.7058823529411765
2. A. Calver | Совпадение = 0.5
3. L. Cacace | Совпадение = 0.5
4. J. Cabrera | Совпадение = 0.47058823529411764
5. C. Armiento | Совпадение = 0.4444444444444444
Если интересно, то алгоритм описан https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching
Всем удачи и спасибо, что вы со мной! ^_^ #Python, #Tools, #Работа
Это бот, который позволяет отслеживать наиболее популярные посты в каналах.
Изначально он был собран другим человеком через простенький скрипт. Я перенесла этот функционал на свой бекенд проекта Noctua.
Пришлось много поплакать над библиотекой telethon, чтобы добиться адекватного сохранения данных о просмотрах и репостах постов. Нет, на самом деле это не великая проблема, но когда поток сообщений высокий, аккаунтов больше, чем 1, начинаются пляски с бубном.
Жаль, что тележка не предоставляет возможность работать с чужими каналами через бота, и приходится так выворачиваться.
К слову, кто не в курсе, бота нельзя добавить в канал обычным смертным, только админом. Поэтому, чтобы получать сообщения из каналов, приходится заводить пользователей и добавляться в канал как пользователь через кастомный клиент тележки как раз с помощью библиотеки telethon.
Недавно осознала, что перестала бояться незнакомого для меня функционала, новых библиотек и так далее. Вообще перестала так бояться и стрессовать при выкатах и разработке. Все можно порешать, со всем можно разобраться. Если раньше конкретно нервничала, когда что-то шло не так или я не знала как это делать, то сейчас... Ахаха, могу просто залипнуть над решением и орать, если меня отвлекают. Орать. Потому что не трогайте меня, когда я сосредоточена. Нет, большую часть времени я расслабленно что-то делаю, но если я погрузиласть в поток, то не трогайте меня, я не хочу есть/чай/ничего, дайте дописать код спокойно)
На счет нового и интересного функционала, с которым столкнулась. Надо ж поделиться полезным:
1. https://docs.python.org/3/library/textwrap.html встроенная библиотека для того, чтобы разделять текст на нужные по размеру куски. Та же тележка имеет ограничение на объем сообщения. Раньше я ручками писала функции, чтобы резать тексты до нужного объема, но оказывается есть вот такая штука. Удобно.
2. https://docs.python.org/3/library/difflib.html. Мне периодически нужен нечеткий поиск. Недавно я вообще столкнулась с задачей, где в таблице есть список людей, у который в фамилиях есть спецсимволы (ну там немцы, чехи, кто-то там еще со своими умлаутами или как их там). А нужен простенький скрипт, который будет искать нужных людей по фамилии. И вот как быть с этими умлаутами? Короче, эта библиотека - мое спасение. Она сравнивает строки и оценивает их "похожесть", что дает возможность найти нужную фамилию. Работает примерно так:
запрос - caceres
1. A. Cáceres | Совпадение = 0.7058823529411765
2. A. Calver | Совпадение = 0.5
3. L. Cacace | Совпадение = 0.5
4. J. Cabrera | Совпадение = 0.47058823529411764
5. C. Armiento | Совпадение = 0.4444444444444444
matcher = SequenceMatcher(lambda x: x in " .", name.lower(), query.lower())
matcher.ratio() #Совпадение
Если интересно, то алгоритм описан https://en.wikipedia.org/wiki/Gestalt_Pattern_Matching
Всем удачи и спасибо, что вы со мной! ^_^ #Python, #Tools, #Работа
Закончила задачу с 3D аватарами. У blender есть python api и можно запускать скрипты с помощью cli. Изначально писать код и дебажить пришлось в самом блендере, потом вынесла его в скрипт. Теперь запускаю скрипт и формируются нужные опоры для эмоций и удаляется все лишнее.
Правда, возни получается все равно много пока. Надо скачать аватара, запустить на нем скрипт блендера, залить в проект, сделать превью через js-скрипт, который вызывается через get-параметр при загрузке страницы с аватаром. Дичь) Но так как это разовая операция, пока нет смысла все это оптимизировать.
Было забавно, когда начала заливать новых аватаров обнаружился косяк с глазами. Поверх глаз аватарок начали накладываться лишние ресницы. Поковырявшись, нашла лишние глаза для женской анимации стандартной фигуры стояния (по дефолту аватары в T-позе).
Я безумно рада, что я разобралась и сделала эту задачу. Изначально я даже не знала как к ней подойти. Плюс еще одна победа, хехей! #Работа, #Python, #Tools
Правда, возни получается все равно много пока. Надо скачать аватара, запустить на нем скрипт блендера, залить в проект, сделать превью через js-скрипт, который вызывается через get-параметр при загрузке страницы с аватаром. Дичь) Но так как это разовая операция, пока нет смысла все это оптимизировать.
Было забавно, когда начала заливать новых аватаров обнаружился косяк с глазами. Поверх глаз аватарок начали накладываться лишние ресницы. Поковырявшись, нашла лишние глаза для женской анимации стандартной фигуры стояния (по дефолту аватары в T-позе).
Я безумно рада, что я разобралась и сделала эту задачу. Изначально я даже не знала как к ней подойти. Плюс еще одна победа, хехей! #Работа, #Python, #Tools
👍4🔥3
Просто делюсь эмоциями...
Да простят меня коллеги, но сил нет.
Второй день переписываю кусок кода, который и ранее уже немного правила. И все еще негодую) Просто одно и тоже гоняется туда-сюда, такое ощущение, что писали индусы, которым платят за строчки, но иногда они вдруг пытаются сэкономить! внезапно! и там где стоило бы разнести как раз на несколько строк, наоборот впихивают все в одну.
Зачем я это делаю? Я хочу несколько запросов делать асинхронно, но для этого мне надо вытащить их из общего потока задублированного по сути кода. Терпения мне.
Пример бесячего однострочника:
И вот такого довольно много #Работа, #Python
Да простят меня коллеги, но сил нет.
Второй день переписываю кусок кода, который и ранее уже немного правила. И все еще негодую) Просто одно и тоже гоняется туда-сюда, такое ощущение, что писали индусы, которым платят за строчки, но иногда они вдруг пытаются сэкономить! внезапно! и там где стоило бы разнести как раз на несколько строк, наоборот впихивают все в одну.
Зачем я это делаю? Я хочу несколько запросов делать асинхронно, но для этого мне надо вытащить их из общего потока задублированного по сути кода. Терпения мне.
Пример бесячего однострочника:
ignore_fail = getattr(result, 'ignore_fail', False) and (kwargs['level'] == 2 and session.mode == LessonMode.CHOICES_TEST_TWO_STEP)
И вот такого довольно много #Работа, #Python
🤯3👍1