Functions 
       Mathematical functions as Python functions 
       Understanding the program flow 
       Local and global variables 
       Multiple arguments 
       Function argument or global variable? 
       Beyond mathematical functions 
       Multiple return values 
       Computing sums 
       Functions with no return values 
       Keyword arguments 
       Doc strings 
       Functions as arguments to functions 
       The main program 
       Lambda functions 
 Branching 
       If-else blocks 
       Inline if tests 
 Summary 
       Chapter topics 
       Example: Numerical integration 
 Exercises 
       Exercise 1: Implement a simple mathematical function 
       Exercise 2: Implement a simple mathematical function with a parameter 
       Exercise 3: Explain how a program works 
       Exercise 4: Write a Fahrenheit-Celsius conversion functions 
       Exercise 5: Write a test function for Exercise 4: Write a Fahrenheit-Celsius conversion functions 
       Exercise 6: Given a test function, write the function 
       Exercise 7: Evaluate a sum and write a test function 
       Exercise 8: Write a function for solving \( ax^2 + bx + c =0 \) 
       Exercise 9: Implement the sum function 
       Exercise 10: Compute a polynomial via a product 
       Exercise 11: Integrate a function by the Trapezoidal rule 
       Exercise 12: Derive the general Midpoint integration rule 
       Exercise 13: Make an adaptive Trapezoidal rule 
       Exercise 14: Simulate a program by hand 
       Exercise 15: Debug a given test function 
       Exercise 16: Compute the area of an arbitrary triangle 
       Exercise 17: Compute the length of a path 
       Exercise 18: Approximate \( \pi \) 
       Exercise 19: Compute the area of a polygon 
       Exercise 20: Write functions 
       Exercise 21: Approximate a function by a sum of sines 
       Exercise 22: Implement a Gaussian function 
       Exercise 23: Wrap a formula in a function 
       Exercise 24: Write a function for numerical differentiation 
       Exercise 25: Implement the factorial function 
       Exercise 26: Compute velocity and acceleration from 1D position data 
       Exercise 27: Find the max and min values of a function 
       Exercise 28: Find the max and min elements in a list 
       Exercise 29: Implement the Heaviside function 
       Exercise 30: Implement a smoothed Heaviside function 
       Exercise 31: Implement an indicator function 
       Exercise 32: Implement a piecewise constant function 
       Exercise 33: Apply indicator functions 
       Exercise 34: Test your understanding of branching 
       Exercise 35: Simulate nested loops by hand 
       Exercise 36: Rewrite a mathematical function 
       Exercise 37: Make a table for approximations of \( \cos x \) 
       Exercise 38: Use None in keyword arguments 
       Exercise 39: Write a sort function for a list of 4-tuples 
       Exercise 40: Find prime numbers 
       Exercise 41: Resolve a problem with a function 
       Exercise 42: Determine the types of some objects 
       Exercise 43: Find an error in a program 
 References 
This document introduces two fundamental and extremely useful
concepts in programming: user-defined
functions and branching of program flow, the latter often referred to as
if tests. The programs associated with the document are found
in the folder src/funcif.
This chapter is taken from the book A Primer on Scientific Programming with Python by H. P. Langtangen, 5th edition, Springer, 2016.