• Как решить задачу, используя одну формулу и не успользуя 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!
    Если я верно помню, бота на дискорд-сервер может добавить только владелец сервера.
    Если бот работает из-под учётки клиента, то ему нужна будет инвайт ссылка.
    В обоих случаях у владельца бота нет особого контроля над добавлением.
    Так что ответ, скорее всего, "никак". Да и для чего такая возможность? Спамботам жизнь облегчить?
    Ответ написан
    Комментировать
  • Как сделать голосовой ответ в голосовом помощнике на python?

    Vindicar
    @Vindicar
    RTFM!
    Окей, гугл, python text to speech.
    Ответ написан
    Комментировать
  • Как отправлять по очереди данные заказа по команде "Дальше" из БД Sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Ответ очевиден. Тебе нужно для пользователя хранить, на какой позиции он остановился, и продолжать оттуда.
    Простой способ - использовать модификаторы OFFSET и LIMIT в SQL запросе. Тогда достаточно будет хранить просто число, которое будет использоваться в OFFSET. При начальном запросе это число ставить в 0, а по нажатию дальше - увеличивать на значение LIMIT.

    Технически это можно оформить таблицей БД с парами "id пользователя - число".
    Ответ написан
    1 комментарий
  • Почему присылает профиля всех хотя указанно where user_id?

    Vindicar
    @Vindicar
    RTFM!
    1. Потому что условие "WHERE {user_id}" будет истинным для любых ненулевых user_id. Тебе нужно условие WHERE id = {user_id} (предполагая, что колонка с id пользователя называется id).
    2. С поправкой на то, что это тебе на самом деле не нужно. НИКОГДА не создавай запросы через подстановку значения в строку, слишком легко ошибиться или поймать sql-инъекцию. Перепиши запрос на использование prepared statements.
    cursor.execute("SELECT money, biz, profitbiz, profitkaz, losemoneykaz, moneykaz FROM users WHERE id = ?", (user_id, ))
    Вместо каждого ? в запросе будет подставлен элемент из кортежа параметров. При этом движок сам позаботится о правильном экранировании.
    3. Переподключаться к БД каждый раз при вызове команды - плохая идея. Создай подключение при запуске бота и используй его. Максимум - создавай новый cursor для вызова команды.
    Ответ написан
    1 комментарий
  • Как сделать, чтобы телеграм-бот отвечал уже вычисленным числом?

    Vindicar
    @Vindicar
    RTFM!
    1. Поставь обработчик "входящее сообщение".
    2. Прогони текст сообщения через float(), а для надёжности можно попробовать использовать locale.atof() - оно понимает региональное форматирование. Например, в США сумма "5,000.00" а у нас "5 000,00", причем и там и там могут написать просто "5000". Выцепить все варианты будет непросто, но atof() для начала сойдёт.
    3. Рассчитай проценты.
    4. Ответь на сообщение рассчитанной суммой процентов.

    Вот и всё. Если хочешь код - изволь предоставить то, что написал сам (и оформить кнопкой </>).
    Ответ написан
    5 комментариев
  • Как переключать язык через radibutton?

    Vindicar
    @Vindicar
    RTFM!
    Не получается по вполне очевидной причине.
    Как следует из названия, root.mainloop() входит в бесконечный цикл, и крутится там, пока окно не будет закрыто. Это считается завершением программы, и только тогда mainloop() возвращает управление.

    А нажатие кнопки у тебя тоже реализовано через бесконечный цикл. Разумеется, работать может только один из них.
    Я бы посоветовал почитать повнимательнее доки на keyboard, и выкинуть цикл while True и вызов keyboard.wait().
    Вместо этого, либо попробуй добавить обработчик через keyboard.add_hotkey(), либо попробуй запланировать вызов своей функции через root.after().
    Внутри этой функции используй keyboard.is_pressed(), чтобы узнать, нажата ли клавиша. Тут будет ещё пачка подводных камней - нужно будет повторно запланировать вызов этой же функции, нужно будет игнорировать нажатие клавиш, если перевод уже сделали (чтобы пока держишь клавиши, комп не переводил непрерывно), и т.п.
    Первый способ проще, но нужно проверить, сработает ли.
    Ответ написан
    1 комментарий
  • Как через код получить текст с консоли и вписать текст, который считывает консоль?

    Vindicar
    @Vindicar
    RTFM!
    Запустить в дочернем процессе, перехватить его стандартный ввод/вывод?
    Если же нужно внутри своего процесса, можно временно заменить sys.stdin на что-нибудь типа io.BytesIO или io.StringIO, заполненный заранее заготовленными данными. Если нужно перехватить stdout, то в модуле contextlib есть такая возможность.
    Ответ написан
    Комментировать
  • Как в существующий файл дописать текст в python?

    Vindicar
    @Vindicar
    RTFM!
    В конец каждой строки - никак. Сам подумай, в файле никаких строк нет, это последовательность байт. Просто некоторые программы эту последовательность разбивают на участки по символу перевода строки.
    Так что чтобы вставить что-то в середину файла, пришлось бы сместить вперёд всё содержимое файла после этого места.

    Проще сделать иначе: создать новый файл рядом со старым, прочитать построчно старый, записать изменённые строки в новый. А потом удалить старый и переименовать новый в старый.

    Насчёт последней части посмотри модуль os, в частности, os.unlink() и os.rename().
    Ответ написан
    Комментировать
  • Как определить атрибуты файла — не магические методы?

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

    Vindicar
    @Vindicar
    RTFM!
    Поищи по "SSH port forwarding". Вот хороший пример.
    Если коротко, есть три варианта. Локальный форвардинг означает "любой коннект на указанный порт на локальной машине должен пробрасываться на SSH сервер, а сервер должен пробрасывать его на указанный порт на указанном адресе".
    Удалённый форвардинг означает "любой коннект на указанный порт на SSH сервере должен пробрасываться на этот клиент, а клиент должен пробросить его на указанный порт на указанном адресе."
    Динамический форвардинг проще, но менее контролируемый. Он означает "клиент слушает указанный локальный порт и притворяется SOCKS-прокси. Любое соединение пробрасывается через SSH-сервер, который соединяется с целевым адресом по своему усмотрению."
    Любой форвардинг длится, пока длится SSH-сессия.
    Так что в твоём случае нужен локальный форвардинг. При этом поскольку сервер БД на одном хосте с сервером SSH, ssh-сервер должен пробрасывать соединения на localhost:порт сервера бд. А твоё ПО будет коннектиться на localhost твоей машины, и тот порт, который ты указал как локальный. Можешь для простоты задать его таким же, как порт сервера БД.
    Ответ написан
    Комментировать
  • Не могу перевести ид дискорд нейма в сам ник?

    Vindicar
    @Vindicar
    RTFM!
    Подумай головой и поучи питон на примерах попроще для начала.
    NoneType object has no attribute 'name' - у тебя None вместо объекта, а ты пытаешсья взять атрибут.
    А None у тебя, потому что get_user() тебе вернул None, а ты не проверяешь. Хотя в доках написано, что он может вернуть None.
    Ответ написан
    Комментировать