Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2024, 14:11   #1
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 27
По умолчанию Состояние и методы генератора python

Здравствуйте, подскажите пожалуйста что нужно подправить в коде. В последней строчке теста выдает banana, а нужно cat.

На предыдущем уроке вы решали задачу «Словарь». В ней гарантировалось, что в сопрограмму alphabet будут передаваться только значения, которые являются ключами глобальной переменной DICTIONARY.

Теперь вам необходимо переписать сопрограмму alphabet так, чтобы она могла обрабатывать исключение KeyError. В случае, когда возникнет исключение KeyError, сопрограмма должна генерировать значение «default».



Переменная DICTIONARY вам в редакторе кода по-прежнему не видна, но вы можете обращаться к ней внутри сопрограммы alphabet.

Sample Input 1:

coro = alphabet()
next(coro)
print(coro.send('a'))
print(coro.send('b'))
print(coro.throw(KeyError))
print(coro.send('c'))
Sample Output 1:

apple
banana
default
cat
Sample Input 2:

coro = alphabet()
next(coro)
for letter in 'qwerty':
print(coro.send(letter))
print(coro.throw(KeyError))
Sample Output 2:

quail
default
walrus
default
elephant
default
rabbit
default
tiger
default
yak
default
Sample Input 3:

coro = alphabet()
next(coro)
print(coro.send('apple'))
print(coro.send('banana'))
print(coro.throw(KeyError))
print(coro.send('dog'))
print(coro.send('d'))
Sample Output 3:

default
default
default
default
dog

Код:
def alphabet():
    letter = yield
    while True:
        try:
           
           
             letter = yield DICTIONARY[letter]
        except KeyError:
 
            yield 'default'
Nicodim вне форума Ответить с цитированием
Старый 16.11.2024, 01:41   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,394
По умолчанию

Код:
def alphabet():
    letter = yield
    while True:
        try:
            letter = yield DICTIONARY.get(letter, 'default')
        except KeyError:
            letter = None
Так работает, но мне кажется, должен быть более элегантный способ. А в таком виде подавляется KeyError от словаря, а приходят KeyError только через throw.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.11.2024, 12:43   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,353
По умолчанию

BDA, всё ещё не понимаю до конца, но ведь ваш код работает и так:
Код:
def alphabet():
    letter = yield
    while True:
        try:
            letter = yield DICTIONARY[letter]
        except KeyError:
            letter = yield 'default' 

coro = alphabet()
next(coro)
print(coro.send('a'))
print(coro.send('b'))
print(coro.throw(KeyError))
print(coro.send('c'))
print(coro.send('e'))
print(coro.send('f'))
print(coro.send('z'))
В этой строке
Код:
letter = yield DICTIONARY[letter]
порождается исключение KeyError, если значение letter не является ключом словаря.

PS: Использовал этот словарь:
Код:
DICTIONARY = {
    'a': 'apple',
    'b': 'banana',
    'c': 'cat',
    'd': 'dog',
    'q': 'quail',
    'w': 'walrus',
    'e': 'elephant',
    'r': 'rabbit',
    't': 'tiger',
    'y': 'yak'
    }
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 16.11.2024, 17:47   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,394
По умолчанию

ViktorR, я тоже сначала именно так исправил (добавил присваивание letter), но если будет два исключения подряд (сначала из-за словаря, а потом из-за throw), то не сработает, и придется второй yield тоже оборачивать в try блок и добавлять третий yield. Пример (на основе Sample Input 3):
Код:
coro = alphabet()
next(coro)
print(coro.send('apple'))
print(coro.throw(KeyError))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.11.2024, 22:17   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,353
По умолчанию

Да, так я не проверил.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование на Python Магические методы в классах Nicodim Помощь студентам 2 10.09.2023 20:25
Реализовать конструкторы и методы класса Python AliceF Помощь студентам 0 10.06.2023 23:46
Методы сбора и анализа экспертных данных(методы: Ранжирование, непосредственная оценка), C# Desired Помощь студентам 6 22.03.2014 13:33
Turbo Pascal состояние программы и методы использования окон отладчика. djquins Помощь студентам 0 15.12.2013 01:26
Период генератора Faton 11 Общие вопросы C/C++ 2 06.11.2012 20:44