2015-12-15 2 views
1

Меня попросили найти модуль 37 (% 37) функции.Использование декораторов для решения математических уравнений в Python (предыдущие документы Qs)

Убедитесь, что функция возвращает целое число от 0 до 36. Предположим, что все аргументы являются целыми числами от 0 до 36. Написать декоратора @normalize_37, что делает именно это. То есть если «бар» является функцией, то декорированная функция будет иметь все его аргументы уменьшается по модулю 37 и его возвращаемое значение уменьшается по модулю 37.

Поиск:

@normalize_37 
def add(x,y): 
    return x+y 
print(add(45,67)) 
#where the answer is 1. 

@normalize_37 
def bar(n): 
    if n >= 37 or n <= -1: 
     raise ValueError 
    else: 
     return n 
print(bar(123)) 
#where the answer is 12 

До сих пор я придумал это первый бит от отрываясь декораторы онлайн:

import math 

def document(f): 
    def wrap(x,y): 
     print("I am going to find modulo 37 of", x,y) 
     f(x,y) 
    return wrap 

@document 
def add(x,y): 
    print(add(x,y)%37) 

add(45,67) 

, но он не работает для меня, и когда я запускаю его, он просто повторяет: «Я собираюсь найти по модулю 37» немного снова и снова еще раз.

+0

... вы называете 'е (х, у)', но вы на самом деле не по модулю или возвращает результат. –

ответ

2

Конкретный вид просил бы

def normalize_37(fn):    # the decorator 
    def inner(x, y):    # the new decorated function 
     return fn(x, y) % 37 
    return inner 

@normalize_37 
def add(x, y): 
    return x + y 

add(45, 67) # returns 112 % 37 == 1 

, но мы можем обобщить один шаг дальше,

def normalize(n):     # make a decorator! 
    def decorator(fn):    # the decorator 
     def inner(*args):   # the new decorated function 
      return fn(*args) % n 
     return inner 
    return decorator 

@normalize(37) 
def add(*args): 
    return sum(args) 

add(45, 67) # returns 112 % 37 == 1 

Edit: хорошо, я пропустил немного о снижении аргументы, а также. Таким образом, становится

def normalize(n):     # make a decorator! 
    def decorator(fn):    # the decorator 
     def inner(*args):   # the new decorated function 
      return fn(*(arg % n for arg in args)) % n 
     return inner 
    return decorator 

@normalize(37) 
def add(*args): 
    return sum(args) 

add(45, 67) # returns ((45 % 37) + (67 % 37)) % 37 == 1 

или в более простой форме,

def normalize_37(fn):    # the decorator 
    def inner(x, y):    # the new decorated function 
     return fn(x % 37, y % 37) % 37 
    return inner 
+0

Хорошо, проверьте его пример «bar». – thefourtheye