Defining a Coroutine in Python
Table of Content:
1. Defining a Coroutine in Python
• Define a coroutine function 'linear_equation' which takes two arguments 'a' and 'b'.
• Any coroutine derived from 'linear_equation' should be capable of taking a number as input, and evaluating the expression 'a*(x**2)+ b'.
• The couroutine after evaluating the expression should print the message 'Expression, 3*x^2+4, with x being 6 equals 112'.
Hint: Use print() instead of 'return', to print the output.
-----------
Solutions
#!/bin/python3 import sys # Define the coroutine function 'linear_equation' below. def linear_equation(a, b): while True: x=yield c=a*(pow(x,2))+b print('Expression, '+str(a)+'*x^2 + '+str(b)+', with x being '+str(x)+ ' equals '+str(c)) if __name__ == "__main__": a = float(input()) b = float(input()) equation1 = linear_equation(a, b) next(equation1) equation1.send(6)
2. Give a Try - Define a Decorator for Coroutine
• Define a Decorator 'coroutine_decorator', which can decorate any coroutine function.
• The decorator must create the coroutine, call 'next' on it and return the coroutine that is ready for accepting any input.
• For e.g
@coroutine_decorator def linear_equation(a,b):
e1 = linear_equation(3, 4) # e1 should able to accept input without calling 'next' on it. e1.send(6)
-----------
Solution
import sys import os # Define 'coroutine_decorator' below def coroutine_decorator(coroutine_func): def wrapper(*args, **kwdargs): c = coroutine_func(*args, **kwdargs) next(c) return c return wrapper # Define coroutine 'linear_equation' as specified in previous exercise @coroutine_decorator def linear_equation(a, b): while True: x=yield c=a*(pow(x,2))+b print('Expression, '+str(a)+'*x^2 + '+str(b)+', with x being '+str(x)+ ' equals '+str(c)) if __name__ == "__main__": a = float(input()) b = float(input()) equation1 = linear_equation(a, b) equation1.send(6)
3. Give a Try - Linking two coroutines
• Define 'linear_equation' and 'coroutine_decorator' functions as requested in previous test case.
• Define a coroutine function 'numberParser', which is capable of converting the passed input into an integer and also sends the integers to two linear equation coroutines equation1 and 'equation2`.
• 'equation1' represents linear equation coroutine with a = 3 and b = 4
'equation2' represents linear equation coroutine with a = 2 and b = -1
------------
#!/bin/python3 import sys # Define the function 'coroutine_decorator' below def coroutine_decorator(coroutine_func): def wrapper(*args, **kwdargs): c = coroutine_func(*args, **kwdargs) next(c) return c return wrapper # Define the coroutine function 'linear_equation' below @coroutine_decorator def linear_equation(a, b): while True: x=yield c=a*(pow(x,2))+b print('Expression, '+str(a)+'*x^2 + '+str(b)+', with x being '+str(x)+ ' equals '+str(c)) # Define the coroutine function 'numberParser' below @coroutine_decorator def numberParser(): equation1 = linear_equation(3, 4) equation2 = linear_equation(2, -1) # code to send the input number to both the linear equations while True: m=yield equation1.send(m) equation2.send(m) def main(x): n = numberParser() n.send(x) if __name__ == "__main__": x = float(input()) res = main(x);