Инженерный калькулятор · Шаг 5 из 10
Имена и функции
Инженерный калькулятор знает имена: pi и e — числа, sin, sqrt, ln — функции, а ещё переменные, которые завёл человек, и ans — прошлый ответ. Всё это лежит в одном словаре. Шаг стоит над скобками: если токен — имя, разбирает его сам, а всё остальное отдаёт ступени ниже.
Что сделать
Разберите имя: число из словаря — значение, функция — её вызов на выражении в скобках; не имя — отдайте ступени ниже.
Что приходит
tokeny— список токеновi— с какого токена начатьvyrazhenie— функция верхней ступени, для того, что внутри скобок функцииslovar— словарь «имя → число или функция одного числа»dalshe— ступень ниже:dalshe(tokeny, i, vyrazhenie), ваш шаг 4
Что вернуть
Пару (значение, номер следующего токена); незнакомое имя, функция без скобок или без «)» — ValueError с текстом.
Допишите функцию imya в редакторе справа.
Результат верните через return — то, что
напечатано, на проверку не влияет.
В проекте
Калькулятор ставит imya над скобками и даёт словарь из своих функций и вашей памяти. Решите шаг — и заработают «sin(pi/2)», «sqrt(2)» и «2 * ans».
В словаре проверки pi — 3.14, а kvadrat — функция x * x; выражение — игрушка chislo. ["kvadrat", "(", 5, ")"] — это вызов kvadrat(5), ответ (25, 4). Ступень ниже здесь не нужна — вместо неё None.
Имя — токен-строка из букв (isalpha()). Если под номером i не имя (число, знак, конец списка), вернуть dalshe(tokeny, i, vyrazhenie) как есть.
Имени нет в словаре — ValueError(f"не знаю, что такое «{имя}»").
Значение в словаре — функция (callable): следом обязан стоять "(", иначе ValueError(f"после «{имя}» нужна скобка"). Внутри — vyrazhenie с токена после скобки; потом обязан стоять ")", иначе ValueError("не хватает закрывающей скобки"). Вернуть результат функции на значении выражения и номер токена после ")".
Значение — не функция: вернуть его и номер следующего токена.
Образцовый тест целиком
chislo = lambda t, i: (t[i], i + 1)
slovar = {"pi": 3.14, "kvadrat": lambda x: x * x}
imya(["kvadrat", "(", 5, ")"], 0, chislo, slovar, None)
(25, 4)
Обсуждение
Вопросов пока нет.
Войдите, чтобы спросить.