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

- такой способ не работает
 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)
но тогда теряется весь смысл тестирующей функции
py.user.next
Не надо ничего передавать в тестирующую функцию. Внутри функции определи набор (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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB