Chap-5

Mon 22 June 2026
def greet():
    print("Hello, Python!")
greet()
Hello, Python!
def square(number):
    print(number ** 2)
user_input = input("Enter a number: ")
converted_number = int(user_input)
square(converted_number)
Enter a number:  45


2025
def add(a, b):
    return a + b
result = add(8,5)
print(result)  
13
def greet_user(name="Guest"):
    print(f"Hello, {name}!")
greet_user()
greet_user("Alex")
Hello, Guest!
Hello, Alex!
def student_info(name, age):
    print(f"Student Name: {name}")
    print(f"Student Age: {age}")
student_info(age=21, name="Sam")
Student Name: Sam
Student Age: 21
def sum_numbers(*args):
    return sum(args)
print(sum_numbers())
print(sum_numbers(5, 10, 15))
print(sum_numbers(1.5, 2.5, -3.0, 4.0))
0
30
5.0
def display_profile(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
display_profile(name="Jordan", role="Developer", location="Boston")
name: Jordan
role: Developer
location: Boston
def complete_profile(*args, **kwargs):
    print("Positional arguments:")
    for item in args:
        print(f"- {item}")
    print("\nKeyword arguments:")
    for key, value in kwargs.items():
        print(f"- {key}: {value}")
complete_profile(
    "Photography", "Hiking", name="Taylor", age=28, city="Seattle"
)
Positional arguments:
- Photography
- Hiking

Keyword arguments:
- name: Taylor
- age: 28
- city: Seattle
cube = lambda x: x**3
print(cube(3))
print(cube(5))
27
125
def cube(x):
    return x**3
print(cube(3))
print(cube(5))
27
125
x = 100  
def local_scope_demo():
    x = 10  
    print(f"Inside function (local): {x}")
local_scope_demo()
print(f"Outside function (global): {x}")
Inside function (local): 10
Outside function (global): 100
counter = 0  
def increment_counter():
    global counter  
    counter += 1
increment_counter()
increment_counter()
increment_counter()
print(f"Final counter value: {counter}")
Final counter value: 3
def outer_function():
    message = "Hello from the enclosing scope!"  
    def inner_function():
        print(message)
    inner_function()
outer_function()
Hello from the enclosing scope!
def outer_function():
    counter = 0 
    def inner_function():
        nonlocal counter  
        counter += 1
        print(f"Current count: {counter}")
    inner_function()
    inner_function()
outer_function()
Current count: 1
Current count: 2
built_in_example = len
x = "Global Scope"
def outer_function():
    x = "Enclosing Scope"
    def inner_function():
        x = "Local Scope"
        print(f"1. Inside inner_function (looks at Local): {x}")
        print(
            f"4. Inside inner_function (using Built-in len): Length of Local is {built_in_example(x)}"
        )
    inner_function()
    print(f"2. Inside outer_function (looks at Enclosing): {x}")
outer_function()
print(f"3. Outside all functions (looks at Global): {x}")
1. Inside inner_function (looks at Local): Local Scope
4. Inside inner_function (using Built-in len): Length of Local is 11
2. Inside outer_function (looks at Enclosing): Enclosing Scope
3. Outside all functions (looks at Global): Global Scope
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)
print(f"0! = {factorial(0)}")
print(f"1! = {factorial(1)}")
print(f"5! = {factorial(5)}")
print(f"7! = {factorial(7)}")
0! = 1
1! = 1
5! = 120
7! = 5040
def fibonacci(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)
for i in range(8):
    print(f"n = {i}: {fibonacci(i)}")
n = 0: 0
n = 1: 1
n = 2: 1
n = 3: 2
n = 4: 3
n = 5: 5
n = 6: 8
n = 7: 13
def sum_n(n):
    if n <= 1:
        return 1
    return n + sum_n(n - 1)
n = 10
recursive_result = sum_n(n)
formula_result = int(n * (n + 1) / 2)
print(f"Recursive sum_n({n}): {recursive_result}")
print(f"Formula result ({n}*({n}+1)/2): {formula_result}")
print(f"Match verified: {recursive_result == formula_result}")
Recursive sum_n(10): 55
Formula result (10*(10+1)/2): 55
Match verified: True
def reverse_string(s):
    if len(s) <= 1:
        return s
    return s[-1] + reverse_string(s[:-1])
print(f"Original: 'Python'      -> Reversed: '{reverse_string('Python')}'")
print(f"Original: 'Hello World' -> Reversed: '{reverse_string('Hello World')}'")
Original: 'Python'      -> Reversed: 'nohtyP'
Original: 'Hello World' -> Reversed: 'dlroW olleH'
import time
from functools import lru_cache
def fibonacci(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)
@lru_cache(maxsize=None)
def fibonacci_cached(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fibonacci_cached(n - 1) + fibonacci_cached(n - 2)
n_value = 35
start_time = time.perf_counter()
result_un_cached = fibonacci(n_value)
end_time = time.perf_counter()
time_un_cached = end_time - start_time
start_time = time.perf_counter()
result_cached = fibonacci_cached(n_value)
end_time = time.perf_counter()
time_cached = end_time - start_time
print(f"Without memoization: Result = {result_un_cached}, Time = {time_un_cached:.5f} seconds")
print(f"With memoization:    Result = {result_cached}, Time = {time_cached:.5f} seconds")
print(f"Speedup factor:      {time_un_cached / time_cached:.1f}x faster")
Without memoization: Result = 9227465, Time = 8.48784 seconds
With memoization:    Result = 9227465, Time = 0.00052 seconds
Speedup factor:      16216.7x faster
import math
print(f"Square root of 144: {math.sqrt(144)}")
print(f"Value of pi: {math.pi}")
print(f"Ceiling of 4.3: {math.ceil(4.3)}")
Square root of 144: 12.0
Value of pi: 3.141592653589793
Ceiling of 4.3: 5
from math import factorial, gcd
print(f"Factorial of 6: {factorial(6)}")
print(f"GCD of 48 and 18: {gcd(48, 18)}")
Factorial of 6: 720
GCD of 48 and 18: 6
import random
print("Five random integers between 1 and 100:")
for _ in range(5):
    random_number = random.randint(1, 100)
    print(random_number)
Five random integers between 1 and 100:
83
53
67
89
79


Score: 20

Category: python-notes