# Chapter 8. Functions ## Passing an Arbitrary Number of Arguments * Function uses `*arg_name` to collects arbitrary number of arguments. * `*` in parameter tells Python to make an empty tuple called `arg_name` and pack whatever values it receives into this tuple NOTE: `*args` is open used as **generic parameter** name ```python def make_pizza(*toppings): """Summarize the pizza we are about to make.""" print("\nMaking a pizza with the following toppings:") for topping in toppings: print(f"- {topping}") make_pizza('pepperoni') make_pizza('mushrooms', 'green peppers', 'extra cheese') ``` ## Mixing Positional and Arbitrary Arguments * If function accept different kinds of arguments, Arbitrary Arguments must be placed at last. ```python def make_pizza(size, *toppings): """Summarize the pizza we are about to make.""" print(f"\nMaking a {size}-inch pizza with the following toppings:") for topping in toppings: print(f"- {topping}") make_pizza(16, 'pepperoni') make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese') ``` ## Using Arbitrary Keyword Arguments * Function can use double asterisks `**` to cause Python to create an empty dictionary called **user_info** and pack whatever name-value pairs. ```python def build_profile(first, last, **user_info): """Build a dictionary containing everything we know about a user.""" user_info['first_name'] = first user_info['last_name'] = last return user_info user_profile = build_profile('albert', 'einstein', location='princeton', field='physics') print(user_profile) {'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'} ``` ## Storing Your Functions in Modules Functions can be stored in different modules (python scripts) for better management. ### Importing an Entire Module ```python import pizza pizza.make_pizza(16, 'pepperoni') pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese') ``` ### Importing Specific Functions ```python from module_name import function_name ``` ### Using as to Give a Function an Alias ```python from module_name import function_name as fn ``` ### Using as to Give a Module an Alias ```python import pizza as p p.make_pizza(16, 'pepperoni') p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese') ``` ### Importing All Functions in a Module ```python from module_name import * ``` ## Styling Functions * Functions should have descriptive names, and function names should be lowercase letters and underscores. * Every function should have a comment that explain concisely what the function does. * If specify a default value, no space separation `def function_name(parameter_0, parameter_1='default value')` Generally follow PEP8