Python Basics: Functions

Python Basics: Functions

Python Basics: Functions - A function is an organized reusable piece of code solving a specific task. Functions help us to keep our code clean and provide us with the power of code reusability.

A function is an organized reusable piece of code solving a specific task. Functions help us to keep our code clean and provide us with the power of code reusability.

After reading this article you’ll know:

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements

Introduction

A function is an organized reusable piece of code solving a specific task. Functions help us to keep our code clean and provide us with the power of code reusability.

Built-in Functions

Python has several built-into functions which are always available. Some of these functions are print and max. Let’s see some examples of how we can use them.

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements
print("Python")
print("chess", "backgammon")

Output:

Python
chess backgammon

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements
numbers = [10, 5, 49, 24, -10]
largest_number = max(numbers)
largest_number

Output:

49

We can see that we simply call the function by writing its name and pass the required inputs.

User-Defined Functions

As a programmer or data scientist, sometimes we need functionality specific to our needs. In these cases, we can define our own functions.

To define a function we need to follow these rules:

  1. Use the keyword **def** to introduce a function definition
  2. Write the function name followed by parentheses **()**and a colon**:**
  3. Define a list of parameters inside these parentheses (optional)
  4. Write the function body. The statements that form the function body, start at the next line and must be intended. When the function is called the code in the function body is run.
  5. The first statement of the function body can be a string literal which represents the function documentation (optional)
  6. Use the **return** keyword to pass back a result to the caller (optional)

Don’t worry if you think that there are many steps. We’ll see many examples and the concepts will become pretty straightforward.

Defining a Function Without Parameters

Let’s see a simple example of a function definition without the optional parts. We can call the function by typing its name followed by parentheses (). When we call this function, it will print the current date.

import datetime # importing the "datetime" module

def print_current_date():
    current_date = datetime.datetime.now().date()
    print(current_date)
    
print_current_date()

Output:

2019-02-19

Note that, this output can be different for you. The output will be the date in which you call the function.

Defining a Function With Parameters

We need function parameters almost always. They’re used when we want to pass data into our function. When we call a function we pass arguments (values for the parameters) to the function.

One Parameter Example

def print_message(text):
    print(text)
    
print_message("Forgive yourself for your faults and your mistakes and move on. - Les Brown")

Output:

Forgive yourself for your faults and your mistakes and move on. - Les Brown

When we’re defining parameter like that it’s required. If we don’t pass an argument value for this parameter, this will give us an error.

def print_message(text):
    print(text)
    
print_message()

Output:

--------------------------------------------------------------------
TypeError                          Traceback (most recent call last)
<ipython-input-48-f2f093834d71> in <module>()
      2     print(text)
      3 
----> 4 print_message()

TypeError: print_message() missing 1 required positional argument: 'text'

Later, in this blog post, we’ll see how to define optional arguments (arguments with a default value).

Multiple Parameters Example We can add as many parameters as we want, we just need to separate them with commas. In many cases, we need more than just one parameter.

The order in which the arguments are passed corresponds to the order of the parameters in our function definition. In the example below, we pass 10 as value for the number1 parameter and 5 as a value for the number2 parameter.

def sum_numbers(number1, number2):
    print(number1 + number2)

sum_numbers(10, 5)

Output:

15

However, if we want to save the result in a variable, we cannot do that using the above function definition, because our function is simply printing the result and we don’t use a **return** statement. Let’s see what will happen if we try to save the result.

def sum_numbers(number1, number2):
    print(number1 + number2)

result = sum_numbers(10, 5)
print(result)

Output:

15
None

We can see that the sum is printed (because our function was called), but the result variable has a value of None instead of 15. In the next section let’s see how we can return values.

Defining a Function That Returns a Result

We can use the **return** keyword to leave the current function call and to return a wanted result. Let’s see how we can re-define our function sum_numbers to return the sum instead of printing it.

def sum_numbers(number1, number2):
    return number1 + number2

result = sum_numbers(10, 5)
print(result)

Output:

15

We can clearly see that this time the result variable has a value of 15.

Defining a Function That Returns Multiple Values

We can also define a function that returns multiple values. We can do that by constructing objects called tuples in your function. The tuples data type in Python is an immutablesequence. This means that they can contain multiple values like lists.

import datetime

def get_current_datetime():
    current_datetime = datetime.datetime.now()
    current_date = current_datetime.date()
    current_time = current_datetime.time()
    return (current_date, current_time)

date, time = get_current_datetime()
print(date)
print(time)

Output:

2019-02-19
08:23:38.030659

In the example above we use sequence unpacking. We just “unpack” the values from the tuple into date and time variables.

Defining a Function with Documentation

In the last example, we defined a function that returns the current date and current time as a tuple. Maybe it’s easy to understand what the function does. However, wouldn’t be nice if there is a documentation for this function?

import datetime

def get_current_datetime():
    """
    Returns the current date and current time as a 2-tuple
    """
    current_datetime = datetime.datetime.now()
    current_date = current_datetime.date()
    current_time = current_datetime.time()
    return (current_date, current_time)

date, time = get_current_datetime()
print(date)
print(time)

Output:

2019-02-19
08:26:49.538434

In many cases, our functions are more complex than the above example. In these cases, it’s always preferable to have documentation for your function. The function documentation can include information about:

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements

Scope

Not all objects (including the functions) we have defined are accessible everywhere in our Python code. The scope of the program represents where a variable name or function name may be accessed. Python has 3 types of scopes: local, global and built-in scope.

Local Scope

When our object or function is defined inside a function this means that it has a local scope. We can use this object or function only inside the function where it’s defined.

Global Scope

When our object or function is defined in the main body of our Python code this means that is has a global scope. We have access to this object or function everywhere because it’s global.

Bult-In Scope

In Python, we have a number of functions and types built into that are always available.

Additional Notes

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements

It’s time to see a couple of examples.

def sum_numbers(number1, number2):
    result = number1 + number2
    return result

print(sum_numbers(10, 5))
print(result)

Output:

15

--------------------------------------------------------------------
NameError                          Traceback (most recent call last)
<ipython-input-2-faf6ee9da5b3> in <module>()
      4 
      5 print(sum_numbers(10, 5))
----> 6 print(result)

NameError: name 'result' is not defined

In this example, we can see that we have access to the result variable in our function, but we don’t have access to it outside the function. That’s because of the **result** variable has local scope and can be accessed only inside the sum_numbers function.

name = "Ventsi" # Global variable

def sum_numbers(number1, number2):
    greting = "Hi, " + name # greeting is a local variable
    sum_result = number1 + number2 # sum_result local variable
    result = greting + " the sum is " + str(sum_result) # str() is a bult-in function
    return result

print(sum_numbers(10, 5))
print(result)

Output:

Hi, Ventsi the sum is 15

--------------------------------------------------------------------
NameError                          Traceback (most recent call last)
<ipython-input-1-747761fcaa8f> in <module>()
      7 
      8 print(sum_numbers(10, 5))
----> 9 print(result)

NameError: name 'result' is not defined

In this example, we can see that we have access to the global variable **name** in our function. Also, we have used the **str()** built-in function. However, the **result** variable has a local scope again and it cannot be accessed outside of the sum_numbers function.

result = 100

def sum_numbers(number1, number2):
    result = number1 + number2
    return result

print(sum_numbers(10, 5))
print(result)

Output:

15
100

Here, we defined a result variable globally, then we defined another variable in our function with the same name. We can see that we get a value of 100 for the global scope because our global variable has this value. Also, we get 15 for the sum_numbers(10, 5) because the value of the local variable result is calculated inside the function.

subject = "programming"

def change_subject(new_value):
    """Change the value fo the global variable subject"""
    global subject # Use subject in global scope
    subject = new_value
    
print(subject)
change_subject("machine learning")
print(subject)

Output:

programming
machine learning

We can use the **global** keyword in cases when we want to change the value of a global variable inside some function.

Keyword Arguments

Keyword arguments are related to the function calls. When you use keyword arguments in a function call, the caller identifies the arguments by the parameter name.> Keyword arguments are related to the function calls. When you use keyword arguments in a function call, the caller identifies the arguments by the parameter name.
Source: https://www.tutorialspoint.com/python/python_functions.htm

We can use the keyword arguments using the argument name and the **=** sign.

def raise_value(number, power):
    """
    Raise number to the power
    
    Parameters
    ----------
    number : int, the number we want to raise
    power : int, the power we want to use
    """
    return number ** power

print(raise_value(2, 3))
print(raise_value(number = 2, power = 3))
print(raise_value(power = 2, number = 3))

Output:

8
8
9

Default Arguments

In some cases, we have a function with multiple parameters and we have a common value for some of them. We can specify default arguments for some of the function parameters. In these cases, we can call our function without specifying the values for the parameters with default arguments. To do this in Python, we can use the = sign followed by the default value.

def raise_value(number, power = 2):
    """
    Raise number to the power
    
    Parameters
    ----------
    number : int, the number we want to raise
    power : int, default 2, the power we want to use
    """
    return number ** power

print(raise_value(9))
print(raise_value(2))
print(raise_value(2, 3))

Output:

81
4
8

From the example above, we can see that the power parameter have a default value of 2. When we don’t specify the value for it, the default value is used. However, as we can see, we can pass a different value.

def raise_value(number, power = 2, details = False):
    """Raise number to the power"""
    result = number ** power
    if details:
        return "The number " + str(number) + " raised to the power " + str(power) + " is: " + str(result)
    else:
        return result

print(raise_value(2, details = True))
print(raise_value(2, 3))
print(raise_value(3))

Output:

The number 2 raised to the power 2 is: 4
8
9

Flexible Arguments

Sometimes, we want more flexible functions. For example, we may want to define a function which accepts more arguments than we have specified in the function. In other words, we may need to pass any number of arguments to our function. We can use the *special syntax args and **kwargs in our function definitions to achieve that.

*args

These arguments are called non-named variable-length arguments.

def args_example(*args):
    print(type(args))
    print(args)
    
args_example(1, 23, 4, 52, 2, 123)

Output:

<class 'tuple'>
(1, 23, 4, 52, 2, 123)

We can see that the *args syntax passed all arguments to the function as a tuple called **args**. So, we can do everything that we can do with the tuples data type.

def args_example(*args):
    for arg in args:
        print(arg)
        
args_example(5, 10, 15)

Output:

5
10
15
def get_average(*args):
    return sum(args) / len(args)
        
print(get_average(5, 10, 15))
print(get_average(5, 10, 15, 20, 40))
print(get_average(1, 2, 3, 4, 0, 19, 20, 49, 17, 30, 1, 3, 2, 6, 7, 88))

Output:

10.0
18.0
15.75

**kwargs

These arguments are called named variable-length arguments.

def kwargs_example(**kwargs):
    print(type(kwargs))
    print(kwargs)
    
kwargs_example(age = 24, position = "data analyst")
kwargs_example(name = "Jake", email = "[email protected]", position = "machine learning engineer")

Output:

<class 'dict'>
{'age': 24, 'position': 'data analyst'}
<class 'dict'>
{'name': 'Jake', 'email': '[email protected]', 'position': 'machine learning engineer'}

We can see that the **kwargs syntax passed all arguments to the function as a dictionary called **kwargs**. So, we can do everything that we can do with the dictionary data type.

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(key, value)
        
print_info(age = 24, position = "data analyst")
print()
print_info(name = "Jake", email = "[email protected]", position = "machine learning engineer")

Output:

age 24
position data analyst

name Jake
email [email protected]
position machine learning engineer

Actually, the variable name can be whatever, we just need to insert one asterisk ***** **or two asterisks **** before it.

def get_average(*arguments):
    return sum(arguments) / len(arguments)
        
print(get_average(5, 10, 15))
print()

def print_info(**key_value_pairs):
    for key, value in key_value_pairs.items():
        print(key, value)
        
print_info(age = 24, position = "data analyst")

Output:

10.0

age 24
position data analyst

Using * and ** When Calling a Function

We have seen that we can use this special syntax in our function definitions. However, we can use it when we’re calling functions, too.

def print_info(name, position, email):
    print("name:", name)
    print("position:", position)
    print("email:", email)
    
details = ("data analyst", "[email protected]")
print_info("Jake", *details)

Output:

name: Jake
position: data analyst
email: [email protected]
def print_info(name, position, email):
    print("name:", name)
    print("position:", position)
    print("email:", email)
    
details = {"email": "[email protected]", "position": "data analyst"}
print_info("Jake", **details)

Output:

name: Jake
position: data analyst
email: [email protected]

Python Exceptions

In many cases, when we’re using a function incorrectly it raises an exception (error).

For example, we can see part from the documentation for the [int()]([https://docs.python.org/3/library/functions.html#int)](https://docs.python.org/3/library/functions.html#int) "https://docs.python.org/3/library/functions.html#int)") built-in function: “Return an integer object constructed from a number or string x, or return _0_ if no arguments are given.”

print(int(6.99))
print(int("7"))
print(int("Hi"))

Output:

6
7

--------------------------------------------------------------------
ValueError                         Traceback (most recent call last)
<ipython-input-1-dea319bbd9d9> in <module>()
      1 print(int(6.99))
      2 print(int("7"))
----> 3 print(int("Hi"))

ValueError: invalid literal for int() with base 10: 'Hi'

We can see that a ValueError is raised when we have passed the “Hello” string as input.

Keyword arguments are related to the function calls. When you use keyword arguments in a function call, the caller identifies the arguments by the parameter name.#### Exception Handling

Sometimes, we may want to handle the raised exceptions without stopping the program execution. In Python, we can do that using the try-except clause.

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements
try:
    # Write your operations here
    print(numbers)
except:
    # If there is an error, the code in this block will be executed
    # For example, here you can log the error details
print("An exception occured")

Output:

An exception occured

The code above raises a NameError because the name numbers is not defined. When we don’t specify what exception type we’re looking for, the except will handle all the exception types.

Of course, we can write an except block that is looking for a specific kind of exception.

try:
    print(numbers)
except NameError:
print("An NameError occured")

Output:

An NameError occured

We can define as many as we want except blocks when we want to execute a different piece of code for each of the handled exceptions.

try:
    print(int("Hello"))
except NameError:
    print("A NameError occured")
except TypeError:
    print("A TypeError occured")
except ValueError:
    print("A ValueError occured")
except:
print("Another type of error occured")

Output:

A ValueError occured

Also, when we want more information about the exception we can save it to a variable using **as** syntax. For example, we may wish to log the error message.

try:
    print(int("Hello"))
except ValueError as error:
    # Use your logger to log the error
    # Example:
# logger.error(error)

We can also add an **else** block which will be executed if no errors were raised.

try:
    print(sorted(1))
except Exception as error:
    print("Something went wrong")
    print(error)
else:
print("Nothing went wrong")

Output:

Something went wrong
'int' object is not iterable
try:
    print(sorted([1, 2, 3]))
except Exception as error:
    print("Something went wrong")
    print(error)
else:
print("Nothing went wrong")

Output:

[1, 2, 3]
Nothing went wrong

Also, we can use a **finally** block instead of **else** block if we want to execute some code regardless if the try block raised an error or not.

Imagine that we have a file filename.txt in your working directory and you’re trying to write some text in it.

try:
    file = open("filename.txt")
    file.write("Python is awesome!")
except:
    print("An error occured when writing to the file")
finally:
file.close()

Output:

An error occured when writing to the file

An error occurred because by default the open built-in function is using the “read” mode. However, the **finally** block is closing the file connection in both cases (if there was an error or not). In this case, we use this block to be sure that our file is closed.

Throwing Errors

When we’re defining our own functions we may want to raise errors and write more meaningful error messages. Let’s define a function that returns if two words are anagrams.

def check_anagrams(word1, word2):
    """
    Check if the two passed words are anagrams.
    Returns True if the word1 and word2 are anagrams, otherwise returns False
    """
    return sorted(word1) == sorted(word2)

print(check_anagrams("silent", "listen"))
print(check_anagrams("silent", 5))

Output:

True

--------------------------------------------------------------------
TypeError                          Traceback (most recent call last)
<ipython-input-61-f1a30da1d38d> in <module>()
      7 
      8 print(check_anagrams("silent", "listen"))
----> 9 print(check_anagrams("silent", 5))

<ipython-input-61-f1a30da1d38d> in check_anagrams(word1, word2)
      4     Returns True if the word1 and word2 are anagrams, otherwise returns False
      5     """
----> 6     return sorted(word1) == sorted(word2)
      7 
      8 print(check_anagrams("silent", "listen"))

TypeError: 'int' object is not iterable

With the second call of the function, we used it incorrectly with passing the integer 5 for the word2. A TypeError was thrown in this situation. We can see that the message is a little bit confusing. So, we can try to check that the two words are passed as strings and thrown an error with a more descriptive message. We can use the **raise** keyword to throw an error.

def check_anagrams(word1, word2):
    """
    Check if the two passed words are anagrams.
    Returns True if the word1 and word2 are anagrams, otherwise returns False
    """
    if type(word1) != str or type(word2) != str:
        raise TypeError("The word1 and word2 must be strings")
    
    return sorted(word1) == sorted(word2)

print(check_anagrams("silent", "listen"))
print(check_anagrams("silent", 5))

Output:

True

--------------------------------------------------------------------
TypeError                          Traceback (most recent call last)
<ipython-input-3-afb475aa2f4f> in <module>()
     10 
     11 print(check_anagrams("silent", "listen"))
---> 12 print(check_anagrams("silent", 5))

<ipython-input-3-afb475aa2f4f> in check_anagrams(word1, word2)
      5     """
      6     if type(word1) != str or type(word2) != str:
----> 7         raise TypeError("The word1 and word2 must be strings")
      8 
      9     return sorted(word1) == sorted(word2)

TypeError: The word1 and word2 must be strings

Now, the message is much specific about the problem. Try to catch more specific exceptions and to write specific and clear error messages. You can check all the exception types from the docs.

Assert Statements

Assert statements are a convenient way to sanity-check our code. They’re boolean expressions that check if the conditions return True or False. If a condition returns True, the program moves to the next line of code. Otherwise, an error is raised and the program execution is stopped.

We can think of the assert statements as “raise-if-not” statements.

Keyword arguments are related to the function calls. When you use keyword arguments in a function call, the caller identifies the arguments by the parameter name.
Source: https://docs.python.org/3/reference/simple_stmts.html#the-assert-statement

def check_anagrams(word1, word2):
    """
    Check if the two passed words are anagrams.
    Returns True if the word1 and word2 are anagrams, otherwise returns False
    """
    assert type(word1) == str
    assert type(word12) == str
    
    return sorted(word1) == sorted(word2)

print(check_anagrams("silent", "listen"))
print(check_anagrams("silent", 5))

Output:

True

--------------------------------------------------------------------
AssertionError                     Traceback (most recent call last)
<ipython-input-68-e5a7f4b2ffc2> in <module>()
     10 
     11 print(check_anagrams("silent", "listen"))
---> 12 print(check_anagrams("silent", 5))

<ipython-input-68-e5a7f4b2ffc2> in check_anagrams(word1, word2)
      5     """
      6     assert type(word1) == str
----> 7     assert type(word2) == str
      8 
      9     return sorted(word1) == sorted(word2)

AssertionError:

Hmmm, but there is no error message. What if we want to add a message to this AssertionError? We can pass it separated with a comma, right after our expression.

def check_anagrams(word1, word2):
    """
    Check if the two passed words are anagrams.
    Returns True if the word1 and word2 are anagrams, otherwise returns False
    """
    assert type(word1) == str, "The word1 must be a string"
    assert type(word2) == str, "The word2 must be a string"
    
    return sorted(word1) == sorted(word2)

print(check_anagrams("silent", "listen"))
print(check_anagrams("silent", 5))

Output:

True

--------------------------------------------------------------------
AssertionError                     Traceback (most recent call last)
<ipython-input-66-5f2e42abf116> in <module>()
     10 
     11 print(check_anagrams("silent", "listen"))
---> 12 print(check_anagrams("silent", 5))

<ipython-input-66-5f2e42abf116> in check_anagrams(word1, word2)
      5     """
      6     assert type(word1) == str, "The word1 must be a string"
----> 7     assert type(word2) == str, "The word2 must be a string"
      8 
      9     return sorted(word1) == sorted(word2)

AssertionError: The word2 must be a string

Type Hints

Python is a dynamically-typed language. When we’re defining your variables, functions, classes, etc. we don’t need to specify data types. This allows us to write code faster.

However, from Python version 3.5 we have the ability to add type hints in our function definitions. We can say what are the expected data types for the arguments and what data type the function returns.

def greeting(name: str) -> str:
    return 'Hello ' + name

print(greeting("Ventsi"))
print(greeting(42))

Output:

Hello Ventsi

--------------------------------------------------------------------TypeError                          Traceback (most recent call last)
<ipython-input-28-b1c33d5121c9> in <module>()
      1 print(greeting("Ventsi"))
----> 2 print(greeting(42))

<ipython-input-1-311aff60a9bd> in greeting(name)
      1 def greeting(name: str) -> str:
----> 2     return 'Hello ' + name

TypeError: must be str, not int

We can also define type aliases.

from typing import List
Vector = List[float]

def scale(scalar: float, vector: Vector) -> Vector:
    return [scalar * num for num in vector]

# typechecks; a list of floats qualifies as a Vector.
new_vector = scale(2.0, [1.0, -4.2, 5.4])
print(new_vector)

Output:

[2.0, -8.4, 10.8]

You can find more information here.

Passing mutable vs immutable objects

We have to be careful when we’re passing mutable objects to our functions. The arguments passed in a function call are using the object reference, not the value of the object. So, keep in mind that some functions can change the value of the passed objects.

Keyword arguments are related to the function calls. When you use keyword arguments in a function call, the caller identifies the arguments by the parameter name.

def capitalize_sentences(sentences):
    for index, item in enumerate(sentences):
        sentences[index] = item.capitalize()

sentences = ["this is test sentence", "I love Python", "positive thinking is nice!"]
print("Before calling the function:", sentences)
capitalize_sentences(sentences)
print("After calling the function:", sentences)

Output:

Before calling the function: ['this is test sentence', 'I love Python', 'positive thinking is nice!']
After calling the function: ['This is test sentence', 'I love python', 'Positive thinking is nice!']

We can see that after we called our function, we have changed the contents of the sentences list.

If we want to save the result in a different variable, we can copy the sentences list in our function, do the capitalization for the copy version and return it. This way, we won’t change the sentences list itself (which is what you want in some cases).

def capitalize_sentences(sentences):
    result = sentences.copy()
    for index, item in enumerate(result):
        result[index] = item.capitalize()
    return result

sentences = ["this is test sentence", "I love Python", "positive thinking is nice!"]
print("Before calling the function:", sentences)
capitalized_sentences = capitalize_sentences(sentences)
print("After calling the function:", sentences)
print("Capitalized sentences (result of the function):", capitalized_sentences)

Output:

Before calling the function: ['this is test sentence', 'I love Python', 'positive thinking is nice!']
After calling the function: ['this is test sentence', 'I love Python', 'positive thinking is nice!']
Capitalized sentences (result of the function): ['This is test sentence', 'I love python', 'Positive thinking is nice!']

Summary

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements

Final Words

Thank you for the read. I hope that you have enjoyed the article. If you like it, please hold the clap button and share it with your friends. I’ll be happy to hear your feedback. Let me know if you want a blog post about lambda functions. If you have some questions, feel free to ask them. 😉

Learn More

Complete Python Bootcamp: Go from zero to hero in Python 3

Complete Python Masterclass

Learn Python by Building a Blockchain & Cryptocurrency

Python and Django Full Stack Web Developer Bootcamp

The Python Bible™ | Everything You Need to Program in Python

Learning Python for Data Analysis and Visualization

Python for Financial Analysis and Algorithmic Trading

The Modern Python 3 Bootcamp

Resources:

  • What are functions and how to define them
  • What are the parameters and arguments
  • How to return values from functions
  • How to define a function documentation
  • What represents the scope in Python
  • What are keyword arguments
  • Flexible and Default arguments
  • What are the Python exceptions and how to handle and how to raise them
  • Assert Statements

What's Python IDLE? How to use Python IDLE to interact with Python?

What's Python IDLE? How to use Python IDLE to interact with Python?

In this tutorial, you’ll learn all the basics of using **IDLE** to write Python programs. You'll know what Python IDLE is and how you can use it to interact with Python directly. You’ve also learned how to work with Python files and customize Python IDLE to your liking.

In this tutorial, you'll learn how to use the development environment included with your Python installation. Python IDLE is a small program that packs a big punch! You'll learn how to use Python IDLE to interact with Python directly, work with Python files, and improve your development workflow.

If you’ve recently downloaded Python onto your computer, then you may have noticed a new program on your machine called IDLE. You might be wondering, “What is this program doing on my computer? I didn’t download that!” While you may not have downloaded this program on your own, IDLE comes bundled with every Python installation. It’s there to help you get started with the language right out of the box. In this tutorial, you’ll learn how to work in Python IDLE and a few cool tricks you can use on your Python journey!

In this tutorial, you’ll learn:

  • What Python IDLE is
  • How to interact with Python directly using IDLE
  • How to edit, execute, and debug Python files with IDLE
  • How to customize Python IDLE to your liking

Table of Contents

What Is Python IDLE?

Every Python installation comes with an Integrated Development and Learning Environment, which you’ll see shortened to IDLE or even IDE. These are a class of applications that help you write code more efficiently. While there are many IDEs for you to choose from, Python IDLE is very bare-bones, which makes it the perfect tool for a beginning programmer.

Python IDLE comes included in Python installations on Windows and Mac. If you’re a Linux user, then you should be able to find and download Python IDLE using your package manager. Once you’ve installed it, you can then use Python IDLE as an interactive interpreter or as a file editor.

An Interactive Interpreter

The best place to experiment with Python code is in the interactive interpreter, otherwise known as a shell. The shell is a basic Read-Eval-Print Loop (REPL). It reads a Python statement, evaluates the result of that statement, and then prints the result on the screen. Then, it loops back to read the next statement.

The Python shell is an excellent place to experiment with small code snippets. You can access it through the terminal or command line app on your machine. You can simplify your workflow with Python IDLE, which will immediately start a Python shell when you open it.

A File Editor

Every programmer needs to be able to edit and save text files. Python programs are files with the .py extension that contain lines of Python code. Python IDLE gives you the ability to create and edit these files with ease.

Python IDLE also provides several useful features that you’ll see in professional IDEs, like basic syntax highlighting, code completion, and auto-indentation. Professional IDEs are more robust pieces of software and they have a steep learning curve. If you’re just beginning your Python programming journey, then Python IDLE is a great alternative!

How to Use the Python IDLE Shell

The shell is the default mode of operation for Python IDLE. When you click on the icon to open the program, the shell is the first thing that you see:

This is a blank Python interpreter window. You can use it to start interacting with Python immediately. You can test it out with a short line of code:

Here, you used print() to output the string "Hello, from IDLE!" to your screen. This is the most basic way to interact with Python IDLE. You type in commands one at a time and Python responds with the result of each command.

Next, take a look at the menu bar. You’ll see a few options for using the shell:

You can restart the shell from this menu. If you select that option, then you’ll clear the state of the shell. It will act as though you’ve started a fresh instance of Python IDLE. The shell will forget about everything from its previous state:

In the image above, you first declare a variable, x = 5. When you call print(x), the shell shows the correct output, which is the number 5. However, when you restart the shell and try to call print(x) again, you can see that the shell prints a traceback. This is an error message that says the variable x is not defined. The shell has forgotten about everything that came before it was restarted.

You can also interrupt the execution of the shell from this menu. This will stop any program or statement that’s running in the shell at the time of interruption. Take a look at what happens when you send a keyboard interrupt to the shell:

A KeyboardInterrupt error message is displayed in red text at the bottom of your window. The program received the interrupt and has stopped executing.

How to Work With Python Files

Python IDLE offers a full-fledged file editor, which gives you the ability to write and execute Python programs from within this program. The built-in file editor also includes several features, like code completion and automatic indentation, that will speed up your coding workflow. First, let’s take a look at how to write and execute programs in Python IDLE.

Opening a File

To start a new Python file, select File → New File from the menu bar. This will open a blank file in the editor, like this:

From this window, you can write a brand new Python file. You can also open an existing Python file by selecting File → Open… in the menu bar. This will bring up your operating system’s file browser. Then, you can find the Python file you want to open.

If you’re interested in reading the source code for a Python module, then you can select File → Path Browser. This will let you view the modules that Python IDLE can see. When you double click on one, the file editor will open up and you’ll be able to read it.

The content of this window will be the same as the paths that are returned when you call sys.path. If you know the name of a specific module you want to view, then you can select File → Module Browser and type in the name of the module in the box that appears.

Editing a File

Once you’ve opened a file in Python IDLE, you can then make changes to it. When you’re ready to edit a file, you’ll see something like this:

The contents of your file are displayed in the open window. The bar along the top of the window contains three pieces of important information:

  1. The name of the file that you’re editing
  2. The full path to the folder where you can find this file on your computer
  3. The version of Python that IDLE is using

In the image above, you’re editing the file myFile.py, which is located in the Documents folder. The Python version is 3.7.1, which you can see in parentheses.

There are also two numbers in the bottom right corner of the window:

  1. Ln: shows the line number that your cursor is on.
  2. Col: shows the column number that your cursor is on.

It’s useful to see these numbers so that you can find errors more quickly. They also help you make sure that you’re staying within a certain line width.

There are a few visual cues in this window that will help you remember to save your work. If you look closely, then you’ll see that Python IDLE uses asterisks to let you know that your file has unsaved changes:

The file name shown in the top of the IDLE window is surrounded by asterisks. This means that there are unsaved changes in your editor. You can save these changes with your system’s standard keyboard shortcut, or you can select File → Save from the menu bar. Make sure that you save your file with the .py extension so that syntax highlighting will be enabled.

Executing a File

When you want to execute a file that you’ve created in IDLE, you should first make sure that it’s saved. Remember, you can see if your file is properly saved by looking for asterisks around the filename at the top of the file editor window. Don’t worry if you forget, though! Python IDLE will remind you to save whenever you attempt to execute an unsaved file.

To execute a file in IDLE, simply press the F5 key on your keyboard. You can also select Run → Run Module from the menu bar. Either option will restart the Python interpreter and then run the code that you’ve written with a fresh interpreter. The process is the same as when you run python3 -i [filename] in your terminal.

When your code is done executing, the interpreter will know everything about your code, including any global variables, functions, and classes. This makes Python IDLE a great place to inspect your data if something goes wrong. If you ever need to interrupt the execution of your program, then you can press Ctrl+C in the interpreter that’s running your code.

How to Improve Your Workflow

Now that you’ve seen how to write, edit, and execute files in Python IDLE, it’s time to speed up your workflow! The Python IDLE editor offers a few features that you’ll see in most professional IDEs to help you code faster. These features include automatic indentation, code completion and call tips, and code context.

Automatic Indentation

IDLE will automatically indent your code when it needs to start a new block. This usually happens after you type a colon (:). When you hit the enter key after the colon, your cursor will automatically move over a certain number of spaces and begin a new code block.

You can configure how many spaces the cursor will move in the settings, but the default is the standard four spaces. The developers of Python agreed on a standard style for well-written Python code, and this includes rules on indentation, whitespace, and more. This standard style was formalized and is now known as PEP 8. To learn more about it, check out How to Write Beautiful Python Code With PEP 8.

Code Completion and Call Tips

When you’re writing code for a large project or a complicated problem, you can spend a lot of time just typing out all of the code you need. Code completion helps you save typing time by trying to finish your code for you. Python IDLE has basic code completion functionality. It can only autocomplete the names of functions and classes. To use autocompletion in the editor, just press the tab key after a sequence of text.

Python IDLE will also provide call tips. A call tip is like a hint for a certain part of your code to help you remember what that element needs. After you type the left parenthesis to begin a function call, a call tip will appear if you don’t type anything for a few seconds. For example, if you can’t quite remember how to append to a list, then you can pause after the opening parenthesis to bring up the call tip:

The call tip will display as a popup note, reminding you how to append to a list. Call tips like these provide useful information as you’re writing code.

Code Context

The code context functionality is a neat feature of the Python IDLE file editor. It will show you the scope of a function, class, loop, or other construct. This is particularly useful when you’re scrolling through a lengthy file and need to keep track of where you are while reviewing code in the editor.

To turn it on, select Options → Code Context in the menu bar. You’ll see a gray bar appear at the top of the editor window:

As you scroll down through your code, the context that contains each line of code will stay inside of this gray bar. This means that the print() functions you see in the image above are a part of a main function. When you reach a line that’s outside the scope of this function, the bar will disappear.

How to Debug in IDLE

A bug is an unexpected problem in your program. They can appear in many forms, and some are more difficult to fix than others. Some bugs are tricky enough that you won’t be able to catch them by just reading through your program. Luckily, Python IDLE provides some basic tools that will help you debug your programs with ease!

Interpreter DEBUG Mode

If you want to run your code with the built-in debugger, then you’ll need to turn this feature on. To do so, select Debug → Debugger from the Python IDLE menu bar. In the interpreter, you should see [DEBUG ON] appear just before the prompt (>>>), which means the interpreter is ready and waiting.

When you execute your Python file, the debugger window will appear:

In this window, you can inspect the values of your local and global variables as your code executes. This gives you insight into how your data is being manipulated as your code runs.

You can also click the following buttons to move through your code:

  • Go: Press this to advance execution to the next breakpoint. You’ll learn about these in the next section.
  • Step: Press this to execute the current line and go to the next one.
  • Over: If the current line of code contains a function call, then press this to step over that function. In other words, execute that function and go to the next line, but don’t pause while executing the function (unless there is a breakpoint).
  • Out: If the current line of code is in a function, then press this to step out of this function. In other words, continue the execution of this function until you return from it.

Be careful, because there is no reverse button! You can only step forward in time through your program’s execution.

You’ll also see four checkboxes in the debug window:

  1. Globals: your program’s global information
  2. Locals: your program’s local information during execution
  3. Stack: the functions that run during execution
  4. Source: your file in the IDLE editor

When you select one of these, you’ll see the relevant information in your debug window.

Breakpoints

A breakpoint is a line of code that you’ve identified as a place where the interpreter should pause while running your code. They will only work when DEBUG mode is turned on, so make sure that you’ve done that first.

To set a breakpoint, right-click on the line of code that you wish to pause. This will highlight the line of code in yellow as a visual indication of a set breakpoint. You can set as many breakpoints in your code as you like. To undo a breakpoint, right-click the same line again and select Clear Breakpoint.

Once you’ve set your breakpoints and turned on DEBUG mode, you can run your code as you would normally. The debugger window will pop up, and you can start stepping through your code manually.

Errors and Exceptions

When you see an error reported to you in the interpreter, Python IDLE lets you jump right to the offending file or line from the menu bar. All you have to do is highlight the reported line number or file name with your cursor and select Debug → Go to file/line from the menu bar. This is will open up the offending file and take you to the line that contains the error. This feature works regardless of whether or not DEBUG mode is turned on.

Python IDLE also provides a tool called a stack viewer. You can access it under the Debug option in the menu bar. This tool will show you the traceback of an error as it appears on the stack of the last error or exception that Python IDLE encountered while running your code. When an unexpected or interesting error occurs, you might find it helpful to take a look at the stack. Otherwise, this feature can be difficult to parse and likely won’t be useful to you unless you’re writing very complicated code.

How to Customize Python IDLE

There are many ways that you can give Python IDLE a visual style that suits you. The default look and feel is based on the colors in the Python logo. If you don’t like how anything looks, then you can almost always change it.

To access the customization window, select Options → Configure IDLE from the menu bar. To preview the result of a change you want to make, press Apply. When you’re done customizing Python IDLE, press OK to save all of your changes. If you don’t want to save your changes, then simply press Cancel.

There are 5 areas of Python IDLE that you can customize:

  1. Fonts/Tabs
  2. Highlights
  3. Keys
  4. General
  5. Extensions

Let’s take a look at each of them now.

Fonts/Tabs

The first tab allows you to change things like font color, font size, and font style. You can change the font to almost any style you like, depending on what’s available for your operating system. The font settings window looks like this:

You can use the scrolling window to select which font you prefer. (I recommend you select a fixed-width font like Courier New.) Pick a font size that’s large enough for you to see well. You can also click the checkbox next to Bold to toggle whether or not all text appears in bold.

This window will also let you change how many spaces are used for each indentation level. By default, this will be set to the PEP 8 standard of four spaces. You can change this to make the width of your code more or less spread out to your liking.

Highlights

The second customization tab will let you change highlights. Syntax highlighting is an important feature of any IDE that highlights the syntax of the language that you’re working in. This helps you visually distinguish between the different Python constructs and the data used in your code.

Python IDLE allows you to fully customize the appearance of your Python code. It comes pre-installed with three different highlight themes:

  1. IDLE Day
  2. IDLE Night
  3. IDLE New

You can select from these pre-installed themes or create your own custom theme right in this window:

Unfortunately, IDLE does not allow you to install custom themes from a file. You have to create customs theme from this window. To do so, you can simply start changing the colors for different items. Select an item, and then press Choose color for. You’ll be brought to a color picker, where you can select the exact color that you want to use.

You’ll then be prompted to save this theme as a new custom theme, and you can enter a name of your choosing. You can then continue changing the colors of different items if you’d like. Remember to press Apply to see your changes in action!

Keys

The third customization tab lets you map different key presses to actions, also known as keyboard shortcuts. These are a vital component of your productivity whenever you use an IDE. You can either come up with your own keyboard shortcuts, or you can use the ones that come with IDLE. The pre-installed shortcuts are a good place to start:

The keyboard shortcuts are listed in alphabetical order by action. They’re listed in the format Action - Shortcut, where Action is what will happen when you press the key combination in Shortcut. If you want to use a built-in key set, then select a mapping that matches your operating system. Pay close attention to the different keys and make sure your keyboard has them!

Creating Your Own Shortcuts

The customization of the keyboard shortcuts is very similar to the customization of syntax highlighting colors. Unfortunately, IDLE does not allow you to install custom keyboard shortcuts from a file. You must create a custom set of shortcuts from the Keys tab.

Select one pair from the list and press Get New Keys for Selection. A new window will pop up:

Here, you can use the checkboxes and scrolling menu to select the combination of keys that you want to use for this shortcut. You can select Advanced Key Binding Entry >> to manually type in a command. Note that this cannot pick up the keys you press. You have to literally type in the command as you see it displayed to you in the list of shortcuts.

General

The fourth tab of the customization window is a place for small, general changes. The general settings tab looks like this:

Here, you can customize things like the window size and whether the shell or the file editor opens first when you start Python IDLE. Most of the things in this window are not that exciting to change, so you probably won’t need to fiddle with them much.

Extensions

The fifth tab of the customization window lets you add extensions to Python IDLE. Extensions allow you to add new, awesome features to the editor and the interpreter window. You can download them from the internet and install them to right into Python IDLE.

To view what extensions are installed, select Options → Configure IDLE -> Extensions. There are many extensions available on the internet for you to read more about. Find the ones you like and add them to Python IDLE!

Conclusion

In this tutorial, you’ve learned all the basics of using IDLE to write Python programs. You know what Python IDLE is and how you can use it to interact with Python directly. You’ve also learned how to work with Python files and customize Python IDLE to your liking.

You’ve learned how to:

  • Work with the Python IDLE shell
  • Use Python IDLE as a file editor
  • Improve your workflow with features to help you code faster
  • Debug your code and view errors and exceptions
  • Customize Python IDLE to your liking

Now you’re armed with a new tool that will let you productively write Pythonic code and save you countless hours down the road. Happy programming!

Importance of Python Programming skills

Importance of Python Programming skills

Python is one among the most easiest and user friendly programming languages when it comes to the field of software engineering. The codes and syntaxes of python is so simple and easy to use that it can be deployed in any problem solving...

Python is one among the most easiest and user friendly programming languages when it comes to the field of software engineering. The codes and syntaxes of python is so simple and easy to use that it can be deployed in any problem solving challenges. The codes of Python can easily be deployed in Data Science and Machine Learning. Due to this ease of deployment and easier syntaxes, this platform has a lot of real world problem solving applications. According to the sources the companies are eagerly hunting for the professionals with python skills along with SQL. An average python developer in the united states makes around 1 lakh U.S Dollars per annum. In some of the top IT hubs in our country like Bangalore, the demand for professionals in the domains of Data Science and Python Programming has surpassed over the past few years. As a result of which a lot of various python certification courses are available right now.

Array in Python: An array is defined as a data structure that can hold a fixed number of elements that are of the same python data type. The following are some of the basic functions of array in python:

  1. To find the transverse
  2. For insertion of the elements
  3. For deletion of the elements
  4. For searching the elements

Along with this one can easily crack any python interview by means of python interview questions

Tkinter Python Tutorial | Python GUI Programming Using Tkinter Tutorial | Python Training

This video on Tkinter tutorial covers all the basic aspects of creating and making use of your own simple Graphical User Interface (GUI) using Python. It establishes all of the concepts needed to get started with building your own user interfaces while coding in Python.

This video on Tkinter tutorial covers all the basic aspects of creating and making use of your own simple Graphical User Interface (GUI) using Python. It establishes all of the concepts needed to get started with building your own user interfaces while coding in Python.

Learn More

☞ Complete Python Bootcamp: Go from zero to hero in Python 3

☞ Complete Python Masterclass

☞ Learn Python by Building a Blockchain & Cryptocurrency

☞ Python and Django Full Stack Web Developer Bootcamp

☞ The Python Bible™ | Everything You Need to Program in Python

☞ Learning Python for Data Analysis and Visualization

☞ Python for Financial Analysis and Algorithmic Trading

☞ The Modern Python 3 Bootcamp

Original video source: https://www.youtube.com/watch?v=VMP1oQOxfM0