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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2024, 12:07   #1
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 23
По умолчанию Программирование на Python сопрограммы, корутины

Здравствуйте, помогите пожалуйста разобраться в коде не проходит тест выводит None вместо banana.

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

DICTIONARY = {
'a': 'apple',
'b': 'banana',
'c': 'cat',
'd': 'dog',
...
}
Ваша задача — написать сопрограмму alphabet, в которую передаются буквы, а в ответ она генерирует слова, закрепленные переданной буквой из словаря DICTIONARY.

Гарантируется, что в alphabet будут поступать значения, которые имеются в ключах словаря DICTIONARY.

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

Sample Input 1:

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

apple
banana
cat
Sample Input 2:

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

quail
walrus
elephant
rabbit
tiger
yak


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

Первый yield тоже возвращает значение (а именно None), так что нужно обойтись одним yield в цикле:
Код:
def alphabet():
    letter = yield
    while True:
        letter = yield DICTIONARY[letter]
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 11.11.2024, 20:55   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,347
По умолчанию

С таким словарём:
Код:
DICTIONARY = {
    'a': 'apple',
    'b': 'banana',
    'c': 'cat',
    'd': 'dog',
    'q': 'quail',
    'w': 'walrus',
    'e': 'elephant',
    'r': 'rabbit',
    't': 'tiger',
    'y': 'yak'
    }
И таким описанием функции:
Код:
def alphabet():
    char = ''
    while True:
        letter = (yield char)
        char = DICTIONARY[letter]

coro = alphabet()
next(coro)
print(coro.send('a'))
print(coro.send('b'))
print(coro.send('c'))
print(coro.send('d'))
print(coro.send('q'))
print(coro.send('w'))
print(coro.send('e'))
Удалось получить следующий результат:
Код:
apple
banana
cat
dog
quail
walrus
elephant
Очевидно, что два yield создавали проблему, но как работает приведённый мной скрипт, так и не сообразил, пока.
Работает вроде, ...

PS:
Код сгенерировал на основе примера, полученного тут:
https://sky.pro/wiki/python/naznache...ispolzovaniya/
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.11.2024, 07:30   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,376
По умолчанию

Вот достаточно подробное объяснение взаимодействия next, send и yield - https://ru.stackoverflow.com/a/950451. А чтобы применить это объяснение к обсуждаемой задаче, нужно иметь ввиду, что тут не два отдельных yield (явно указанных в коде), а два yield с соседних итераций цикла (но в коде он один).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.11.2024, 11:04   #5
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 23
По умолчанию

Благодарю за подсказку!!!!
Nicodim вне форума Ответить с цитированием
Старый 13.11.2024, 11:06   #6
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 23
По умолчанию

Благодарю вас очень помогли.
Nicodim вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование на Python Nicodim Помощь студентам 5 05.11.2024 13:18
Программирование на Python Задача на программирование покрытие отрезками Nicodim Помощь студентам 2 29.12.2023 21:19
Программирование в Python fyz abkbvjyjdf Помощь студентам 1 17.12.2022 11:34
Программирование на python Семен_13 Python 7 17.10.2022 17:59