As programs grow in complexity, the number of lines increases, making the code bulky and difficult to manage. Modular programming is the process of dividing a computer program into separate, independent blocks of code or sub-problems with distinct names and specific functionalities.
Case Study: Tent Manufacturing Cost Estimation (Program 7-1)
Socio-Technical Analysis & Core Systemic Impact: A company manufactures tents with a cylindrical base surmounted by a conical top. To calculate the selling price, the system must: (1) Accept height, radius, and slant height; (2) Calculate the canvas area; (3) Calculate the raw material cost; (4) Apply an 18% tax. Writing this as a single monolithic script makes debugging and code reuse impossible when new tent designs (e.g., rectangular bases) are introduced.
Monolithic implementation without functions (Program 7-1):
# Program 7-1: Calculate payable amount without functions
print("Enter values for the cylindrical part of the tent in meters\n")
h = float(input("Enter height of the cylindrical part: "))
r = float(input("Enter radius: "))
l = float(input("Enter the slant height of the conical part in meters: "))
csa_conical = 3.14 * r * l
csa_cylindrical = 2 * 3.14 * r * h
canvas_area = csa_conical + csa_cylindrical
print("The area of the canvas is", canvas_area, "m^2")
unit_price = float(input("Enter the cost of 1 m^2 canvas: "))
total_cost = unit_price * canvas_area
print("The total cost of canvas = ", total_cost)
tax = 0.18 * total_cost
net_price = total_cost + tax
print("Net amount payable = ", net_price)
A function is a named group of instructions that accomplish a specific task when invoked. Once defined, a function can be called repeatedly from different places in a program, facilitating modularity and reusability.
By dividing the program into independent blocks of code, we achieve modularity (Program 7-2):
# Program 7-2: Calculate payable amount using user-defined functions
def cyl(h, r):
area_cyl = 2 * 3.14 * r * h
return area_cyl
def con(l, r):
area_con = 3.14 * r * l
return area_con
def post_tax_price(cost):
tax = 0.18 * cost
net_price = cost + tax
return net_price
print("Enter values of cylindrical part of the tent in meters:")
h = float(input("Height: "))
r = float(input("Radius: "))
csa_cyl = cyl(h, r)
l = float(input("Enter slant height of the conical area in meters: "))
csa_con = con(l, r)
canvas_area = csa_cyl + csa_con
print("Area of canvas = ", canvas_area, " m^2")
unit_price = float(input("Enter cost of 1 m^2 canvas in rupees: "))
total_cost = unit_price * canvas_area
print("Total cost of canvas before tax = ", total_cost)
print("Net amount payable (including tax) = ", post_tax_price(total_cost))
A function definition begins with the keyword def (short for define), followed by the function name, optional parameters enclosed in parentheses, and a colon.
def function_name([parameter_1, parameter_2, ...]):
# Function Header
set_of_instructions_to_be_executed
[return value] # Function Body
[ ]
are optional parameters.
:
).
An argument is a value passed to the function during a function call, which is received by the corresponding parameter defined in the function header.
Technical Profile: Parameter Passing & Object Identity
id()
function.
Demonstrating parameter identity and modification (Program 7-5):
def incrValue(num):
print("Parameter num has value:", num, "\nid =", id(num))
num = num + 5
print("num incremented by 5 is", num, "\nNow id is ", id(num))
number = int(input("Enter a number: "))
print("id of argument number is:", id(number))
incrValue(number)
Python allows assigning a default parameter value to a parameter. If the function call does not provide an argument for that parameter, the predecided default value is used.
def mixedFraction(num, deno = 1):
remainder = num % deno
if remainder != 0:
quotient = int(num / deno)
print("The mixed fraction=", quotient, "(", remainder, "/", deno, ")")
else:
print("The given fraction evaluates to a whole number")
def calcInterest(principal = 1000, rate, time = 5):
def calcInterest(rate, principal = 1000, time = 5):
Functions that perform calculations and display results without returning a value are called
void functions
. Functions can return values using the
return
statement. Python functions can return multiple values packaged as a
tuple
.
def calcAreaPeri(length, breadth):
area = length * breadth
perimeter = 2 * (length + breadth)
return (area, perimeter) # Returns a tuple
The flow of execution is the order in which statements are executed. Execution always begins at the first statement of the program. Function definitions are parsed but their internal statements are not executed until the function is called.
A function must be defined before it is called. Calling a function before its definition raises a
NameError
:
# Program 7-11: Raises NameError
helloPython() # Function Call before definition
def helloPython():
print("I love Programming")
The scope of a variable refers to the part of the program where a variable is accessible. Python supports two primary scopes:
Using the
global
keyword to modify global variables (Program 7-15):
num = 5
def myfunc1():
global num # Informs Python to use the global variable
print("Accessing num =", num)
num = 10
print("num reassigned =", num)
myfunc1()
print("Accessing num outside myfunc1", num) # Prints 10
The Python Standard Library is an extensive collection of built-in functions and modules that facilitate rapid application development.
Built-in functions are always available in the Python interpreter without importing any module.
| Function Syntax | Arguments | Returns | Example Output |
|---|---|---|---|
abs(x)
|
Integer or float
x
|
Absolute value of
x
|
abs(-5.7)
→
5.7
|
divmod(x, y)
|
Integers
x
and
y
|
Tuple
(quotient, remainder)
|
divmod(7, 2)
→
(3, 1)
|
max(sequence)
or
max(x, y, ...)
|
Sequence or multiple arguments | Largest item |
max([1, 2, 3, 4])
→
4
|
min(sequence)
or
min(x, y, ...)
|
Sequence or multiple arguments | Smallest item |
min("Sincerity")
→
'S'
|
pow(x, y[, z])
|
Numbers
x
,
y
, and optional
z
|
$x^y$ or $(x^y) \% z$ |
pow(5, 2, 4)
→
1
|
sum(x[, num])
|
Numeric sequence
x
, optional start
num
|
Sum of elements (+
num
)
|
sum([2, 4, 7], 3)
→
16
|
len(x)
|
Sequence or dictionary
x
|
Count of elements |
len("Patience")
→
8
|
A
module
is a file containing a collection of related function definitions and statements. To use a module, it must be imported using the
import
statement.
Technical Profile: Core Python Modules
import module_name
or
from module_name import function_name
. Functions are accessed using dot notation:
module_name.function_name()
.
from
statement saves memory by loading only specified functions, but can lead to namespace conflicts.
1. The
math
Module:
Contains mathematical functions that return float values.
math.ceil(x)
: Returns the smallest integer greater than or equal to
x
.
math.floor(x)
: Returns the largest integer less than or equal to
x
.
math.fabs(x)
: Returns the absolute value of float
x
.
math.factorial(x)
: Returns the factorial of positive integer
x
.
math.gcd(x, y)
: Returns the greatest common divisor of
x
and
y
.
math.sqrt(x)
: Returns the square root of
x
.
2. The
random
Module:
Used for generating pseudo-random numbers.
random.random()
: Returns a random float in the range $[0.0, 1.0)$.
random.randint(x, y)
: Returns a random integer between
x
and
y
(inclusive).
random.randrange([start], stop[, step])
: Returns a randomly selected element from the specified range.
3. The
statistics
Module:
Provides functions for calculating mathematical statistics of numeric data.
statistics.mean(x)
: Calculates the arithmetic mean of sequence
x
.
statistics.median(x)
: Calculates the middle value of sequence
x
.
statistics.mode(x)
: Calculates the most common data point in sequence
x
.
Any Python file (
.py
) containing function definitions can be imported as a module. A
docstring
is a multiline comment enclosed in triple quotes (
"""
) placed at the beginning of a module or function to describe its purpose. It is stored in the
__doc__
attribute.
"""
basic_math Module
*******************
This module contains basic arithmetic operations.
"""
def addnum(x, y):
return x + y
def subnum(x, y):
return x - y
To access the docstring of an imported module:
>>> import basic_math
>>> print(basic_math.__doc__)
basic_math Module
*******************
This module contains basic arithmetic operations.
| Core Computer Science Concept | Technical Definition / Operational State | Structural Parameters & Specifications | Computational Function & System Purpose |
|---|---|---|---|
| Modular Programming | Decomposing a monolithic program into independent, named sub-units. | Defined by logical boundaries, parameter interfaces, and return types. | Improves code maintainability, readability, and parallel development. |
| User-Defined Functions |
Custom blocks of code defined by the programmer using the
def
keyword.
|
Consists of a function header, parameters, indented body, and optional return statement. | Encapsulates repetitive logic to achieve code reusability. |
| Variable Scope | The accessibility and lifetime of variables within different parts of a program. | Classified into Global (module-level) and Local (function-level) scopes. | Prevents namespace pollution and accidental state modification. |
| Standard Library Modules | Pre-compiled Python files containing collections of related functions. |
Imported using
import
or
from ... import
statements.
|
Provides optimized, ready-to-use solutions for math, statistics, and random generation. |
Case Study: Student Management Information System (SMIS) Attendance Checker
Socio-Technical Analysis & Core Systemic Impact: To automate attendance tracking, a user-defined function must accept the total number of working days in a month and the count of days a student was present. The function calculates the attendance percentage. If the attendance is less than 78%, it returns
1(indicating short attendance/defaulter status); otherwise, it returns0. This modular component can be integrated into larger school administration portals to automatically flag students with low attendance.