Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
1 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 45
Telegram Bot

Проблема с циклом

03.08.2019, 15:18. Показов 2813. Ответов 7

Студворк — интернет-сервис помощи студентам
Пишу простенького бота для проверки слов.
Бот даёт слово, а ты его перевод пишешь. В итоге тебе должно показать сколько раз ошибся и ответил правильно.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import telebot
 
good = 0
bad  = 0
i = 0
 
pol = ['Cześć', 'Placić', 'Czekać', 'Pisać', 'Nieść', 'Do widzenia', 'Dzień dobry', 'Świetnie', 'Jeszcze raz', 'Wiedzieć']
rus = ['Привет', 'Платить', 'Ждать', 'Писать', 'Нести', 'До свидания', 'День добрый', 'Отлично', 'Ещё раз', 'Знать']
 
bot = telebot.TeleBot('Мой токен, никому не дам')
 
@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, "Приветствую. Этот бот проверит ваши знания по слов\n опубликованных в инстогрмме. Бот будет писать слово на польском, а вам необходимо написать перевод слова\n\n Введите /go что бы начать.")
 
@bot.message_handler(commands=['go'])
def start_message(message):
    global good, bad, i
 
    for i in 9:
        bot.send_message(message.chat.id, pol[i])
#       @bot.message_handler(content_types=['text'])
#       def send_text(message):
            if message.text.lower() == rus[i]:
                good += 1
            else:
                bad += 1
    bot.send_message(message.chat.id,"Вы сделали" + bad +"ошибок\n Вы ответили правильно на " + good +"вопросов")
bot.polling()
Проблема в цикле, ведь я не нашел(точнее плохо искал) команду ожидания ввода.
У меня цикл выводит 10 раз одно слово , потом проходит какое-то время и снова выводится тоже самое слово 10 раз. И так бесконечно.
И ещё вопрос: правильно ли сделано с массивами ,консоль не агрился, но всё же.

Жду критику([B]Внимание[B]: Критика != Оскорбление - а то что-то часто вижу подобные ответы: Иди , дебил, учи язык , а потом пиши коды)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.08.2019, 15:18
Ответы с готовыми решениями:

Python Прерывание цикла зажатой клавишей
import os import time import win32api, win32con from numpy import * #Дальше идёт цикл: ......

Циклическое клиент-серверное приложение
В рамках учебного задания необходимо разработать циклическое клиент-серверное приложение расчета...

Бесконечый цикл в боте
import telebot import sqlite3 BOT_TOKEN = "Token" bot = telebot.TeleBot(BOT_TOKEN) userId =...

7
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
03.08.2019, 15:58
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import telebot
 
pol = ['Cześć', 'Placić', 'Czekać', 'Pisać', 'Nieść', 'Do widzenia', 'Dzień dobry', 'Świetnie', 'Jeszcze raz', 'Wiedzieć']
rus = ['Привет', 'Платить', 'Ждать', 'Писать', 'Нести', 'До свидания', 'День добрый', 'Отлично', 'Ещё раз', 'Знать']
 
bot = telebot.TeleBot('635421519:AAH3Kw3WpbcvcViMR9-1gr6IPZi97mcZjK0')
 
def get_words():
    for word in pol:
        yield word
 
words = get_words() 
messages = []
 
@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, "Приветствую. Этот бот проверит ваши знания по слов\n опубликованных в инстогрмме. Бот будет писать слово на польском, а вам необходимо написать перевод слова\n\n Введите /go что бы начать.")
 
@bot.message_handler(commands=['go'])
def start_message(message):
    bot.send_message(message.chat.id, next(words))
 
 
@bot.message_handler(func=lambda message: True)
def echo(message):
    try:
        messages.append(message.text)
        bot.send_message(message.chat.id, next(words))
    except:
        bad = 0
        good = 0
        for i, ru in enumerate(messages):
            if ru == rus[i]:
                good += 1
            else:
                bad += 1
        bot.send_message(message.chat.id, "Вы сделали " + str(bad) +" ошибок\n Вы ответили правильно на " + str(good) +" вопросов")
    
bot.polling()
0
1 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 45
03.08.2019, 17:21  [ТС]
А можно пожалуста пояснения, я новенький в этом, не всё понял
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
03.08.2019, 17:50
Лучший ответ Сообщение было отмечено Jerzy12 как решение

Решение

Немного подправил, чтобы можно было начать заново

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
pol = ['Cześć', 'Placić', 'Czekać', 'Pisać', 'Nieść', 'Do widzenia', 'Dzień dobry', 'Świetnie', 'Jeszcze raz', 'Wiedzieć']
rus = ['Привет', 'Платить', 'Ждать', 'Писать', 'Нести', 'До свидания', 'День добрый', 'Отлично', 'Ещё раз', 'Знать']
 
# это генератор, выдает слова из списка по одному 
def get_words():
    for word in pol:
        yield word
# в words будет генератор, в messages ответы пользователя
words = None
messages = []
 
 
@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, "Приветствую. Этот бот проверит ваши знания по слов\n опубликованных в инстогрмме. Бот будет писать слово на польском, а вам необходимо написать перевод слова\n\n Введите /go что бы начать.")
 
# эта функция срабатывает если пользователь написал /go
# создаем генератор и отправляем первое слово списка
@bot.message_handler(commands=['go'])
def start_message(message):
    global words
    words = get_words()
    bot.send_message(message.chat.id, next(words))
 
 
# эта функция срабатывает если пользователь напишет любое слово
@bot.message_handler(func=lambda message: True)
def echo(message):
    global words, messages
    # если пользователь не писал /go, то ничего не делаем
    if not words:
        return
    # если у генератора попробовать получить слово вне списка, то он вернет исключение
    try:
        # записываем ответ пользователя и отправляем ему новое слово
        messages.append(message.text)
        bot.send_message(message.chat.id, next(words))
    except: # если слова кончились
        bad = 0
        good = 0
        # подсчитываем правильные и неправильные ответы
        for i, ru in enumerate(messages):
            if ru == rus[i]:
                good += 1
            else:
                bad += 1
        bot.send_message(message.chat.id, "Вы сделали " + str(bad) +" ошибок\n Вы ответили правильно на " + str(good) +" вопросов")
        # обнуляем переменные words и messages, теперь если написать /go, то начнется сначала
        words = None
        messages = []
    
bot.polling()
1
1 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 45
03.08.2019, 18:11  [ТС]
Цитата Сообщение от tooru Посмотреть сообщение
Немного подправил, чтобы можно было начать заново
Класс. Супер.Спасибо большое. Я так понял сюда lower() для регистра не всунешь?
Что бы показать слова в которых ошиблись, нужно создать пустой массив и если работает else: заполняем массив данным enumerate(messages)? (Не пиши код сразу я ещё сам попробую похимичить)
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
03.08.2019, 18:19
Цитата Сообщение от Jerzy12 Посмотреть сообщение
Я так понял сюда lower() для регистра не всунешь?
Можно в проверке оба слова обрабатывать

Цитата Сообщение от Jerzy12 Посмотреть сообщение
Что бы показать слова в которых ошиблись, нужно создать пустой массив и если работает else: заполняем массив данным enumerate(messages)?
Просто ru добавлять в массив
0
1 / 0 / 1
Регистрация: 29.10.2017
Сообщений: 45
03.08.2019, 19:35  [ТС]
Цитата Сообщение от tooru Посмотреть сообщение
Можно в проверке оба слова обрабатывать
с регистром я не парился, просто с малых букв в массиве заполнил и пользывателям скажу чтоб с малых букв писали(лень матушка)

Цитата Сообщение от tooru Посмотреть сообщение
Просто ru добавлять в массив
Что я получил:
Python
1
2
3
4
5
6
7
def get_words():
    for word in pol:
        yield word
# в words будет генератор, в messages ответы пользователя
words = None
messages = []
eror = [] # массив для слов-ошибок
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
except:
        x = 0            
        bad = 0
        good = 0
        # подсчитываем правильные и неправильные ответы
        for i, ru in enumerate(messages):
            if ru == rus[i]:
                good += 1
            else:
                bad += 1
                eror.append(ru)  #запись в массив 
        bot.send_message(message.chat.id,  "Ошибка сделана в следующих словах: ")         
       [B] for x in len(eror):[/B] #показ всех слов в чате
            bot.send_message(message.chat.id,  eror[x])   
        bot.send_message(message.chat.id, "Вы сделали " + str(bad) +" ошибок\n Вы ответили правильно на " + str(good) +" вопросов.")
        bot.send_message(message.chat.id,   "Введите /go что бы пройти тест ещё раз. ")
        # обнуляем переменные words и messages, теперь если написать /go, то начнется сначала
        words = None
        messages = []
        eror = []
TypeError: 'int' object is not iterable такая проблемка выскакивает когда доходит до выделеного for.
я не понял
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
03.08.2019, 19:40
Цитата Сообщение от Jerzy12 Посмотреть сообщение
TypeError: 'int' object is not iterable такая проблемка выскакивает когда доходит до выделеного for.
len(eror) это число, и вообще, eror это список

Python
1
2
for x in eror: #показ всех слов в чате
            bot.send_message(message.chat.id,  x)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2019, 19:40
Помогаю со студенческими работами здесь

Как сделать не бесконечный цикл
Скажите, пожалуйста, как сделать не бесконечный цикл, а только одно сообщение от бота. import...

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

Как постить(в определенное время) картинки в паблик через vk_api с циклом for?
Картинки в отдельной папке с проектом(не с вк). Надеюсь, существует способ постить картинки, не...

Модификация цикла for
Задача заключается в том чтобы получить историю сообщений. Когда я пытаюсь распечатать все...

Как сделать бесконечный цикл
Нужно что бы этот помощник работал бесконечно или пока не скажешь ему ключевое слово import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru