def get_progress_rate(k, c_species, v_reactants):
    """Returns the progress rate for a reaction of the form: va*A+vb*B --> vc*C.
    
    INPUTS
    =======
    k: float
       Reaction rate coefficient
    c_species: 1D list of floats
       Concentration of all species
    v_reactants: 1D list of floats
       Stoichiometric coefficients of reactants
    
    RETURNS
    ========
    w: float
       prgress rate of this reaction

    NOTES
    =====
    PRE: 
         - k, each entry of c_species and v_reactants have numeric type
         - c_species and v_reactants have the same length
    POST:
         - k, c_species and v_reactants are not changed by this function
         - raises a ValueError if k <= 0
         - raises an Exception if c_species and v_reactants have different length
         - returns the prgress rate w for the reaction

    EXAMPLES
    =========
    >>> get_progress_rate(10, [1.0, 2.0, 3.0], [2.0, 1.0, 0.0])
    20.0
    """
    if k <= 0:
        raise ValueError('k must be positive.')
    if len(c_species) != len(v_reactants):
        raise Exception('List c_species and list v_reactants must have same length.')
    w = k
    for c, v in zip(c_species, v_reactants):
        w *= pow(c, v)
    return w