Задать вопрос
Ответы пользователя по тегу Python
  • Проблема с кодом на Python. Поможете?

    Vindicar
    @Vindicar
    RTFM!
    pronoun == "I" or "he" or "she" or "it"
    Так работать не будет. Если тебе нужно проверить несколько вариантов, либо используй логическое ИЛИ правильно
    pronoun == "I" or pronoun == "he" or pronoun == "she" or pronoun == "it"

    либо проверяй на вхождение в коллекцию
    pronoun in ("I", "he", "she", "it")
    Ответ написан
    1 комментарий
  • Почему не работает поиск уникального числа в списке?

    Vindicar
    @Vindicar
    RTFM!
    Пропускаешь свой список через Collections.Counter, получишь число вхождений каждого элемента.
    Потом ищешь элементы, у которых число вхождений равно 1.

    А если хочешь именно циклом, то можно так:
    def find_uniqs(arr):
        uniqs = set()
        srtd = sorted(arr)  # список идёт по возрастанию
        for i in range(1, len(srtd)-1):
            # если элемент не равен соседям, то он один такой в списке
            if srtd[i-1] != srtd[i] and srtd[i] != srtd[i+1]:
                uniqs.add(srtd[i])
        # обрабатываем края списка, если они есть, т.е. список из >1 элемента
        if len(srtd) > 1:
            if srtd[0] != srtd[1]:
                uniqs.add(srtd[0])
            if srtd[-1] != srtd[-2]:
                uniqs.add(srtd[-1])
        elif srtd: # у нас один элемент в списке?
            uniqs.add(srtd[0]) # ну тогда его и добавляем.
        return uniqs
    Ответ написан
    2 комментария
  • Ошибка в 5 строке. как сделать без ошибки?

    Vindicar
    @Vindicar
    RTFM!
    Включаю режим телепатии... ошибка "SyntaxError: unexpected EOF while parsing"?
    Если да, то включить голову и подумать.
    Ты вызываешь a=eval(t.get()). Т.е. пытаешься выполнить код, записанный в поле ввода t.
    Учитывая, что у тебя интерфейс ещё только создаётся, в этом поле ввода сейчас пусто.
    Строка выполняется до того как ты увидишь окно и успеешь туда что-то ввести.
    Вот eval() и ругается на пустую строку.
    Собственно, замечания только 2.
    1. Напиши обработчик щелчка по кнопке, и забирай значение из поля ввода в этом обработчике.
    2. На кой огурец тебе eval()? Чем int() не устроил?
    Ответ написан
    5 комментариев
  • Как убрать все цвета с фото кроме черного?

    Vindicar
    @Vindicar
    RTFM!
    image: numpy.ndarray = ...  # тут твоё изображение как массив BGR-пикселей формой (H,W,3)
    mask = image.max(axis=2) > 35  # логический массив формой (H,W), где True будет там,
    # где наибольшая составляющая соответствующего пикселя > 35
    image[mask] = [255,255,255]  # заменяем значения пикселей, помеченных маской, на желаемые.

    Магия numpy, однако.
    Ответ написан
    4 комментария
  • Python. Не могу понять данный пример на фото, объясните подробнее и попроще??

    Vindicar
    @Vindicar
    RTFM!
    Срезы пишутся в виде "откуда:докуда" или "откуда:докуда:шаг", при этом любая часть может быть опущена, получив значение по умолчанию.
    "откуда" определяет номер первого элемента, который мы выбираем, включительно. Если он опущен, то это эквивалент указания 0.
    "докуда" определяет номер первого элемента, который мы УЖЕ НЕ выбираем, т.е. не включительно. Если он опущен, то это эквивалент "до конца списка".
    "шаг" определяет шаг, с которым мы идём по коллекции, т.е. берем ли мы каждый элемент, или каждый второй (через один), или каждый третий, и так далее. Если шаг не указан, то это эквивалент шага 1.

    В общем-то и всё, остались мелочи типа отрицательного шага (идём в обратном порядке). Что именно непонятно?
    Ответ написан
    1 комментарий
  • Как научить чат-бота в телеграм воспринимать буквы?

    Vindicar
    @Vindicar
    RTFM!
    q.execute("update config set bitcoin = " + str( new_bitcoin ) + " where id = 1")

    За такое надо бить по рукам. Железной линейкой. Поясню почему:
    если new_bitcoin присвоить число 1234 или строку "1234", то получим запрос
    update config set bitcoin = 1234 where id = 1
    Этот запрос синтаксически корректен с точки зрения языка SQL.
    А вот если new_bitcoin присвоить строку "foobar", получим запрос
    update config set bitcoin = foobar where id = 1
    С точки зрения SQL это обращение к столбцу foobar. Которого, разумеется, нету.

    А теперь, внимание, вопрос: какого огурца ты не ознакомился с азами использования СУБД, а именно с синтаксисом подстановки значения?
    Читай тут, начиная со слов "Instead, use the DB-API’s parameter substitution". Осознай, и больше так не делай.

    Ну и до кучи: что будет, если в bitcoin будет строка вида "0; --"?
    update config set bitcoin = 0; -- where id = 1
    Всё, что после "--" это комментарий, и будет проигноировано. Т.е. запрос перезапишет весь столбец bitcoin нулями.
    Ответ написан
    Комментировать
  • Как перевести с Python на php?

    Vindicar
    @Vindicar
    RTFM!
    Ну например, curl для запросов и функции json для работы с форматом.
    Ответ написан
    Комментировать
  • Python как обновить вывод в консоли?

    Vindicar
    @Vindicar
    RTFM!
    Кури curses или аналоги. Но встроенный модуль curses работает только под линуксом, а под винду нужно поискать что-то другое, типа asciimatics или unicurses.
    Ответ написан
    Комментировать
  • Unittest в Python?

    Vindicar
    @Vindicar
    RTFM!
    Приведенный код - это и есть юнит-тест.
    Юнит-тест проверяет, что отдельный модуль (класс, функция и т.п.) реализует ожидаемое поведение, как наблюдаемое снаружи, так и реализуемое внутри. Иными словами, он проверяет соответствие модуля ожидаемому интерфейсу.
    Интеграционный тест проверяет способность разных модулей взаимодействовать в предполагаемых рамках, т.е. проверяет правильность проектирования самого интерфейса взаимодействия. Достаточно ли возможностей для взаимодействия? Не забыли ли мы какой-то метод?
    Ответ написан
  • Ошибка: mute_role = discord.utils.get(ctx.message.guild.roles, name = 'mute') AttributeError: 'NoneType' object has no attribute 'guild', что зделать?

    Vindicar
    @Vindicar
    RTFM!
    Наверно, слэш команды не связаны с сообщением, а потому ctx.message - это None.
    Но ты можешь получить ссылку на гильдию и через member.
    Ответ написан
    1 комментарий
  • Почему в методе класса TypeError: takes 1 positional argument but 2 were given?

    Vindicar
    @Vindicar
    RTFM!
    Потому что self.get_x().
    В питоне доступ к полям/методам self ВСЕГДА явный, в отличие от других языков (типа C++ или C#), где this можно опустить.
    Собственно, ошибка тебе и говорит, что питон не может именно НАЙТИ get_x().
    Ответ написан
    7 комментариев
  • Обязательно ли использовать класс в Python?

    Vindicar
    @Vindicar
    RTFM!
    Классы удобны, когда у тебя есть некая сущность, наделённая состоянием и поведением. Иными словами, если есть поведение (т.е. функции) и оно требует сохранения каких-то данных между вызовами. Да, можно хранить эти данные через возврат значений и передачу параметров. По-сути, так реализуется ООП в языках вроде C (не путать с C++). Если эта сущность соответствует какому-то предмету, с которым ты работаешь, так еще лучше.
    Ответ написан
  • Win32api | python | Как создать окно приложения, где взять wndProc?

    Vindicar
    @Vindicar
    RTFM!
    Тебе повезло, я недавно такое делал.
    Нельзя просто взять и передать питоновскую функцию в WinAPI, так как у них совершенно разные способы вызова. Тебе сначалу нужно описать тип данных - указатель на функцию. Примерно так.
    import ctypes
    import ctypes.wintypes as w
    LRESULT = w.LPARAM
    WNDPROC = ctypes.WINFUNCTYPE(LRESULT, w.HWND, w.UINT, w.WPARAM, w.LPARAM)

    Вот после этого ты можешь предоставить свою оконную функцию вида
    def wnd_proc(hwnd: w.HWND, message: w.UINT, wParam: w.WPARAM, lParam: w.LPARAM) -> LRESULT:


    А потом уже указываешь это в классе окна:
    wndСlass.lpfnWndProc = WNDPROC(wnd_proc)

    Но тут есть еще один подвох - оконных сообщений много, и их набор отличается для разных версий винды. Есть базовый, более-менее статичный набор, но помимо них может прийти много чего.
    Тут на помощь приходит DefWindowProc().
    def wnd_proc(hwnd, message, wParam, lParam):
        if message == SOME_MESSAGE_YOU_WANT:  # отлавливаешь интересующие тебя сообщения
            DoStuff()  # и обрабатываешь их
            return 0  # не забудь вернуть 0 как признак успеха!
        # а все остальное отдаёшь в DefWindowProc()
        return user32.DefWindowProcW(hwnd, message, wParam, lParam)

    Обрати внимание, что как многие функции WinAPI, DefWindowProc() существует в двух видах - с сууфиксом A (однобайтовая кодировка ANSI) и с суффиком W (wide char, двухбайтовый вариант юникода). Смешивать не рекомендую, выбери один суффикс и придерживайся его во всей программе.

    И ещё подвох, который меня чуть с ума не свёл - переменная с классом окна ДОЛЖНА существовать, пока существует окно. Иными словами, её не стоит делать локальной в методе - иначе сборщик мусора питона её потом соберёт, что будет неприятным сюрпризом для WinAPI. Поймаешь крэш приложения.
    Ответ написан
    7 комментариев
  • Что такое executor в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Аиограм умеет работать в двух режимах - polling и webhooks. Как я понял, executor позволяет остальным механизмам бота абстрагироваться от используемого режима.
    Например, start_polling() просто создаёт реактор (loop) asyncio и запускает в нём задачу self.dispatcher.start_polling(), а потом ждёт сигнала завершения. Ну и еще дергает обработчики on_startup и on_shutdown. Это можно сделать и вручную, при необходимости.
    webhooks использует aiohttp для реализации веб-сервера, который будет получать запросы от telegram.
    Ответ написан
    Комментировать
  • Как сменить пути поиска импорта?

    Vindicar
    @Vindicar
    RTFM!
    файлы с одинаковым именем

    Никак. Питон сначала ищет имя модуля в кэше, и импортирует только если такого модуля не найдено.
    Может, будет проще как-то импортировать по квалифицированному имени, типа пакетА.подпакетБ.модуль? Тогда имена будут разные.
    В общем, поясни, что ты пытаешься сделать.
    Ответ написан
  • Как написать написать функцию, которая принимает любое количество чисел и составляет из них максимальное?

    Vindicar
    @Vindicar
    RTFM!
    Если принимает любое количество именно чисел (т.е. типы данных int или float), то есть стандартная функция max().
    Если нужно её имитировать, то
    # функцию можно будет вызвать так: max(1,2,3,4) 
    # или так 
    # l = [1,2,3,4]
    # max(*l)
    
    # если нужно, чтобы функция принимала список чисел, а не числа по отдельности, исправь так
    # def my_max(args):
    # и вызывай так: max([1,2,3,4]) или max(l)
    
    def my_max(*args):   
      if not args:  # не передали ни одного числа?
        raise TypeError("Нет ни одного числа")  # ну или можно вернуть 0, если это требуется
      val = args[0]  # запоминаем первое переданное число
      for v in args[1:]:  # перебираем остальные
        if val < v:
          val = v
      return v

    А вот что касается ввода чисел с клавиатуры, то тут уже подумай сам.
    input() даст тебе одну введённую строку.
    Почитай про метод .split() у строк, он позволит разбить строку по пробелам в список строк.
    Затем сделай новый пустой список, пройдись по списку строк, каждый элемент обработай int() или float(), и добавь результат в этот новый список.
    Тогда у тебя будет список чисел, который можно скормить my_max().
    Ответ написан
    Комментировать
  • Почему этот код выкидывает ошибку "NameError: name 'BarCode' is not defined"?

    Vindicar
    @Vindicar
    RTFM!
    BarCode еще не определен на момент его упоминания в аннотации.
    Либо поставь BarCode выше чем Product, либо замени List[BarCode] на List['BarCode'] (опережающая ссылка), либо добавь в начало from __future__ import annotations (делает ссылки опережающими автоматически).
    Ответ написан
    1 комментарий
  • Как написать скрипт, который будет удалять сам себя, если в директории будут сторонние файлы?

    Vindicar
    @Vindicar
    RTFM!
    Храни в скрипте список не-сторонних файлов, а затем pathlib в помощь. Там тебе и перечисление файлов в каталоге, и извлечение путей, и манипуляции с файлами.
    Вот только зачем?
    Ответ написан
  • Зачем могут понадобиться else и finally в конструкции try-except?

    Vindicar
    @Vindicar
    RTFM!
    Рассмотрим два сценария:
    try:
      foo()
      bar()
    except:
      baz()

    try:
      foo()
    except:
      baz()
    else:
      bar()

    В первом случае baz() вызовется, если было выброшено исключение в foo() или в bar().
    Во втором случае baz() вызовется, если было выброшено исключение в foo(), а исключения в bar() останутся необработанными.
    В обоих случаях bar() вызовется только если foo() отработало без исключений.
    Какой из двух способов применять, зависит от нужного тебе поведения.

    Насчёт finally ответили выше. Обычно finally применяется в ситуациях, когда тебе обязательно нужно выполнить какое-то действие по окончании операции, независимо от её исхода. Например, если ты открыл файл, тебе обязательно нужно его закрыть, когда ты с ним больше не работаешь, и тому подобное.
    Ответ написан