5.4. Examples: Lecture 5#
5.4.1. A simple class to handle rational numbers#
fraction.py
#!/usr/bin/python
'''
a simple class to handle fractions of integer numbers
'''
from math import gcd
import sys
def lcm (a, b) :
    """least common multiple 
    Args:
        a (int): the first number
        b (int): the second number
    Returns:
        int: the least common multiple of the two numbers
    """
    return a * b / gcd (a,b)
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
class Fraction :
    '''
    a simple class implementing a high-level object
    to handle fractions and their operations
    '''
    def __init__ (self, numerator, denominator) :
        """the constructor: initialises all the variables needed
        for the high-level object functioning
        Args:
            numerator (int): the numerator of the fraction
            denominator (int): the denominator of the fraction
        Raises:
            ValueError: Denominator cannot be zero
            ValueError: Numerator must be an integer
            ValueError: Denominator must be an integer
        """
        if denominator == 0 :
            raise ValueError ('Denominator cannot be zero')
        if type(numerator) != int:
            raise TypeError ('Numerator must be an integer')
        if not isinstance(denominator, int ): # alternative way to check the type
            raise TypeError ('Denominator must be an integer')
        
        # this allows to avoid calculating the LCM in the sum and subtraction
        common_divisor = gcd (self.numerator, self.denominator) # greatest common divisor 
        self.numerator = numerator // common_divisor
        self.denominator = denominator // common_divisor
        
    def print (self) :        
        '''
        prints the value of the fraction on screen
        '''
        print (str (self.numerator) + '/' + str (self.denominator))
    def ratio (self) :
        '''
        calculates the actual ratio between numerator and denominator,
        practically acting as a casting to float
        '''
        return self.numerator / self.denominator
    def __add__ (self, other) :
        """implements the addition of two fractions.
        Note that this function will be callable with the + symbol
        in the program
        Args:
            other (Fraction): the fraction to be added to the current one
        Returns:
            Fraction: the addition of the two fractions
        """
        new_numerator = self.numerator * other.denominator + other.numerator * self.denominator
        new_denominator = self.denominator * other.denominator
        return Fraction (new_numerator, new_denominator)
    
    def __sub__ (self, other) :
        """implements the subtraction of two fractions.
        Note that this function will be callable with the - symbol
        in the program
        Args:
            other (Fraction): the fraction to be subtracted from the current one
        Returns:
            Fraction: the subtraction of the two fractions
        """
        new_numerator = self.numerator * other.denominator - other.numerator * self.denominator
        new_denominator = self.denominator * other.denominator
        return Fraction (new_numerator, new_denominator)
    
    def __mul__ (self, other) :
        """
        implements the multiplications of two fractions.
        Note that this function will be callable with the * symbol
        in the program
        Args:
            other (Fraction): the fraction to be multiplied from the current one
        Returns:
            Fraction: the multiplication of the two fractions
        """
        new_numerator = self.numerator * other.numerator
        new_denominator = self.denominator * other.denominator
        return Fraction (new_numerator, new_denominator)
    
    def __truediv__ (self, other) :
        '''
        implements the ratio of two fractions.
        Note that this function will be callable with the / symbol
        in the program
        Args:
            other (Fraction): the fraction to be divided from the current one
        Returns:
            Fraction: the ratio of the two fractions
        '''
        if other.numerator == 0 :
            print ('Cannot divide by zero')
            sys.exit (1)
        
        new_numerator = self.numerator * other.denominator
        new_denominator = self.denominator * other.numerator
        return Fraction (new_numerator, new_denominator)
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
def testing ()  :
    '''
    Function to test the class behaviour, called in the main program
    '''
    print ('Initial fractions:')
    frac1 = Fraction (3, 4)
    frac1.print ()
    print ('ratio: ', frac1.ratio ())
    frac2 = Fraction (1, 2)
    frac2.print ()
    print ('ratio: ', frac2.ratio ())
    
    sum_frac = frac1 + frac2
    print ('\nSum :')
    sum_frac.print ()
    
    diff_frac = frac1 - frac2
    print ('\nDifference:')
    diff_frac.print ()
    
    prod_frac = frac1 * frac2
    print ('\nProduct:')
    prod_frac.print ()
    
    div_frac = frac1 / frac2
    print ('\nDivision:')
    div_frac.print ()
    
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
if __name__ == "__main__" :
    testing ()
5.4.2. A simple test of a lambda function#
lambda.py
#!/usr/bin/python
'''
a simple example of lambda function definition
'''
def square (a):
    return a**2
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
if __name__ == "__main__" :
    number = 5
    print (square (number))
    print ((lambda x : x**2)(number))
    f = lambda x : x**2
    print (f (number))
5.4.3. A simple test of the map function#
map.py
#!/usr/bin/python
'''
a simple example of the map function use
'''
def square (a):
    return a**2
# ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
    
if __name__ == "__main__" :
    # create a list to be used as an example
    lista = list (range (-5, 5))
    squared = list (map (square, lista))
    for e, esq in zip (lista, squared) :
        print (e, esq)
    squared2 = list (map (lambda x : x**2, lista))
    for e, esq in zip (lista, squared2) :
        print (e, esq)
5.4.4. A simple test of the filter function#
filter.py
#!/usr/bin/python
'''
a simple example of the filter function use
'''
    
if __name__ == "__main__" :
    lista = list (filter (lambda x: x % 2 == 0, range(-5, 5)))
    for e in lista : print (e)