9 байт Вотякова. Айти, прога
Kanalga Telegram’da o‘tish
Про айти, прогу и всё с ними связанное Основной канал: @votyakov_ar_life По рекламе писать @leeramsay
Ko'proq ko'rsatish676
Obunachilar
+224 soatlar
+27 kunlar
+530 kunlar
Postlar arxiv
Библиотека Faker
Библиотека faker — библиотека для генерации фальшивых данных. Представим такую ситуацию: вы регистрируетесь на каком-то сайте и вам нужно ввести ФИО, город проживая, телефон и так далее. Чтобы немного позабавиться можно сгенерировать данные при помощи этой библиотеки)
Установка библиотеки
pip install Faker
Введение
Импортируем библиотеку и устанавливаем русский язык:
from faker import Faker
fake = Faker("ru_RU")
Что можно генерировать? Буквально все! Полный перечень можно найти здесь, а мы остановимся на основных моментах. faker случайно генерирует данные, поэтому данные в примерах могут отличатся от данных, полученных на вашем компьютере.
1. Адреса
1) Индекс: fake.postcode() —> 090231
2) Название улицы: fake.street_name() —> пр. Весенний
3) Адрес на улице: fake.street_address() —> пер. Боровой, д. 9/3 к. 7
4) Название страны: fake.country() —> Мали
5) Название города: fake.city() —> с. Каргасок
6) Полный адрес: fake.address() —> к. Сасово, ул. Геологов, д. 3 стр. 898, 082376
2. Имена
1) Мужское ФИО: fake.name_male() —> Елисеев Фадей Харлампович
2) Женское ФИО: fake.name_female() —> Пелагея Сергеевна Волкова
3) Имя, фамилию и отчество можно генерировать и по отдельности
3. Доп. информация
1) Профессия: fake.job() —> Звукорежиссёр
2) Номер телефона: fake.phone_number() —> +7 706 901 0655
3) Сайт: fake.hostname() —> db-44.samsonov.info
4) Почта: fake.ascii_free_email() —> uljan_67@gmail.com
5) Ссылка: fake.uri() —> http://gruppa.ru/explore/tagpost.jsp
6) Компания: fake.company() —> ООО «Матвеев, Исакова и Самойлова»
А теперь напишем свою функцию для генерации данных для регистрации на сайте. В словарь будем добавлять поля, которые нас интересуют, а затем возвращать их в виде строки:
from faker import Faker
def generate_registration_data(is_male=True, extra_info=False):
fake = Faker("ru_RU")
data = {}
if is_male:
data["ФИО"] = fake.name_male()
else:
data["ФИО"] = fake.name_female()
data["Адрес"] = fake.address()
data["Телефон"] = fake.phone_number()
data["Почта"] = fake.ascii_free_email()
if extra_info:
data["Профессия"] = fake.job()
data["Компания"] = fake.company()
return "\n".join([item[0] + ": " + item[1] for item in data.items()])
print(generate_registration_data(extra_info=True))
Разумеется, не нужно пользоваться faker для генерации данных на сайтах гос.услуг, банках и т.д. 😜Библиотека Tqdm
Библиотека tqdm — позволяет пользоваться индикатором выполнения (progressbar) в консоли. Им можно пользоваться, если у тебя долго работает программа, и ты хочешь знать на каком этапе выполнения она находиться.
Установка библиотеки
pip install tqdm
Простой и наглядный пример (запусти на своем компе!):
В функцию tqdm нужно подать любой итерируемый объект.
from tqdm import tqdm
from time import sleep
for i in tqdm(range(100), ncols=80, ascii=True, desc='Total'):
sleep(0.1) # засыпаем на 0.1 секунду
Некоторые дополнительные параметры tqdm():
ncols — ширина progressbar
ascii — для кодировки ASCII
desc — текст в начале панели progressbar
Оптимизированный range()
Класс tqdm.trange(i) - это специальный оптимизированный экземпляр tqdm.tqdm(range(i)). Аргументы, которые он принимает при инициализации, аналогичны конструктору класса tqdm.tqdm():
from tqdm import trange
from time import sleep
for i in trange(100, ncols=80, desc='Total'):
sleep(0.1)
Динамическое изменение progressbar
Если отдельно создать экземпляр класса tqdm.tqdm(), то можно динамически (то есть во время выполнения программы) менять значение progressbar, например, его описание. Код ниже будет поочередно менять буквы английского алфавита в описании к progressbar:
from tqdm import tqdm
from time import sleep
from string import ascii_letters
pbar = tqdm(ascii_letters, ncols=80)
for char in pbar:
sleep(0.25)
pbar.set_description(f"Processing '{char}'")
Модуль tqdm довольно универсальный: с одной стороны, в нем можно пользоваться только одной функцией tqdm (и этого уже будет хватать), а с другой — на нем можно построить целые классы, кастомизированные под себя.
Часто этот модуль используется при обучении модель машинного обучения и нейронных сетей.
Если тебе зашла такая рубрика, то ставь 🔥 а также пиши в комменты обзор какой библиотеки еще сделать :)Repost from Вотяков | Саморазвитие
Почему я не стал лютым программистом
Многие не понимают, почему я, имеющий предрасположенность к математике и проге, все же не стал углубляться в профессию прогера. На то есть несколько причин:
1. Я готовил ребят к олимпиадам и егэ со своего 10-го класса, весь фокус у меня был на этом, так что на развивающуюся сферу программирования я не обращал внимания.
2. По причине первого пункта, когда случился “прогерский бум”, мне уже было совсем не солидно идти джуном.
3. В школе и универе вообще никто никак не профориентировал. Я не понял кем хочу быть и решил стать бездельником абсолютным победителем преподавателем и предпринимателем.
4. Слишком много денег зарабатывал. Несмотря на то, что все программисты зарабатывают 300кк/наносек, а точнее столько, я уже зарабатывал больше на репетиторстве, и менять компетенции с понижением в доходе было бы очень больно морально.
5. Последняя причина - я люблю преподавать. Меня это драйвило всегда, и это то, в чем я имею больше компетенции. В программировании я бы может и стал классным и богатым, но приносило бы мне это кайф? Возможно. Этот кайф был бы сопоставим с преподаванием? Точно нет.
Хотел с вами поделиться этими размышлениями, выводы пусть каждый сделает сам, но точно можно утверждать одно: классно, когда твое дело одновременно приносит тебе и хороший доход, и по-настоящему заряжает тебя.
Хочу понять, нравится ли вам такой формат постов? Стоит ли продолжать делиться с вами подобным опытом? Ставьте 🔥, если ответ положительный)
И пишите в комментах, нашли ли вы свое дело, где ваша формула карьерного успеха = max(компетенции*доход*драйв)?
Рубрика "Алгоритминутка"
Дан список целых чисел
nums и целое число target, нужно вернуть индексы двух чисел так, чтобы их сумма равнялась target.
Можно предполагать, что задача имеет одно решение. Одно число нельзя использовать дважды. Ответы можно вернуть в произвольном порядке.
Примеры:
1) nums = [2,7,11,15], target = 9 —> [0,1]
2) nums = [3,2,4], target = 6 —> [1,2]
3) nums = [3,3], target = 6 —> [0, 1]
Решение №1
0) Напрашивается запустить два цикла по списку с индексами i, j
1) Так как решение гарантировано есть (по условию), то в какой-то момент nums[i] + nums[j] = target. И мы решили задачу
def solve(nums, target):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
Предлагаю ниже в опросе оценить эффективность такого решения
Решение №2
0) Заведем словарь, в котором ключами будут элементы списка, а значениями будут их индексы (если элемент встречается несколько раз, то будем хранить последний индекс).
1) Пройдемся по списку циклом и на каждой итерации будем считать "недостающий" элемент до целевого значения: x = target - nums[i].
2) Если x встречается в словаре и его индекс отличен от i, то мы нашли такую пару индексов. Иначе идем дальше
def solve(nums, target):
data = {}
for i in range(len(nums)):
data[nums[i]] = i
for i in range(len(nums)):
x = target - nums[i]
if x in data and data[x] != i:
return [i, data[x]]
Решаем эту задачку на LeetCode и если она зашла, то ставим ❤️. И запоминаем решение, оно нам еще пригодиться :)
#алгоритминуткаfrom rich import inspect
my_list = ["foo", "bar"]
inspect(my_list, methods=True)
from rich import pretty, print
from math import pi
pretty.install()
print([False, True, pi, "Hello World!"])from rich import print
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:")Библиотека rich
Вам еще не надоел скучный дизайн Python-консоли? Предлагаю его обновить с помощью библиотеки rich! Rich — это библиотека Python для создания насыщенного текста и красивого форматирования в консоли (даже смайлики можно использовать!).
Как установить?
pip install rich
Чтобы узнать на что способна эта библиотека, введите в консоли: python -m rich
Hello, World
Когда начинаешь программировать или изучать какую-то новую технологию, то обязательно нужно написать вывод "Hello, World". Давайте это сделаем вот так:
from rich import print
print("Hello, [bold magenta]World[/bold magenta]!", ":vampire:")
Сделайте это в своей консоли и посмотрите на результат :)
Красивый принт по умолчанию
Если не хочется возиться с цветами и прочим, то можно подключить функцию pretty.install(), с помощью которой все значения будут выводиться красиво.
from rich import pretty, print
from math import pi
pretty.install()
print([False, True, pi, "Hello World!"])
Отчет с rich
С помощью функции inspect() можно создать отчет об любом Python-объекте. Рассмотрим на примере списка:
from rich import inspect
my_list = ["foo", "bar"]
inspect(my_list, methods=True)
Если понравилась статья и вы хотите больше интересных постов про Python, то ставьте 🔥
А продолжение читайте в документации)from rich import inspect
my_list = ["foo", "bar"]
inspect(my_list, methods=True)Сборщик мусора в Python
В Python как и в других языках программирования (например, Java) есть сборщик мусора. Для чего он нужен? Сборщик мусора помогает в управлении памяти, периодически удаляя из нее ненужные объекты.
Python использует два алгоритма для сборки мусора: подсчет ссылок и generational garbage collector (GC). Алгоритм подсчёта ссылок простой и эффективный: объекты удаляются как только на них больше нет ссылок. Но у него есть минус — он не может определять циклические ссылки. Поэтому существует GC, который следит за объектами с потенциальными циклическими ссылками.
GC может быть отключен, в то время как алгоритм подсчета ссылок отключить нельзя.
Алгоритм подсчета ссылок
Функция
getrefcount() из библиотеки sys позволяет узнать сколько переменных ссылается на какой-то объект. Обычно sys.getrefcount() возвращает количество на единицу больше, чем можно ожидать, потому что включает временную ссылку в качестве аргумента.
Пример №1
import sys
x = [1, 2, 3]
print(sys.getrefcount(x)) # 2
Здесь все работает интуитивно: на объект списка ссылается переменная x и еще одна ссылка добавляется из-за функции getrefcount().
Пример №2
Python кэширует маленькие целые числа. Попробуем вызвать эту функцию от 1 (ответ программы может отличаться на разных компьютерах)
import sys
x = 1
print(sys.getrefcount(x)) # 87
Python не удаляет объекты маленьких чисел, даже если на них никто не ссылается. Это связано с тем, что небольшие целые числа используются очень часто и чтобы не создавать новый объект числа каждый раз, Python их кэширует. На объектах типа list, float это не работает — они удаляются как только на них перестали ссылаться.
Garbage collector (GC)
Алгоритм подсчета ссылок не справляется с задачей, если появляются циклические ссылки. Циклические ссылки возникают, если объект хранит ссылку на самого себя (см. картинку).
Давайте проверим насколько нужен GC: отключим его и попробуем подсчитать количество ссылок на наши объекты. Создадим циклические ссылки как на рисунке:
import gc
import ctypes
# используется ctypes для доступа к объектам по адресу памяти
class PyObject(ctypes.Structure):
_fields_ = [("refcnt", ctypes.c_long)]
gc.disable() # выключаем циклический GC
lst = []
lst.append(lst) # создаем циклическую ссылку lst <--> lst
lst_address = id(lst) # сохраняем адрес списка lst
del lst # удаляем ссылку lst
# создаем циклические ссылки: object_1 --> object_2 и object_2 --> object_1
object_1 = {}
object_2 = {}
object_1['obj2'] = object_2
object_2['obj1'] = object_1
obj_address = id(object_1)
# удаляем ссылки
del object_1, object_2
# раскомментируйте для запуска ручной сборки объектов с циклическими ссылками
# gc.collect()
# проверяем счетчик ссылок
print(PyObject.from_address(obj_address).refcnt)
print(PyObject.from_address(lst_address).refcnt)
Если оставить GC выключенным, то останется по одной ссылке на объекты. Если же включить GC, то есть раскомментировать строчку gc.collect(), то GC удалит все ссылки и программа выведет два нуля.
То есть если объект содержит циклическую ссылку и мы его удаляет, то ссылка никуда не пропадает (если отключен GC). Поэтому задача GC находить такие объекты и удалять их.
Сборка мусора в Python подобна полезному помощнику, который эффективно очищает память, предотвращая ее утечки и автоматически освобождая ресурсы. Это позволяет разработчикам сосредоточиться на непосредственном написании кода, не беспокоясь об управлении памятью.
Пост написан на основе этой и этой статей.Библиотека pysnooper
pysnooper — это Python библиотека с открытым кодом с помощью которой можно получить полный лог функции.
Логирование — это способ записи информации о состоянии программы. Логами называют сами записи.
Вместо того чтобы писать много принтов с выводом каких-то переменных можно добавить всего лишь одну строчку с подключением pysnooper, который выведет изменения локальных переменных, отработавшие строки и время их выполнения.
Первый вариант
Можно повесить декоратор
@pysnooper.snoop() целиком на функцию, тогда при вызове этой функции в консоль будет выводиться лог для этой функции. Рассмотрим это на примере функции факториала, который работает рекурсивно (это не самая идеальная реализация факториала, рекурсия взята для примера)
import pysnooper
@pysnooper.snoop()
def factorial(x):
return 1 if x == 1 else x * factorial(x - 1)
print(factorial(3))
Второй вариант
Но что если нам не нужно выводить весь лог функции, а нужно только конкретную часть?
import pysnooper
import random
def foo():
lst = []
# генерируем список из 10 элементов
for i in range(10):
# добавляем в список случайное число из диапазона 1, 1000
lst.append(random.randrange(1, 1000))
# с помощью конструкции with выводим лог только для вложенных строк
with pysnooper.snoop():
# считаем минимальный, максимальный и их среднее арифметическое
lower = min(lst)
upper = max(lst)
mid = (lower + upper) / 2
# выводим их на экран
print(lower, mid, upper)
foo()
Логгирование в файл
В примерах выше информация печаталась в консоль, иногда это не удобно. Чтобы печатать лог в файл необходимо в функцию snoop() передать в виде строки путь до файла, в котором будет лог программы.
Например, при таком вызове pysnooper.snoop("log_file.log") создастся файл log_file.log на уровне запускаемого файла.
Если тоже лень писать бесконечные print и использовать дебаг, то ставь 🔥 и используй эту библиотеку :)Если n — длина списка, то какая асимптотика второго алгоритма?
Если n — длина списка, то какая асимптотика первого алгоритма?
