Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2018 13:33:37

did.vasiliy
Зарегистрирован: 2018-10-26
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как правильно вернуть значение функции?

Добрый день!
Подскажите пожалуйста, как возвращать значение выполненной функции. Т.е я хочу написать три функции численного интегрирования, а затем запустить функцию тестирования, чтобы она запускала тестируемые функции. Но у меня выходит ошибка. Тест получается если я каждую тестируемую функцию вношу отдельно, а именно:

- такой способ не работает

 def test_method(method):
    '''разбивает интегрируемую функцию на части "n"
       до получения заданной точности'''
    print("Тестируем ", method.__doc__)
    a=0
    b=3
    n=1
    y1=method
    n*=2
    y2=method
    print(y2)
    while abs(y2-y1)>0.001:
        n*=2
        y1=method
        n*=2
        y2=method
    print("конечное колличество разбиений:", n)
    print("значение функции:", y2)
if __name__=="__main__":
    test_method(rectangle_method)
выдает ошибку:
 while abs(y2-y1)>0.001:
TypeError: unsupported operand type(s) for -: 'function' and 'function'
приходится делать вот так:
 def test_method(method):
    '''разбивает интегрируемую функцию на части "n"
       до получения заданной точности'''
    print("Тестируем ", method.__doc__)
    a=0
    b=3
    n=1
    y1=rectangle_method(f, n, a, b)
    n*=2
    y2=rectangle_method(f, n, a, b)
    print(y2)
    while abs(y2-y1)>0.001:
        n*=2
        y1=rectangle_method(f, n, a, b)
        n*=2
        y2=rectangle_method(f, n, a, b)
    print("конечное колличество разбиений:", n)
    print("значение функции:", y2)
где
 def rectangle_method(f, n, a, b):
    '''интегрирование методом прямоугольников'''
    h=(b-a)/n
    y=h*sum([f(a+k*h) for k in range(n+1)])
    return float(y)
но тогда теряется весь смысл тестирующей функции

Офлайн

#2 Ноя. 4, 2018 14:53:31

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Как правильно вернуть значение функции?

Не надо ничего передавать в тестирующую функцию. Внутри функции определи набор (f, n, a, b) и res - правильный ответ для этого набора. Дальше вызови функцию rectangle_method() с этим набором (f, n, a, b), получи ответ для него и сравни с правильным ответом res через assert. Если ответы не сойдутся, тест выпадет и покажет, что функция rectangle_method() для набора (f, n, a, b) работает неправильно. Если ответы сойдутся, то тест пройдёт и покажет, что функция rectangle_method() для набора (f, n, a, b) работает правильно.

Используй пакет py.test или модуль unittest.

Иногда можно использовать модуль doctest, чтобы по-быстрому тесты делать. Вообще, doctest подразумевает, что ты прямо в комментарии функции пишешь тесты, но можно и отдельные файлы писать и подавать их в doctest через командную строку (чтобы не засорять комментарии функций тестовыми данными).

Пример использования doctest без засорения кода:
file_with_tests.txt

>>> from module_name import function_name as f
>>> f(1, 2, 3, 4)
5
>>> f(2, 3, 4, 5)
6
>>>
В командной строке
python3 -mdoctest file_with_tests.txt



Отредактировано py.user.next (Ноя. 4, 2018 14:58:03)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version