Задать вопрос
Ответы пользователя по тегу Python
  • Как решить проблему с SQLite3?

    Vindicar
    @Vindicar
    RTFM!
    С чего ты взял, что возвращаемое значение второй раз будет не None? Ты проверял, что данные заносятся?
    Собственно, в том и ошибка - у тебя уже есть запись с таким userid, второй раз вставить нельзя.

    А твоя GetInfo() не работает. Почему? Внезапно, в SQL сравнение - это =, а не ==. А ошибку тебе не пишет, потому что ты сделал except: pass. За такую практику вообще надо бить по пальцам линейкой, надеюсь, ты теперь понял почему.
    Ну и до кучи, если хочешь проверить существование, то лучше сделать запрос вида SELECT COUNT(*) FROM main WHERE user_id = ? или
    SELECT EXISTS(SELECT * FROM main WHERE user_id = ?)
    . Эти запросы гарантированно вернут одну строку с одним значением, 0 или 1. 0 - строка не существует, 1 - строка существует.
    Ответ написан
    1 комментарий
  • Как или с помощью чего сделать Telegram бота, который выполняет скрипт по заданному времени?

    Vindicar
    @Vindicar
    RTFM!
    aioschedule посмотри.
    Ответ написан
    Комментировать
  • Как отменить, отображение текста, при пересылке?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, сначала проверять на форвард, потом уже писать текст. Поменяй блоки местами
    А вообще какой потаённый смысл в первом if, если у тебя все ветки одинаковые? Почему не написать составное условие?
    Ответ написан
    Комментировать
  • Как расчитать кол-во вариантов при рандомизации текста?

    Vindicar
    @Vindicar
    RTFM!
    Обозначим одну подстановку как "терм", и допустим, что все варианты в терме уникальны (т.е. нет повторений внутри одного терма).
    Для терма {} количество комбинаций равно количеству вариантов в терме.
    Для терма [] количество комбинаций равно количеству перестановок вариантов в терме, т.е. факториал от количества комбинаций.
    Для всего выражения количество комбинаций должно быть равно произведению количеств комбинаций для каждого терма.

    С вложенными вариантами чуть сложнее.
    Для {} количество вариантов это по сути сумма их весов.
    Для [] количество вариантов считается так: количество перестановок вариантов, умноженное на произведение весов вариантов.
    У простой строки вес 1, у вложенного терма вес равен количеству его комбинаций.
    Таким образом, можно посчитать число комбинаций рекурсивно.

    import math
    
    class RandomChoice(list):
        pass
    
    class RandomOrder(list):
        pass
    
    def random_choice(options) -> int:
        total = 0
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total += random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total += random_order(option)
            else:
                total += 1
        return total
    
    def random_order(options) -> int:
        total = math.factorial(len(options))
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(option)
            # а для просто варианта ничего делать не надо
        return total
    
    def total_count(items) -> int:
        total = 1
        for item in items:
            if isinstance(item, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(item)
            elif isinstance(item, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(item)
        return total
    
    sample = [
        'я', 
        RandomChoice(['купил', 'приобрел']), # 2
        RandomChoice(['на ярмарке','на рынке','в магазе']), # 3
        RandomChoice(['сыр', #8
            RandomOrder(['соль, ','хлеб, ','муку, ']), # 6
            'сахар']),
    ]
    
    
    combos = total_count(sample)
    print(combos)
    Ответ написан
    3 комментария
  • Как искать по ключам в словаре?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, словари на то и словари, чтобы находить значение по ключу.
    some_dict = {
    0: 'foo',
    1: 'bar',
    2: 'baz',
    }
    
    key = 1
    print(some_dict[key])


    Во-вторых, а что за значение ты используешь в качестве ключа (lvl)? Ты уверен, что оно корректное?
    Ответ написан
  • Какой самый легкий путь для создания модели с помощью машинного обучения?

    Vindicar
    @Vindicar
    RTFM!
    Не использовать машинное обучение, а сначала попробовать другие методы.
    Если искомый объект подвергается только параллельному переносу, пробуй поиск по шаблону (opencv template matching).
    Если он контрастен и также подвергается повороту и масштабированию, можешь искать по локальным особенностям (opencv feature matching).
    Если известно максимальное смещение за кадр, можешь ускорить код, ведя поиск объекта только в окрестности предыдущего расположения.

    И только если у тебя целая категория разнообразных, но похожих объектов, и ты готов предоставить неколько десятков тысяч изображений как с наличием, так и с отсутствием искомого объекта, только тогда стоит задумываться о машинном обучении.
    Ответ написан
  • Как автоматизировать отправку сообщения в Телеграм на Python?

    Vindicar
    @Vindicar
    RTFM!
    aiogram для написания телеграм-бота.
    aioschedule, чтобы не велосипедить планировщик.
    Ответ написан
    Комментировать
  • APScheduler что делать с этим варнингом?

    Vindicar
    @Vindicar
    RTFM!
    Модуль warnings в помощь.
    Ответ написан
    Комментировать
  • Кто знает в чем проблема с модулями?

    Vindicar
    @Vindicar
    RTFM!
    У тебя циклический импорт, так делать нельзя.
    Оформи код, использующий name или list, как функцию, и пусть она это значение принимает как параметр.
    Импортируй файл с функцией в другой модуль, и вызывай её оттуда.
    Ответ написан
    Комментировать
  • Почему не работает перенаправление вывода в файл (subprocess Python)?

    Vindicar
    @Vindicar
    RTFM!
    (перехватывать вывод в subprocess.PIPE, а после записывать это в файл)

    Просто укажи в качестве stdout и stderr открытые на запись файловые объекты, Popen() сделает всё остальное.
    Кода буквально две строчки, а бонусом нормальные исключения при ошибке доступа, плюс можно использовать tempfile.NamedTemporaryFile(), если файлы должны быть временными, а не постоянными.
    Ответ написан
    3 комментария
  • Бот не отправляет переменные?

    Vindicar
    @Vindicar
    RTFM!
    'Карта: " + str(a) + " " + str(b) + " " + str(c) + " " + str(d) +"\nCVV: " + str(e))'

    У тебя внешние кавычки одни, а внутренние другие. Так что весь этот фрагмент - одна строковая константа, а двойные кавычки внутри - просто символы.
    К слову, научись использовать f-строки.
    f"Карта: {a} {b} {c} {d}\nCVV: {e}"
    Ответ написан
    Комментировать
  • Как сократить данную строчку?

    Vindicar
    @Vindicar
    RTFM!
    Еще один товарищ, который считает, что a == 2 or 3 означает "(а равно 2) или (а равно 3)".
    Тогда как на самом деле это "(а равно 2) или (3 != 0)", что всегда равно "истина", независимо от значения a.

    Вот честно, откуда вы все берёте эту идею? Ни на каком другом Q&A сайте я такого не видел.

    Правильно будет или a == 2 or a == 3, или a in (2, 3)
    Ответ написан
    2 комментария
  • Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?

    Vindicar
    @Vindicar
    RTFM!
    Еще один шикарный пример вопроса не по теме. В заголвоке вопроса лаги, а по делу
    Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?


    Потому что ты рисуешь множество прямоугольников, не стирая их.
    Когда ты рисуешь прямоугольник - ты изменяешь изображение. И следующий рисуешь уже на изменённом изображении. Вот и получается множество прямоугольников.

    Тебе нужно делать копию оригинального изображения, рисовать на ней, и показывать эту изменённую копию.
    import cv2
    import sys
    import matplotlib.pyplot as plt
    original = cv2.imread(sys.argv[1])
    ix = -1
    iy = -1
    drawing = False
    
    def draw_reactangle_with_drag(event, x, y, flags, param):
        global ix, iy, drawing, original
        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True
            ix = x
            iy = y
        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing == True:
                img = original.copy()
                cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
                cv2.imshow("Title of Popup Window", img)
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            img = original.copy()
            cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
            print(ix, iy, x, y)
            cv2.imshow("Title of Popup Window", img)
    
    cv2.namedWindow(winname= "Title of Popup Window")
    cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)
    cv2.imshow("Title of Popup Window", original)
    while True:
        if cv2.waitKey(10) == 27:
            break
    cv2.destroyAllWindows()


    А вообще, если ты хочешь сделать выделение области рамкой, cv2.selectROI() в помощь.
    Ответ написан
    3 комментария
  • Каким образом посчитать большое кол-во чисел после запятой?

    Vindicar
    @Vindicar
    RTFM!
    Плавающая точка тут не поможет, её точность ограничена, и это не свойство языка.
    Ты можешь попытаться схитрить, определив число знаков после запятой у исходного числа и умножив его на соответствующую степень 10 (т.е. убрав точку). Тогда ты возведёшь в квадрат целое, а Питон умеет работать с длинными целыми. Но имей ввиду, когда ты потом разделишь результат на удвоенную степень 10, ты снова потеряешь точность. Так что при выводе придётся считать цифры и писать десятичный разделитель вручную.
    Ответ написан
  • Как правильно совместить циклы с функциями?

    Vindicar
    @Vindicar
    RTFM!
    Ну простейший вариант:
    # типы данных. Они могут быть классами, или описаниями вида typing.Tuple[int, str]
    # так как ты не описал типы данных, я пишу тут заглушки typing.Any (т.е. что угодно)
    # эти типы лучше описать в отдельном файле, который будет импортироваться остальными
    Snaphot = typing.Any
    PreparedSnapshot = typing.Any
    SnapshotResult = typing.Any
    
    # функции обработки. они могу быть раскиданы по отдельным файлам, 
    # но они должны импортить нужные модули, в т.ч. описание типов данных
    # ни одна функция не должна выбрасывать исключения
    def get_snapshot(site: str, name: str) -> typing.Optional[Snapshot]:
        "Качает один снапшот с сайта и возвращает его, или None если была ошибка."
        ...
    
    def prepare_snapshot(snapshot: Snapshot) -> typing.Optional[PreparedSnapshot]:
        "Подготавливает один снапшот к обработке. Возвращает None при ошибке."
        ...
    
    def process_prepared_snapshot(snapshot: PreparedSnapshot) -> typing.Optional[SnapshotResult]:
        "Извлекает нужные сведения из одного снапшота и возвращает их как структуру данных, или None при неудаче."
        ...
    
    # эта функция будет в главном запускаемом файле
    # главный файл должен импортировать остальные
    targets = zip(...)  # ну или как ты там делаешь список
    # и вот тут уже главный цикл
    # вариант А - классический цикл
    results: typing.List[SnapshotResult] = []
    for site, name in targets:
        snap = get_snapshot(site, name)
        if snap is not None:
            prepared = prepare_snapshot(snap)
            if prepared is not None:
                result = process_prepared_snapshot(prepared)
                if result is not None:
                    results.append(result)
    # вариант Б - более функциональный подход
    # фильтрует коллекцию, отбрасывает None
    def skipNone(items):
        return filter(lambda item: item is not None, items)
    
    results: typing.List[SnapshotResult] = list(skipNone(
        map(process_prepared_snapshot, skipNone(
            map(prepare_snapshot, skipNone(
                get_snapshot(site, name) for site, name in targets
            ))
        ))
    ))
    # в любом случае, у тебя есть список результатов results, делай с ним что хочешь.


    К слову, у тебя очень кривой zip() в примере кода.
    aList = "http://сайт-со-снепшотами.com"
    bList = ['список',  'имен',  'для',  'снепшотов', 'и', 'так', 'далее'] 
        for a, b in zip(aList, bList):

    У тебя zip() даст
    ('h', 'список'), ('t', 'имен'), ('t', 'для'), ('p', 'снепшотов'), (':', 'и'), ('/', 'так'), ('/', 'далее'), ...
    Ответ написан
    4 комментария
  • Как правильно рекурсивно обойти словарь?

    Vindicar
    @Vindicar
    RTFM!
    Если вложенность словаря неизвестна, то проще всего рекурсией.
    def process_dict(d: dict):
        pass  # тут работаешь с этим словарём
        # рекурсивный вызов для вложенных словарей
        subresults = [process_dict(subdict) for subdict in d['subCategories']]
        pass # тут объединяешь результаты от вложенных словарей с основным результатом
        return ... # обязательно возвращаешь результат
    Ответ написан
    Комментировать
  • Как фиксировать изменение значения переменной в Python?

    Vindicar
    @Vindicar
    RTFM!
    Не так, переменная меняется не присвоением ей значения, а за счет парсинга с сайта

    Вот что я люблю в вопросах от нубов - никогда не знаешь, про что вопрос на самом деле.
    Твой вопрос звучит так, словно тебя интересует любое присвоение значения переменной, даже если новое значение равно старому. И советы тебе дают в этом направлении. А тебе ведь нужно обнаружить изменение значения, так? Если так, читай дальше.

    Тебе нужно сохранять предыдущее значение переменной. Если программа работает постоянно - можно сохранить в другой переменной. Если нужно, чтобы сведения пережили перезапуск - сохраняй в файл или ещё куда.
    Так или иначе, по завершению парсинга, когда у тебя есть новое значение, ты сравниваешь его со старым. И если они не равны, реагируешь на это. Ну и сразу переносишь новое значение в переменную для старого, чтобы при следующем сравнении уже сравнивать с более новым. Что-то типа:
    old_value = None
    while True:
        new_value = parse_site()  # parse_site() - написанная тобой функция, которая возвращает искомое значение
        if old_value is not None and new_value != old_value:  # если это не первый раз, и значение изменилось
            print('Значение изменилось!')
        old_value = new_value  # чтобы в следующий раз сравнивать с последним увиденным значением
        time.sleep(600)  # спим 10 минут, чтобы не долбить сайт запросами


    Ну и да, неважно откуда ты берёшь значение. Ты всё равно присваиваешь его переменной. Всё равно.
    Если ты этого не понимаешь - отложи свой парсер, и почитай хороший учебник по Питону, того же Марка Лутца, "Изучаем Питон".
    Ответ написан
    Комментировать
  • Как ввести лист в ячейку mysql?

    Vindicar
    @Vindicar
    RTFM!
    Не нужно пихать структуру данных в ячейку БД. Выдели под элементы списка отдельную таблицу (отдельные таблицы) и свяжи её с основной таблицей по ключу.
    Ответ написан
    Комментировать
  • Как сделать программу добавляющую словарь в словарь?

    Vindicar
    @Vindicar
    RTFM!
    slovar[username] = {"Name":name}
    slovar[username] = {"Familia":familia}
    slovar[username] = {"Data":ddmmyy}
    slovar[username] = {"Nomer":nomer}

    Ты перезаписываешь slovar[username] каждый раз.
    slovar[username] = {
        "Name":name,  # инглиш
        "Familia":familia, # рунглиш
        "Data":ddmmyy, # рунглиш
        "Nomer":nomer,  # рунглиш
    }
    Ответ написан
    1 комментарий
  • Как из txt файла вытащить строки с одинаковым началом?

    Vindicar
    @Vindicar
    RTFM!
    Очень просто.
    dialogue = dict()  # обычный питоновский словарь
    
    # datasource - коллекция строк. Но данные можно читать и построчно из файла 
    # with open('text.txt', 'rt') as datasource:
    datasource = """mom - Hello, do you need anything in the shop?
    brother - Yes, bring some fruits
    dad - And beer
    mom - okey
    dad - thx
    brother - thx
    """.split()  
    
    for line in datasource:
        actor, _, text = line.split(' - ')  # разбиваем строку на две части
        if _ is not None:  # нашли разделитель, действуем
            # если нужного ключа не было, создать его с указанным значением,
            # (в нашем случае с новым пустым списком) и вернуть это значение
            # а если ключ был, то просто вернуть его значение
            actor_lines = dialogue.setdefault(actor.lower(), [])
            actor_lines.append(text)
    print(dialogue)


    Можно и с defaultdict, так несколько удобнее:

    from collections import defaultdict 
    # если у словаря спрашивают неизвестный ключ, он по-тихому 
    # поместит по этому ключу пустой список, и отдаст этот список
    # этот словарь будет хранить результат
    dialogue = defaultdict(list)  # list - фабрика новых значений
    
    # datasource - коллекция строк. Но данные можно читать и построчно из файла 
    # with open('text.txt', 'rt') as datasource:
    datasource = """mom - Hello, do you need anything in the shop?
    brother - Yes, bring some fruits
    dad - And beer
    mom - okey
    dad - thx
    brother - thx
    """.split()  
    
    for line in datasource:
        actor, _, text = line.split(' - ')  # разбиваем строку на две части
        if _ is not None:  # нашли разделитель, действуем
            # если нужного значения ключа не было, defaultdict сам создаст запрошенный ключ
            # так что мы гарантированно получим список
            dialogue[actor.lower()].append(text)
    
    print(dialogue)
    Ответ написан
    Комментировать