ch
Feedback
9 байт Вотякова. Айти, прога

9 байт Вотякова. Айти, прога

前往频道在 Telegram

Про айти, прогу и всё с ними связанное Основной канал: @votyakov_ar_life По рекламе писать @leeramsay

显示更多
676
订阅者
+224 小时
+27
+530
帖子存档
Библиотека 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 (и этого уже будет хватать), а с другой — на нем можно построить целые классы, кастомизированные под себя. Часто этот модуль используется при обучении модель машинного обучения и нейронных сетей. Если тебе зашла такая рубрика, то ставь 🔥 а также пиши в комменты обзор какой библиотеки еще сделать :)

Почему я не стал лютым программистом Многие не понимают, почему я, имеющий предрасположенность к математике и проге, все же не стал углубляться в профессию прогера. На то есть несколько причин: 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 и если она зашла, то ставим ❤️. И запоминаем решение, оно нам еще пригодиться :) #алгоритминутка

Асимптотика решения №2
Anonymous voting

Асимптотика решения №1
Anonymous voting

from rich import inspect my_list = ["foo", "bar"] inspect(my_list, methods=True)
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 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:")
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)
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 подобна полезному помощнику, который эффективно очищает память, предотвращая ее утечки и автоматически освобождая ресурсы. Это позволяет разработчикам сосредоточиться на непосредственном написании кода, не беспокоясь об управлении памятью. Пост написан на основе этой и этой статей.

Второй вариант. Функция foo()
Второй вариант. Функция foo()

Первый вариант. Функция factorial()
Первый вариант. Функция factorial()

Библиотека 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 — длина списка, то какая асимптотика второго алгоритма?
Anonymous voting

Если n — длина списка, то какая асимптотика первого алгоритма?
Anonymous voting