1.Functions in Python
Agenda
- Functions in Python
- Arguments
- *Arbitrary Arguments, args
- **Arbitrary Keyword Arguments, kwargs
- Return Values from Function
1. Functions in Python
Functions are blocks of code that perform a specific task. They help in organizing code and reusing it.
Example:
def my_function():
print("Hello from a function")
my_function()
# Output: Hello from a function
2. Arguments
Arguments are values passed to functions. They are specified within the parentheses in the function definition.
Example:
def greet(name):
print("Hello, " + name)
greet("Alice")
# Output: Hello, Alice
3. Arbitrary Arguments, *args
When the number of arguments is unknown, use *args
. It allows the function to receive a variable number of arguments.
Example:
def my_function(*args):
for arg in args:
print(arg)
my_function("apple", "banana", "cherry")
# Output:
# apple
# banana
# cherry
4. Arbitrary Keyword Arguments, **kwargs
When the number of keyword arguments is unknown, use **kwargs
. It allows the function to receive a variable number of keyword arguments.
Example:
def my_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
my_function(name="Alice", age=30, city="New York")
# Output:
# name: Alice
# age: 30
# city: New York
5. Return Values from Function
Functions can return values using the return
statement.
Example:
def add(a, b):
return a + b
result = add(5, 3)
print(result)
# Output: 8
Functions in Python
- Definition:
- A function is a block of code that only runs when it is called. Functions can accept data, known as parameters, and can return data as a result.
Example of Defining and Calling a Function:
def my_function():
print("Hello from a function")
# Calling the function
my_function()
# Output: Hello from a function
Key Points
- Defining a Function:
- Use the
def
keyword followed by the function name and parentheses()
. - Inside the parentheses, you can define parameters if the function needs to accept inputs.
- The code block within the function is indented.
- Use the
- Calling a Function:
- To call a function, use the function name followed by parentheses
()
. - If the function has parameters, pass the arguments inside the parentheses.
- To call a function, use the function name followed by parentheses
Function with Parameters
Example:
def greet(name):
print("Hello, " + name)
# Calling the function with an argument
greet("Alice")
# Output: Hello, Alice
Function Returning a Value
Example:
def add(a, b):
return a + b
# Calling the function and printing the return value
result = add(5, 3)
print(result)
# Output: 8
Summary
- Function Definition: Functions are defined using the
def
keyword followed by the function name and parentheses. - Parameters: Functions can accept inputs, known as parameters, which are defined inside the parentheses.
- Function Call: Functions are called using their name followed by parentheses. If the function has parameters, arguments are passed inside the parentheses.
- Return Statement: Functions can return a value using the
return
statement.
Arguments in Python Functions
- Definition:
- Information can be passed into functions as arguments. You can add as many arguments as you want, just separate them with a comma. Arguments are often shortened to
args
in Python documentation.
- Information can be passed into functions as arguments. You can add as many arguments as you want, just separate them with a comma. Arguments are often shortened to
Examples
- Single Argument:
def my_function(fname):
print(fname + " Refsnes")
my_function("Emil")
my_function("Tobias")
my_function("Linus")
# Output:
# Emil Refsnes
# Tobias Refsnes
# Linus Refsnes
Multiple Arguments:
def my_function(child3, child2, child1):
print("The youngest child is " + child3)
my_function(child1="Emil", child2="Tobias", child3="Linus")
# Output:
# The youngest child is Linus
Key Points
- Parameters and Arguments:
- The terms parameter and argument can be used for the same thing: information that is passed into a function.
- Parameters are variables in the function definition.
- Arguments are the values passed to the function when it is called.
- Number of Arguments:
- A function must be called with the correct number of arguments.
- If a function expects two arguments, you must call it with two arguments, not more, and not less.
- Key = Value Syntax:
- You can also send arguments with the
key = value
syntax. - This allows you to assign values to parameters based on their names, rather than their position.
- You can also send arguments with the
- Default Parameter Value:
- If we call the function without an argument, it uses the default value.
Example of Default Parameter Value
def my_function(country="Norway"):
print("I am from " + country)
my_function("Sweden")
my_function("India")
my_function()
# Output:
# I am from Sweden
# I am from India
# I am from Norway
Summary
- Passing Arguments: Functions can accept any number of arguments, which are separated by commas.
- Parameters vs. Arguments: Parameters are defined in the function definition; arguments are the actual values passed.
- Correct Number of Arguments: Functions must be called with the correct number of arguments.
- Key = Value Syntax: Allows specifying arguments using parameter names.
- Default Parameter Values: Provide default values for parameters to use when no argument is provided.
Arbitrary Arguments, *args
- Definition:
- If you do not know how many arguments will be passed into your function, add a
*
before the parameter name in the function definition. - This way, the function will receive a tuple of arguments and can access the items accordingly.
- If you do not know how many arguments will be passed into your function, add a
Example:
def my_function(*kids):
print("The youngest child is " + kids[2])
my_function("Emil", "Tobias", "Linus")
# Output:
# The youngest child is Linus
Key Points
- *Using args:
- By adding
*
before the parameter namekids
, the function can accept an arbitrary number of arguments. - Inside the function,
kids
is treated as a tuple containing all the arguments passed to the function.
- By adding
- Accessing Items:
- You can access items in the
args
tuple using indexing, just like with a regular tuple. - In the example,
kids[2]
accesses the third argument passed to the function.
- You can access items in the
Example with Loop
Example
def my_function(*args):
for arg in args:
print(arg)
my_function("apple", "banana", "cherry")
# Output:
# apple
# banana
# cherry
Use Cases for *args
- Variable Number of Arguments:
- Use
*args
when you want to allow the function to handle more arguments than initially specified. - This is useful when the number of inputs is unknown or variable.
- Use
Example: Sum Function:
def sum_numbers(*numbers):
total = 0
for number in numbers:
total += number
return total
print(sum_numbers(1, 2, 3, 4, 5))
# Output:
# 15
Summary
- Arbitrary Arguments: Use
*args
to allow a function to accept a variable number of non-keyword arguments. - Tuple of Arguments: The
*args
parameter collects arguments into a tuple. - Accessing Arguments: Access items in the
args
tuple using indexing. - Flexible Functions:
*args
makes functions more flexible and adaptable to different numbers of inputs.
Arbitrary Keyword Arguments, **kwargs
- Definition:
- If you do not know how many keyword arguments will be passed into your function, add two asterisks
**
before the parameter name in the function definition. - This way, the function will receive a dictionary of arguments and can access the items accordingly.
- If you do not know how many keyword arguments will be passed into your function, add two asterisks
Example:
def my_function(**kid):
print("His last name is " + kid["lname"])
my_function(fname="Tobias", lname="Refsnes")
# Output:
# His last name is Refsnes
Key Points
- **Using kwargs:
- By adding
**
before the parameter namekid
, the function can accept an arbitrary number of keyword arguments. - Inside the function,
kid
is treated as a dictionary containing all the keyword arguments passed to the function.
- By adding
- Accessing Items:
- You can access items in the
kwargs
dictionary using keys, just like with a regular dictionary. - In the example,
kid["lname"]
accesses the value associated with the keylname
.
- You can access items in the
Example with Loop
Example:
def my_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
my_function(name="Alice", age=30, city="New York")
# Output:
# name: Alice
# age: 30
# city: New York
Use Cases for **kwargs
- Variable Number of Keyword Arguments:
- Use
**kwargs
when you want to allow the function to handle more keyword arguments than initially specified. - This is useful when the number of named inputs is unknown or variable.
- Use
Example: Student Information:
def print_student_info(**info):
for key, value in info.items():
print(f"{key}: {value}")
print_student_info(name="John", age=18, grade="A")
# Output:
# name: John
# age: 18
# grade: A
Summary
- Arbitrary Keyword Arguments: Use
**kwargs
to allow a function to accept a variable number of keyword arguments. - Dictionary of Arguments: The
**kwargs
parameter collects arguments into a dictionary. - Accessing Arguments: Access items in the
kwargs
dictionary using keys. - Flexible Functions:
**kwargs
makes functions more flexible and adaptable to different numbers of named inputs.
Return Values in Python Functions
- Definition:
- To let a function return a value, use the
return
statement.
- To let a function return a value, use the
Example:
def my_function(x):
return 5 * x
print(my_function(3)) # Output: 15
print(my_function(5)) # Output: 25
print(my_function(9)) # Output: 45
Key Points
- Return Statement:
- The
return
statement is used to exit a function and return a value to the caller. - The value to be returned is specified after the
return
keyword.
- The
- Function Call:
- When you call a function that returns a value, you can use the returned value in your code.
- In the example, the function
my_function
multiplies the inputx
by 5 and returns the result.
- Using Returned Values:
- You can store the returned value in a variable or directly use it in expressions or other function calls.
Example with Variable
Example:
def add(a, b):
return a + b
result = add(3, 4)
print(result) # Output: 7
Example with Conditional Logic
Example:
def is_even(number):
if number % 2 == 0:
return True
else:
return False
print(is_even(4)) # Output: True
print(is_even(5)) # Output: False
Summary
- Returning Values: Use the
return
statement to return a value from a function. - Function Call: The returned value can be used in further expressions or stored in variables.
- Versatility: The
return
statement allows functions to produce outputs that can be used in various ways, enhancing the versatility and reusability of functions.
2.Recursion Functions in Python
Recursion in Python
- Definition:
- Python accepts function recursion, which means a defined function can call itself.
- This allows a function to be used in complex calculations that can be broken down into simpler sub-problems.
Example: Factorial Calculation
- Factorial Definition:
- The factorial of a number 𝑛n is the product of all positive integers less than or equal to 𝑛n.
- For example, 5!=5×4×3×2×1=1205!=5×4×3×2×1=120.
Example Code:
def factorial(x):
if x == 1:
return 1
else:
return x * factorial(x - 1)
print(factorial(3)) # Output: 6
Key Points
- Base Case:
- Every recursive function must have a base case that stops the recursion.
- In the example, the base case is
if x == 1: return 1
.
- Recursive Case:
- The part of the function where it calls itself with a modified argument.
- In the example, the recursive case is
return x * factorial(x - 1)
.
- Function Call:
- The function
factorial
is called with an argument3
. - It calls itself with the argument
2
, then1
, and so on until the base case is met.
- The function
Step-by-Step Execution
- Step 1: Call
factorial(3)
- Not base case, so returns
3 * factorial(2)
- Not base case, so returns
- Step 2: Call
factorial(2)
- Not base case, so returns
2 * factorial(1)
- Not base case, so returns
- Step 3: Call
factorial(1)
- Base case met, returns
1
- Base case met, returns
- Step 4: Back to
factorial(2)
- Returns
2 * 1 = 2
- Returns
- Step 5: Back to
factorial(3)
- Returns
3 * 2 = 6
- Returns
Summary
- Recursion: A function calls itself to solve smaller instances of the same problem.
- Base Case: Stops the recursion to prevent infinite loops.
- Recursive Case: Calls the function itself with a modified argument.
- Use Cases: Suitable for problems that can be broken down into smaller, similar problems (e.g., factorials, Fibonacci sequences, tree traversal).
3.Anonymous Function or Lambda Function in Python
Anonymous or Lambda Functions
- Definition:
- A lambda function is a small anonymous function.
- A lambda function can take any number of arguments but can only have one expression.
Examples of Lambda Functions
Example 1: Single Argument:
x = lambda a: a + 10
print(x(5)) # Output: 15
Example 2: Multiple Arguments:
x = lambda a, b: a * b
print(x(5, 6)) # Output: 30
Using Lambda Functions Inside Another Function
- Power of Lambda:
- The power of lambda is better shown when you use them as an anonymous function inside another function.
Example:
def myfunc(n):
return lambda a: a * n
mydoubler = myfunc(2)
print(mydoubler(11)) # Output: 22
mytripler = myfunc(3)
print(mytripler(11)) # Output: 33
Key Points
- Lambda Function Syntax:
- The syntax is
lambda arguments: expression
. - It can have any number of arguments but only one expression.
- The expression is evaluated and returned.
- The syntax is
- Single Expression:
- Lambda functions can only contain expressions and cannot include statements or multiple expressions.
- They are useful for simple operations or as short, throwaway functions.
- Use Case Inside Functions:
- Lambdas are often used as anonymous functions passed as arguments to higher-order functions.
- They are also used to return functions from other functions, as shown in the
myfunc
example.
Summary
- Anonymous Functions: Lambdas are small, anonymous functions defined using the
lambda
keyword. - Single Expression: They can take multiple arguments but must contain only one expression.
- Powerful and Flexible: Lambdas are powerful when used within other functions or as arguments to higher-order functions.
- Use Cases: Useful for simple operations, short-lived functions, and functional programming constructs.