Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.06.2022
Сообщений: 6

Задача про декораторы. Написать функцию, которая изменяет поведение функции magic.

18.11.2022, 09:15. Показов 1025. Ответов 4

Студворк — интернет-сервис помощи студентам
Прошу помочь с задачкой для декораторов

При переходе через Карадрас братству кольца сильно помешала снежная буря. Гендальф решил сотворить заклинание, чтобы утихомирить эту бурю. Бедный Гендальф не знал, что Саруман настроил палантир на перехват всех заклинаний Гендальфа. Как только Гендальф колдовал заклинание, его перехватывал палантир, изменял код этого заклинания и перезапускал. В итоге колдовалось совершенно не то заклинание, которое хотел Гендальф, а обратное ему. А кто же запрограммировал палантир? Так это же Вы! Нужно написать функцию, которая изменяет поведение функции magic. Если быть точным, перехватывает текст функции magic, изменяет в нем слова ‘делай’ на ‘не делай’ и лишь потом вызывает оригинальную функцию magic с уже измененным текстом. Входные данные:
<Исходное заклинание> Выходные данные: Выходные данные должны быть представлены в формате:
<Измененный текст>
Программа, при которой будет такой вывод, выглядит следующим образом:

Python
1
2
3
4
@decor def magic(text): 
                 text_with_spaces = text.replace(' ', ' ') # меняем везде 1 пробел на 2 
                 todo = text_with_spaces.count(' делай ') + text_with_spaces.count('Делай ') - (text_with_spaces.count('Не делай ') + text_with_spaces.count(' не делай ')) 
                 return text + '!' + ' (Tasks to do = %s)' % todo
Кроме того, внимательно изучите примеры ввода/вывода. Слово делай может начинаться с заглавной буквы, тогда к нему нужно применять особые правила обработки.
Гарантируется, что со словом ‘делай’ не будут слеплены никакие знаки препинания! То есть на вводе не будет предложений типа: ‘Делай, делай дождь’
Если перед словом делай и так стоит ‘не’, то ничего делать не нужно.

Примеры ввода/вывода:

Ввод:
Дождик, дождик, веселей, делай небо ты светлей
Вывод:
Дождик, дождик, веселей, не делай небо ты светлей! (Tasks to do = 0)

Ввод:
Делай солнце, солнце свет, делай ярче небо
Вывод:
Не делай солнце, солнце свет, не делай ярче небо! (Tasks to do = 0)

Ввод:
Сделай магию
Вывод:
Сделай магию! (Tasks to do = 0)

Ввод:
Привет, срочно делайте мне магию
Вывод:
Привет, срочно делайте мне магию! (Tasks to do = 0)

Ввод:
Делай делай магию, срочно сделай магию. Но не делай ничего, делай магию скорее
Вывод:
Не делай не делай магию, срочно сделай магию. Но не делай ничего, не делай магию скорее! (Tasks to do = 0)

Ввод:
Делайте же магию ура ура ура
Вывод:
Делайте же магию ура ура ура! (Tasks to do = 0)

Ввод:
Сделайте же магию ура ура ура
Вывод:
Сделайте же магию ура ура ура! (Tasks to do = 0)

Ввод:
Да делай делай магию
Вывод:
Да не делай не делай магию! (Tasks to do = 0)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2022, 09:15
Ответы с готовыми решениями:

Как написать функцию, которая изменяет текст во всех областях
Нужно написать такую функцию, которая будет принимать в себя такой текст (`We are &lt;mixcase&gt;living&lt;/mixcase&gt; in a...

Написать функцию, которая в строке изменяет на противоположный регистры всех символов
Написать функцию, которая в строке, переданной в качестве аргумента, изменяет на противоположный регистры всех символов (например, для...

Питон задача про декораторы
Напишите декоратор debug, который при каждом вызове декорируемой функции выводит её имя (вместе со всеми передаваемыми аргументами), а...

4
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
18.11.2022, 12:40
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
def decor(func):
    def wrapper(text):
        new_string = ''
        i = 0
        from_func = func(text)
        while i < len(text):
            if text[i:].startswith(('не делай', 'Не делай')):
                new_string += text[i:i + 8]
                i += 7
            elif text[i:].startswith('делай ') and i > 0 and text[i - 1] == ' ':
                new_string += 'не делай'
                i += 4
            elif text[i:].startswith('Делай '):
                new_string += 'Не делай'
                i += 4
            else:
                new_string += text[i]
            i += 1
        return from_func.replace(text, new_string)
 
    return wrapper
 
 
@decor
def magic(text):
    text_with_spaces = text.replace(' ', '  ')  # меняем везде 1 пробел на 2
    todo = text_with_spaces.count(' делай ') + text_with_spaces.count('Делай ') - (
            text_with_spaces.count('Не делай ') + text_with_spaces.count(' не делай '))
    return text + '!' + ' (Tasks to do = %s)' % todo
 
 
print(magic('Дождик, дождик, веселей, делай небо ты светлей'))
print(magic('Делай солнце, солнце свет, делай ярче небо'))
print(magic('Сделай магию'))
print(magic('Привет, срочно делайте мне магию'))
print(magic('Делай делай магию, срочно сделай магию. Но не делай ничего, делай магию скорее'))
print(magic('Делайте же магию ура ура ура'))
print(magic('Сделайте же магию ура ура ура'))
print(magic('Да делай делай магию'))
Добавлено через 1 час 29 минут
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
def decor(func):
    def wrapper(text):
        from_func = func(text)
        text_split = text.split()
        for i, word in enumerate(text_split):
            if word == 'делай' and i > 0 and text_split[i - 1] not in ('не', 'Не'):
                text_split[i] = 'не делай'
            elif word == 'Делай':
                text_split[i] = 'Не делай'
        return from_func.replace(text, ' '.join(text_split))
 
    return wrapper
 
 
@decor
def magic(text):
    text_with_spaces = text.replace(' ', '  ')  # меняем везде 1 пробел на 2
    todo = text_with_spaces.count(' делай ') + text_with_spaces.count('Делай ') - (
            text_with_spaces.count('Не делай ') + text_with_spaces.count(' не делай '))
    return text + '!' + ' (Tasks to do = %s)' % todo
 
 
print(magic('Дождик, дождик, веселей, делай небо ты светлей'))
print(magic('Делай солнце, солнце свет, делай ярче небо'))
print(magic('Сделай магию'))
print(magic('Привет, срочно делайте мне магию'))
print(magic('Делай делай магию, срочно сделай магию. Но не делай ничего, делай магию скорее'))
print(magic('Делайте же магию ура ура ура'))
print(magic('Сделайте же магию ура ура ура'))
print(magic('Да делай делай магию'))
1
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
18.11.2022, 13:36
Можно и так
Python
1
2
3
4
5
6
7
8
9
def decor(func):
    def wrapper(text):
        
        text = text.replace(' ', '  ')\
                   .replace(' делай ', ' не делай ')\
                   .replace('Делай ', 'Не делай ')\
                   .replace(' не не делай ', ' не делай ')\
                   .replace('  ', ' ')
        return func(text)
1
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
18.11.2022, 13:46
Gdez,
"не делай" неверно обрабатывает, "не не делай".

Python
1
2
3
4
5
6
7
8
9
10
def magic(text):
    text = text.replace(' ', '  ') \
        .replace(' делай ', ' не делай ') \
        .replace('Делай ', 'Не делай ') \
        .replace(' не не делай ', ' не делай ') \
        .replace('  ', ' ')
    return text
 
 
print(magic('Но не делай ничего.'))
1
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
18.11.2022, 14:14
Верно
Четвертый и пятый replace нужно поменять местами...
Но Ваш код оптимальнее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.11.2022, 14:14
Помогаю со студенческими работами здесь

Написать "чистую функцию" которая не изменяет исходный код
Доброго времени суток, вот возник такой вопрос, мне необходимо написать так называемую &quot;чистую функцию&quot; которая не изменяет...

Написать функцию которая изменяет строку по правилу комплементарности и вернуть строку в обратном порядке
Написать функцию ComplementingDNA(dna) на вход которой подается строка (участок ДНК). Функция должна изменить строку по правилу ...

Описать функцию, которая изменяет заданную строку следующим образом
задача:Описать функцию, которая изменяет заданную строку следующим образом: сначала записывает все элементы с четными индексами, а затем...

Написать функцию swap(int& a,int& b,int& c), которая изменяет значения параметров по правилу a->b->c->a
Написал 3 функции с разной адресацией, возникает проблема с swap1 и swap. Не могу понять где ошибка. Нужно чтоб вывод работал: По...

Написать программу, которая изменяет сама себя во время работы
Поскольку в компьютере с архитектурой фон Неймана программа и данные расположены в одной области памяти, программа может менять свой...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru