# 8 - A deeper look at Functions in Python

{% embed url="https://youtu.be/9KU28h2O3go?si=lLuN_NLEM8eGdGbR" %}

It may not be clear why it is worth the trouble to divide a program into functions. There are several reasons:

* Creating a new function gives you an opportunity to name a group of statements, which makes your program easier to read and debug.
* Functions can make a program smaller by eliminating repetitive code. Later, if you make a change, you only have to make it in one place. This make your code easier to maintain.
* Dividing a long program into functions allows you to debug the parts one at a time and then assemble them into a working whole.
* Well-designed functions are often useful for many programs. Once you write and debug one, you can reuse it. The aim is to write code once and use it many times.

## Advantages of Functions

Functions are an important feature of Python programming language, and there are many reasons why you might want to use them:

1. **Reusability:** Functions allow you to write reusable code that can be used multiple times in your program. Once you define a function, you can call it from anywhere in your code and reuse it as many times as needed.
2. **Modularity:** Functions allow you to break your code into smaller, more manageable pieces. This makes it easier to read and understand, and also makes it easier to test and debug your code.
3. **Abstraction:** Functions allow you to abstract away complex logic and implementation details, providing a simpler and more intuitive interface for other developers or users to interact with.
4. **Organization:** Functions make it easier to organize your code into logical groups, which can help with maintenance and scalability.
5. **Code optimization:** Functions can be used to optimize your code by eliminating redundant or unnecessary code, improving performance and reducing memory usage.
6. **Encapsulation:** Functions can be used to encapsulate data and functionality, protecting it from unwanted access and modification.

Overall, using functions in Python can help make your code more organized, efficient, and reusable, which can save you time and effort in the long run.

### Drawbacks of functions

While functions offer many advantages in Python, there are also some potential drawbacks to consider:

1. **Overuse:** If you create too many functions, your code may become more difficult to read and understand, particularly if the functions are poorly named or poorly organized.
2. **Performance:** Function calls can sometimes be slower than inline code, particularly if the function is small and simple. This can have an impact on the overall performance of your code, particularly if you are calling a function many times in a loop.
3. **Scope:** If you are not careful with how you define variables within functions, you can accidentally create variables with the same name as variables outside of the function. This can lead to unintended behaviour and bugs in your code.
4. **Debugging:** Debugging code that uses functions can sometimes be more difficult, particularly if the function is defined in a separate module or library.
5. **Function call overhead:** When calling a function, there is a small amount of overhead associated with setting up the function call and passing parameters. While this overhead is generally small, it can add up if you are calling a large number of functions.

Overall, while the drawbacks of using functions in Python are relatively minor, it's important to be aware of them when designing and implementing your code. By carefully considering when and how to use functions, you can maximize the benefits of this powerful feature while minimizing any potential downsides.
