Advanced Functions
Closures, decorators, function factories, and advanced patterns.
Overview
Master advanced function concepts.
Closures
def multiplier(factor):
def multiply(number):
return number * factor
return multiply
double = multiplier(2)
triple = multiplier(3)
print(double(5)) # 10
print(triple(5)) # 15
# Practical example
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
counter_func = counter()
print(counter_func()) # 1
print(counter_func()) # 2
print(counter_func()) # 3
Decorators
# Basic decorator
def timer(func):
import time
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} took {end - start:.4f} seconds")
return result
return wrapper
@timer
def slow_function():
import time
time.sleep(1)
return "Done"
# Decorator with arguments
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def greet(name):
print(f"Hello, {name}!")
greet("Alice")
# Hello, Alice!
# Hello, Alice!
# Hello, Alice!
Function Factories
# Create functions dynamically
def create_adder(x):
def adder(y):
return x + y
return adder
add5 = create_adder(5)
add10 = create_adder(10)
print(add5(3)) # 8
print(add10(3)) # 13
# Validator factory
def create_validator(min_val, max_val):
def validator(value):
return min_val <= value <= max_val
return validator
age_validator = create_validator(0, 150)
print(age_validator(25)) # True
print(age_validator(200)) # False
Partial Functions
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
cube = partial(power, exponent=3)
print(square(5)) # 25
print(cube(5)) # 125
# Practical example
def multiply(a, b):
return a * b
double = partial(multiply, 2)
print(double(5)) # 10
Recursion
# Factorial
def factorial(n):
if n <= 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
# Fibonacci
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10)) # 55
# Tree traversal
def traverse_tree(node):
if node is None:
return []
return (
[node.value] +
traverse_tree(node.left) +
traverse_tree(node.right)
)
Practice
Create a memoization decorator for recursive functions.