Задать вопрос
  • При использовании range( ), через N-ное количество циклов падает скорость?

    Vindicar
    @Vindicar
    RTFM!
    reversed(range(250))
    Зачем? Чем не устроил range(249, -1, -1)?

    Далее, ты и в up() и в down() в цикле создаёшь раз за разом один и тот же объект, а потом забываешь про него. Зачем устраивать разминку для сборщика мусора? Создай объект 1 раз и модифицируй его - либо в глобальной переменной, либо (лучше) в классе.
    Ответ написан
    Комментировать
  • Как из базы данных получить все значения столбца в список?

    Vindicar
    @Vindicar
    RTFM!
    Если используешь для работы с базой движок sqlite3, то будет как-то так
    con = sqlite3.connect("mydb.sqlite") #подразумеваю, что таблицу ты уже создал
    cur = con.cursor()
    cur.execute("SELECT id FROM users")
    ids = [row['id'] for row in cur]

    Только если данных много, такой запрос может съесть много памяти.
    Так что встречный вопрос: а тебе зачем выбирать всю таблицу? Может, всё-таки нужно отфильтровать часть записей?
    Ответ написан
    Комментировать
  • Как обработать изображение через CV2?

    Vindicar
    @Vindicar
    RTFM!
    Непонятно, что именно ты пытаешься сделать.
    Если просто перевести скриншот в другое цветовое пространство, то вот этих двух строчек
    image = pyautogui.screenshot(region=(514, 495, 264, 12))
    image = cv2.cvtColor(np.array(image), cv2.COLOR_BGR2GRAY)
    должно хватить.
    Дальше crop лучше делать средствами cv2, благо для этого достаточно средств numpy-массивов (а именно так cv2 хранит изображения).
    Ответ написан
  • Последовательность чтения кода браузером?

    Vindicar
    @Vindicar
    RTFM!
    Percivald, ты не понимаешь.
    Тут три действия, а не два.
    1. Запланировать показ текущего значения изменяемого объекта planet (console.log() делает именно это!)
    2. Изменить значение объекта planet
    И спустя некоторое (пусть и небольшое) время
    3. Отобразить текущее значение изменяемого объекта planet.
    Не важно, в каком порядке выполняются 1 и 2, к момент выполнения 3 значение planet уже будет изменено.

    А вот если выводить строку, например, innerHTML, ситуация изменится, потому что строки не изменяемы!
    И тогда будет так:
    1. Запланировать показ объекта-строки, которая в настоящий момент находится в объекте planet.
    2. Сменить содержимое planet на другое. Старая строка при этом не пропадает, так как её показ уже запланирован. Про новую строку консоль ничего не знает.
    И спустя время
    3. Показать в консоли запланированный объект-строку.

    Иными словами, в первом случае содержимое объекта planet читается на шаге 3, где оно уже изменилось. Во втором случае, значение строки, которую мы взяли из planet, тоже читается на шаге 3 - но тот факт, что внутри planet эта строка была заменена на другую, ни на что не влияет.

    Вот, на пальцах:
    Вариант 1
    611443763c478362532846.png

    Вариант 2
    6114439e7363a433817881.png
    Ответ написан
    1 комментарий
  • Как получить список все классов из текущего файла?

    Vindicar
    @Vindicar
    RTFM!
    Нужно знать имя модуля. Для основного скрипта (который непосредственно выполняешь) это будет '__main__'. ЕМНИП это имя можно узнать из магической переменной __name__.

    import sys
    
    def enum_classes(module_name: str = __name__):
      module = sys.modules[module_name]
      return [v for v in vars(module).values() if type(v) is type and v.__module__ == module_name]


    Первая часть условия отсеет всё, кроме классов. Вторая по идее отсеет то, что попало в пространство имён через импорт типа "from X import Y".
    Ответ написан
    Комментировать
  • Python sqlite как обновить запись в базе?

    Vindicar
    @Vindicar
    RTFM!
    Убери кавычки вокруг последнего "?". В текущем варианте ты обновляешь баланс пользователя с именем "?", т.е. подстановка из переменной не происходит.
    И да, как посоветовали выше - проверь, что у тебя в переменных money и user перед запросом.
    print('Money:', repr(money))
    print('User:', repr(user))
    repr() выведет строку как строковую константу в питоне, т.е. можно будет увидеть обычно невидимые символы, которые могут присутствовать. Например, пробелы в конце строки.
    Ответ написан
    Комментировать
  • Почему проблема в сортировке?

    Vindicar
    @Vindicar
    RTFM!
    Код феерический. Два запроса вместо одного, выбор всех строк ради сортировки на клиенте, NULL там, где его быть не должно, и так далее.

    Всё это прекрасно делается на уровне запроса к базе!
    SELECT fname, balance FROM users WHERE balance IS NOT NULL ORDER BY balance DESC LIMIT 5

    Выберет имя и баланс пользователей, у которых баланс не NULL (sql-евский NULL превращается в питоновский None, с которым ты и столкнулся при сортировке). Это, к слову, твоя вина, нужно было указать NOT NULL и значение по умолчанию для поля balance при создании таблицы.
    Результат сортируется по полю balance по убыванию, и выбираются не более первых 5 строк (может быть менее).
    Каждая строка результата будет кортежем, где нулевой элемент - имя игрока, а первый - баланс.

    top5 = cur.execute('SELECT fname, balance FROM users WHERE balance IS NOT NULL ORDER BY balance DESC LIMIT 5').fetchall()
    table = []
    for num, (fname, x) in enumerate(top5, 1):
        table.append(f'{num} • {fname} - <b><i>{x}</i></b> монеток.\n' )
    await message.reply('Топ 5 богачей бота.\n\n'+''.join(table))


    Подучи SQL, сильно упростишь себе жизнь при составлении запросов.
    Ответ написан
    Комментировать
  • Как создать несколько команд?

    Vindicar
    @Vindicar
    RTFM!
    Потому что делаешь через задницу. Вместо того чтобы использовать существующий механизм команд, ставишь реакцию на любое сообщение и пытаешься выдернуть из него текст команды самостоятельно. Собственно, проблема в том, что ты объявил два метода с одним именем. Один из них всегда будет перекрыт другим.
    Я так понимаю, Quickstart ты прочитал, молодец. А как насчет почитать дальше?
    Ответ написан
  • Ошибка Non-UTF-8 в PyCharm, что с этим делать?

    Vindicar
    @Vindicar
    RTFM!
    У тебя исходный код набран не в кодировке UTF-8, или Питон не понял в какой он набран.
    а) Посмотри, какая кодировка выбрана в настройках Pycharm.
    б) Допиши в начало файла строку с указанием кодировки, например
    # -*- coding: utf-8 -*-
    если файл всё-таки в utf-8 или
    # -*- coding: windows-1251 -*-
    если файл набран в дефолтной кодировке винды.
    Ответ написан
    1 комментарий
  • Как перехватить STDOUT gunicorn`а?

    Vindicar
    @Vindicar
    RTFM!
    А ты уверен, что речь про stdout? Посмотри в p.stderr.
    Ответ написан
  • Как решить задачу, используя одну формулу и не успользуя if, else, elif?

    Vindicar
    @Vindicar
    RTFM!
    Ну вместо if можно использовать список функций (лямбд или обычных).
    x = 1
    [
      lambda: print('x < 0!'), #False = 0
      lambda: print('x > 0!'), #True = 1
    ][x > 0]()

    Дальше просто построить из таких блоков дерево решений методом дихотомии.
    Ответ написан
    Комментировать
  • Как уменьшить диапазон цветов на фото python?

    Vindicar
    @Vindicar
    RTFM!
    Насчёт уменьшения количества цветов могу подсказать одну идею.
    Собираешь коллекцию всех цветов на изображении. Это будет своего рода облако точек в пространстве координат R-G-B. Можешь либо брать все пиксели, либо только уникальные цвета - посмотри, что будет лучше работать.
    Потом применяешь метод k-средних, чтобы это облако разбить на желаемое число кластеров. Реализации метода k-средних можно найти в пакете opencv-python (он же cv2), вместе с механикой загрузки растровых изображений.
    У тебя получится набор из 24 точек - центров кластеров. Это и будут итоговые цвета, только округли их R-G-B координаты до ближайшего целого.
    Затем для каждого пикселя изображения находишь центр кластера, ближайшего к его цвету. Это будет цвет, которым надо будет перекрасить пиксель.

    Мне скорее интересно, как ты собираешься растровое изображение превратить в векторное - это ведь нетривиальная штука.
    Ответ написан
  • Как преобразовать длинный float в строку?

    Vindicar
    @Vindicar
    RTFM!
    print(f'Число: {res:.6f}')
    Выведет тебе число с 6 знаками после запятой.
    Ответ написан
    Комментировать
  • Через что можно взаимодействовать с Дискордом?

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

    Vindicar
    @Vindicar
    RTFM!
    new_list = sum( (item if isinstance(item, list) else [item] for item in a_list) , [])

    По сути, мы каждый элемент a_list превращаем в список, если он не был списком.
    А потом суммируем все эти списки (это будет операция конкатенации).
    Честно говоря, простой цикл for был бы читаемее (и быстрее, я думаю):
    new_list = []
    for item in a_list:
      if isinstance(item, list):
        new_list.extend(item)
      else:
        new_list.append(item)


    Но будет работать только для одного уровня вложенности. Если нужно больше, используй рекурсию или что-то подобное.
    Ответ написан
    4 комментария
  • Как сделать смещение точек?

    Vindicar
    @Vindicar
    RTFM!
    Если ты хочешь сделать "взрыв", т.е. разлёт звёзд из центра, то тебе нужно будет с умом представить сведения о звёздах. Сейчас ты их не хранишь вообще, поэтому у тебя каждый раз звёзды рисуются по разному.
    Что нужно знать для разлёта?
    1. Координаты центра, откуда идёт разлёт. Я полагаю, это будет
    center = (0, 0)
    Надеюсь, ты знаешь что такое кортеж.
    2. Для каждой звезды нужно знать число её лучей. Также для каждой звезды нужно определить шаг по x и по y. Например, так.
    dx = rnd.randint(-5, 5)
    dy = rnd.randint(-5, 5)
    n_beam = rnd.choice([5,7,9,11,13,15,17])
    size = rnd.randint(5, 20)
    star = (dx, dy, n_beam, size)
    У тебя будет список из множества таких кортежей star.
    4. Мы должны знать, сколько шагов мы сделали с момента начала анимации.
    step_count = 0
    Поначалу 0, потом будет увеличивать.

    Сначала генерируешь звёзды.
    center = (0, 0)
    N = 1000
    stars = []
    for i in range(N):
        dx = rnd.randint(-5, 5) #на сколько пикселей по горизонтали сдвинется звезда за шаг
        dy = rnd.randint(-5, 5) #на сколько пикселей по вертикали сдвинется звезда за шаг
        n_beam = rnd.choice([5,7,9,11,13,15,17]) #сколько лучей у звезды
        size = rnd.randint(5, 20) #размер звезды
        star = (dx, dy, n_beam, size) #описание звезды
        stars.append(star) #добавляем звезду в массив звёзд


    Потом делашеь цикл анимации:
    for step in range(100): #сколько кадров анимации сделать
        turtle.clear() #тут нужно очистить экран
        for star in stars: #перебираем звезды
            # определяем координаты центра звезды на этом шаге
            pos_x = center[0] + step * star[0]
            pos_y = center[1] + step * star[1]
            # позиционируем черепашку
            main.up()
            main.setposition(x + 5,y + 5)
            main.down()
            # рисуем звезду
            starFILL(star[1], star[2])
        time.sleep(1.0)


    Как-то так. Более аккуратно было бы использовать не кортежи, а классы. Если интересно, отпишись в комментах, объясню.
    Ответ написан
  • Как исправить код для решения задачи?

    Vindicar
    @Vindicar
    RTFM!
    Нужно быть осторожным при переборе индексов списка и его одновременном изменении. Если ты удалил элемент - индексы последующих "съедут" влево, к нулю, и при обычном переборе ты пропустишь элемент сразу за удалённым.
    Хорошее решение - перебирать элементы в обратном порядке, тогда "съедут" индексы уже обработанных элементов.
    for i in range(len(l)-1, -1, -1):
      if l[i] % 2 == 0:
        l[i] = l[i] / 2
      else:
        del l[i]
    Ответ написан
    3 комментария
  • Как максимально эффективно вычислить индекс элемента во вложенной структуре?

    Vindicar
    @Vindicar
    RTFM!
    Если структуру данных строишь один раз, а потом ваыполняешь к ней ряд таких запросов, может иметь смысл пройтись по всей структуре циклом и построить словарь следующего вида.
    Ключ: кортеж (id_родителя, id_элемента)
    Значение: данные элемента

    Тогда при запросе можно будет сконструировать такой же кортеж, а потом проверить его наличие в словаре или извлечь элемент из словаря.
    Ответ написан
    Комментировать
  • Как поменять тон голоса в библиотеке pyttsx3?

    Vindicar
    @Vindicar
    RTFM!
    Если чуть-чуть модифицировать пример, увидим доступные голоса и их id.
    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    for voice in voices:
        print('Now speaking:', voice.id)
        engine.setProperty('voice', voice.id)
        engine.say('The quick brown fox jumped over the lazy dog.')
    engine.runAndWait()

    Движок цепляет голоса из настроек TTS в Windows, так что дополнительные голоса нужно ставить там.
    Ответ написан
    Комментировать
  • Как добавить дискорд-бота сразу на несколько серверов?

    Vindicar
    @Vindicar
    RTFM!
    Если я верно помню, бота на дискорд-сервер может добавить только владелец сервера.
    Если бот работает из-под учётки клиента, то ему нужна будет инвайт ссылка.
    В обоих случаях у владельца бота нет особого контроля над добавлением.
    Так что ответ, скорее всего, "никак". Да и для чего такая возможность? Спамботам жизнь облегчить?
    Ответ написан
    Комментировать