• Как улучшить код?

    vabka
    @vabka
    Токсичный шарпист
    Просто сделай словарь, где ключом будет номер серии, а значением - все данные о ней, включая название и прочее.
    Если словарь получится слишком большим, то сохрани данные в бд. (но в этом нет смысла, тк инфа о всех сериях one piece должна спокойно уместиться в 1мб, а если добавить описания каждой серии и кадры - тогда да, будет много)
    Не гоже постоянно в цикле проходить по всему списку и парсить строки.
    for name in series_names:
                    value = name.split(" ")

    Делать if int(user_message) == int(value[0]) тоже нет смысла - можно просто сравнивать строки.
    И тем более нет смысла на каждый запрос читать весь файл with open('series.txt', 'r') as series_names:

    Ссылки следует начинать с https:// - так телега сразу сделает её кликабельной. Ссылки в принципе тоже можно кэшировать, вместо со всеми остальными данными - она не меняется + есть шанс, что когда-то ссылка изменится и уже не будет номером серии.
    link = f'jut.su/one-piece/episode-{user_message}.html'


    Тоесть в итоге будет как-то так:
    # Где-то в main
    global one_piece_episodes
    one_piece_episodes = {}
    with open('series.txt', 'r') as episodes_names:
      for episode_name in episodes_names:
        value = name.split(' ')
        key = value[0]
        name = value[1]
        link = f'https://jut.su/one-piece/episode-{key}.html'
        one_piece_episodes[key] = { "number": key, "name": name, "link": link }

    А потом уже при обработке сообщений:
    @bot.message_handler(content_types=['text'])
    def get_name(message):
        episode = one_piece_episodes.get(message.text)
        if episode != None:
            bot.send_message(message.chat.id, f'{episode["name"]}\n{episode["link"]}')

    В идеале стоит для инфы о сериях создать класс, чтобы не обращаться к вложенным словарям, но так уже лучше будет по всем параметрам.

    PS: Хабр Q&A не является сервисом для проведения код-ревью, и за подобные "вопросы" можно словить бан по причине 3.2, 3.7, 5.12
    Ответ написан
    3 комментария
  • При запуске код даёт ошибку. Python модуль pyttsx3/spech_recognition (?

    sanya84
    @sanya84
    Фанатик Python 3
    Может так?

    with m as sourse:
        r.adjust_for_ambient_noise(sourse)
        audio = r.listen(sourse)
    Ответ написан
    Комментировать
  • Как разделить 1 код на несколько файлов?

    Zoominger
    @Zoominger Куратор тега Python
    System Integrator
    Ответ написан
    Комментировать
  • Как реализовать функцию, выполняющую случайные функции?

    @Yanis07
    my_list = [func_test_1, func_test_2, func_test_3]
    random.choice(my_list)()
    Ответ написан
    3 комментария
  • Как исправить код?

    Vindicar
    @Vindicar
    commands = {
            'Привет' in message: say_message("Здравствуйте, сэр!"),
            'как дела' in message: say_message('Всё отлично, у вас?'),
            "всё хорошо" in message: say_message("Это отлично"),

    Если бы выучил азы Питона перед тем как делать ботов по видосикам, знал бы, что так словари не работают. Ты можешь сделать немного по другому, если очень хочется:
    commands = [
    ( (lambda text: 'привет' in text), 'Добрый день!'),
    ( (lambda text: 'пока' in text), 'До свидания!'),
    ]
    #используем так:
    for predicate, response in commands:
      if predicate(message):
        say_message(response)
        break
    else: #else относится к for, сработает если не было break, т.е. не нашли команду
      say_message("Моя твоя не понимает")

    Или можешь попробовать воспользоваться вот этим моим ответом.
    Ответ написан
    2 комментария
  • Во время произношения ассистент говорит "текст"None, как можно исправить?

    Vindicar
    @Vindicar
    Что за ерунда у тебя в коде творится? Поучи азы Питона сначала, потом уже бросайся помощников писать...

    say_message("Здравствуйте, хозяин!" and "Рад снова вас видеть!")
    Как по твоему, что вот этот and должен значить? На самом деле, у тебя ВСЕГДА будет произноситься только второе выражение. and - это логический оператор в первую очередь. Его поведение для не-логических значений весьма специфическое.

    say_message("Как пожелаете"+str(right_mouse_control()))
    Оставляя за кадром вопрос "зачем", что возвращает функция right_mouse_control()? Она должна возвращать какой-то текст для произношения? Если должна, она явно этого не делает. Если не должна, то зачем ты засовываешь её возвращаемое значение в строку? Почему просто её не вызвать, вне рамок say_message()?
    То же самое для остальных вариантов ниже.

    Ну и простыня elif как вишенка на торте, да.

    EDIT: покажу, как можно это улучшить. Код сложный, но зато легко расширяется.
    Сделаем класс, который будет рулить списком известных команд и сопоставленными им фразами.
    Чтобы не пришлось повторяться, сделаем так, чтобы для добавления новой команды достаточно было
    написать функцию и задекорировать её. Пример будет ниже.
    class VoiceCommandList: #класс управляет списком голосовых команд
      def __init__(self):
        self.actions = list() #список известных классу команд
      
      def on(self, condition): #декоратор, подписывает функцию на голосовую команду
        if isinstance(condition, str):
          condition = condition.lower()
          predicate = lambda text: condition in text #если условие - строка, она должна входить в текст
        elif callable(condition):
          predicate = condition #если условие - функция, она должна вернуть истину для текста
        else: #ни то ни другое - ошибка
          raise TypeError('Condition must be either string or function!')
        #эта функция - декоратор, она будет помечать функции-команды.
        #она описана именно внутри метода on()!
        def decorator(command_func):
          self.actions.append( (predicate, command_func) )
          return command_func
        return decorator
      
      def run_command(self, text): #функция получает строку, определяет и вызывает соотв. её команду
        text = text.lower()
        for predicate, command in self.actions:
          if predicate(text): #текст соответствует известной команде
            try:
              response = command(text) #пытаемся выполнить команду
              if response is None: #если команда не сообщила нам, что ответить
                response = "Команда выполнена" 
            except Exception as err: #не получилось
              response = "Ошибка при выполнении команды"
              print(err)
            if response: #если есть какой-то ответ
              say_message(response) #то произносим его
            break #выполняем не более одной команды за раз
        else: #этот else относится к for, не к if! Если не нашли ни одной похожей команды
          say_message("Неизвестная команда")

    А теперь примеры использования класса. Мы можем добавлять команды, описав функции. Нет нужды править длинную простыню if-elif-else
    vcl = VoiceCommandList() #экземпляр списка команд
    
    #опишем реакцию на простую строку типа "привет".
    @vcl.on('привет') #если передаём в декоратор строку - это означает, что строка должна содержаться в тексте
    def hello(text): #функция-команда принимает аргумент - сказанный пользователем текст
      return "Доброе время суток" #она должна вернуть текст, который скажет бот
    
    @vcl.on('открой оперу')
    def start_opera(text):
      operaopen() #выполняем действие
      return "Браузер запущен" #возвращаем текст ответа
    
    @vcl.on('напиши')
    def write_message(text):
      print(text)
      #если ничего не вернём, будет отклик по умолчанию
    
    @vcl.on(lambda text: ('влево' in text) and ('вправо' in text)) #можно делать сложные условия!
    def what(text):
      return "Так влево или вправо?"

    Ну а чтобы скормить боту распознанную строку:
    vcl.run_command('привет') #сюда можно подставить выхлоп распознавателя речи
    Ответ написан
    8 комментариев
  • Unity2D — Почему не отображаются спрайты при запуске проекта?

    zZaKko
    @zZaKko
    Люблю стратегии и Unity.
    А в редакторе во вкладке game отображается? Если нет , то , наверное , камера заблизко размещенна. Тогда надо переместить ее или спрайт по z, чтобы спрайт попадал в поле зрения камеры.
    Ответ написан
    2 комментария