From 6bb5cd9adf41079ab825ccef3a028a9c9618a776 Mon Sep 17 00:00:00 2001
From: David Rotermund <54365609+davrot@users.noreply.github.com>
Date: Wed, 13 Dec 2023 14:43:56 +0100
Subject: [PATCH] Create README.md
Signed-off-by: David Rotermund <54365609+davrot@users.noreply.github.com>
---
python_basics/functions/README.md | 188 ++++++++++++++++++++++++++++++
1 file changed, 188 insertions(+)
create mode 100644 python_basics/functions/README.md
diff --git a/python_basics/functions/README.md b/python_basics/functions/README.md
new file mode 100644
index 0000000..1a37712
--- /dev/null
+++ b/python_basics/functions/README.md
@@ -0,0 +1,188 @@
+# Functions
+{:.no_toc}
+
+
+
+## The goal
+
+
+
+Questions to [David Rotermund](mailto:davrot@uni-bremen.de)
+
+## [Most simple function](https://docs.python.org/3/tutorial/controlflow.html#defining-functions)
+
+These three functions are equivalent:
+
+```python
+def my_function():
+ pass
+
+def my_function():
+ return
+
+def my_function():
+ return None
+```
+
+> return leaves the current function call with the expression list (or None) as return value.
+
+There is a return at the end, even if you don't put it there.
+
+## [def](https://docs.python.org/3/reference/compound_stmts.html?highlight=funcdef#function-definitions)
+
+```python
+funcdef ::= [decorators] "def" funcname [type_params] "(" [parameter_list] ")"
+ ["->" expression] ":" suite
+decorators ::= decorator+
+decorator ::= "@" assignment_expression NEWLINE
+parameter_list ::= defparameter ("," defparameter)* "," "/" ["," [parameter_list_no_posonly]]
+ | parameter_list_no_posonly
+parameter_list_no_posonly ::= defparameter ("," defparameter)* ["," [parameter_list_starargs]]
+ | parameter_list_starargs
+parameter_list_starargs ::= "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]
+ | "**" parameter [","]
+parameter ::= identifier [":" expression]
+defparameter ::= parameter ["=" expression]
+funcname ::= identifier
+```
+
+## [pass](https://docs.python.org/3/reference/simple_stmts.html#the-pass-statement)
+
+```python
+pass_stmt ::= "pass"
+```
+
+> pass is a null operation — when it is executed, nothing happens. It is useful as a placeholder when a statement is required syntactically, but no code needs to be executed
+>
+
+## [return](https://docs.python.org/3/reference/simple_stmts.html#the-return-statement)
+
+```python
+return_stmt ::= "return" [expression_list]
+```
+
+> return may only occur syntactically nested in a function definition, not within a nested class definition.
+>
+> If an expression list is present, it is evaluated, else None is substituted.
+>
+> return leaves the current function call with the expression list (or None) as return value.
+>
+> When return passes control out of a try statement with a finally clause, that finally clause is executed before really leaving the function.
+
+## [Return values](https://docs.python.org/3/reference/simple_stmts.html#return)
+
+### No return value
+As we stated above these functions all return None:
+
+```python
+def my_function():
+ pass
+
+def my_function():
+ return
+
+def my_function():
+ return None
+```
+
+### One return value
+These functions return one value:
+
+```python
+def my_function():
+ return 1
+
+def my_function():
+ return "Hello"
+
+def my_function():
+ return (1+1)/1
+```
+
+e.g.
+
+```python
+def my_function():
+ return 1
+
+print(my_function())
+```
+
+### Many return values
+
+```python
+def my_function():
+ return 2, "A", 79, 3.1314
+
+
+print(my_function()) # -> (2, 'A', 79, 3.1314)
+abcd = my_function() # -> (2, 'A', 79, 3.1314)
+print(abcd) # -> (2, 'A', 79, 3.1314)
+
+a, b, c, d = my_function()
+
+print(a) # -> 2
+print(b) # -> A
+print(c) # -> 79
+print(d) # -> 3.1314
+
+a, b, c = my_function() # ValueError: too many values to unpack (expected 3)
+```
+## [Functions are objects](https://docs.python.org/3/tutorial/controlflow.html#defining-functions)
+
+Functions are objects. Without **()** at the end, you interact with the function. With the **()** you use the function:
+
+```python
+def my_function():
+ return 1
+
+print(my_function) # ->
+print(my_function()) # -> 1
+```
+
+Interesting, but why do I need to know this? Good question, imaginary person! We can use functions as "parameters" via arguments for other functions:
+
+```python
+def my_function_0():
+ return 3
+
+def my_function_1():
+ return 2
+
+
+def my_function_2(func):
+ return func() ** 2
+
+print(my_function_2(my_function_0)) # -> 9
+print(my_function_2(my_function_1)) # -> 4
+```
+
+## [Default Argument Values](https://docs.python.org/3/tutorial/controlflow.html#default-argument-values)
+
+We can define a default value for arguments:
+
+```python
+def my_function(a=2, b=7, c=5, d=8):
+ return a + b**2 + c**3 + d**4
+
+print(my_function()) # -> 4272
+```
+
+We can (partially) overwrite the default values:
+
+```python
+def my_function(a=2, b=7, c=5, d=8):
+ return a + b**2 + c**3 + d**4
+
+print(my_function(b=2,a=3)) # -> 4228
+print(my_function(3,2)) # -> 4228
+```
+
+In the case of **my_function(3,2)**, the default values are replaced in the order the arguments of the function are defined. a,b,c, and finally d. When using the keyword e.g. d. Then I can overwrite only selected arguments.
+
+## Arguments and Keywords
+
+