# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# # Funktionen
# Funktionen sind zusammengefasste Codeblöcke. Mittels Funktionen können wir es vermeiden, mehrmals verwendete Codeblöcke zu wiederholen. Wir definieren stattdessen einmal eine Funktion, die diese Codeblöcke enthält und brauchen an weiteren Stellen nur noch (kurz) die Funktion aufzurufen, ohne die in ihr enthaltenen Codezeilen zu kopieren.

# ### Eine Funktion definieren und aufrufen
# Wir haben schon einige Funktionen kennengelernt, die uns Python zur Verfügung stellt. Die Funktion, die wir bislang wohl am häufigsten verwendet haben, ist die print-Funktion:

print("HALLO WELT")


# P.S. Eine Übersicht über Funktionen in Python findest du hier: https://docs.python.org/3/library/functions.html

# Wenn wir eine eigene Funktion verwenden wollen, müssen wir sie zuerst definieren. Eine solche Funktionsdefinition hat die allgemeine Syntax:
#
# **def Funktionname():**
# <br>
# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **Code**

def multi_print():
    print("Hallo Welt!")
    print("Hallo Welt!")


def mutti_print():
    print("Hallo Mutti!")


mutti_print()



def juerg3000():
    print("juerg3000")


juerg3000()

# Um eine Funktion auszuführen, die definiert wurde, schreiben wir: **Funktionname()**





multi_print()


# ### Funktionen mit einem Argument
# Man kann Funktionen ein **Argument** übergeben, d. h. einen Wert, von dem der Code innerhalb der Funktion abhängt:
#
#
# **def Funktionsname(Argument):**
# <br>
# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **Code, in dem mit dem spezifischen Argument gearbeitet wird**

# +
def multi_print2(name):
    print(name)
    print(name)
    
multi_print2("HALLO")
multi_print2("WELT")


# +
def juerg(Begrüssung):
    print(Begrüssung)

    
juerg("H<NAME>")
juerg("<NAME>")
juerg("Heja")
juerg("Hola")
    
    
    
    

# +
def juerg(Begrüssung):
    print(" Hallo " +  Begrüssung)

juerg("Plotti")

# -

# Du kannst dir einen solchen Parameter als eine zu einer Funktion gehörige Variable vorstellen. Vermeide es, einen Funktionsparameter wie eine bereits bestehende Variable zu benennen - Verwirrungsgefahr!

# +
name = "MARS"

def multi_print2(name):
    print(name)
    print(name)
    
multi_print2("HALLO")
multi_print2("WELT")

print(name)
# -



# +
planet = "MARS"

def multi_print2(name):
    print(name)
    print(name)
    
multi_print2("HALLO")
multi_print2("WELT")

print(name)
# -





# +
def hallo(vorname, nachname):
    print("Hallo " + vorname + " "+ nachname)
    
hallo ("Juerg", "Candrian")
hallo ("Peter", "Müller")
# -



# Du siehst, dass der Wert der Variable _name_ keinen Einfluss auf das Argument _name_ der Funktion hat! Die Variable _name_ außerhalb der Funktion ist also eine andere Variable als die Variable _name_ innerhalb der Funktion. 
#
# Daher Achtung: Das macht den Code unübersichtlich!

# ### Weitere Funktionen in Python

# Auch die len-Funktion für Listen kennst du schon. :-) 

print(len(["Hallo", "Welt"]))

# Du kannst die len-Funktion auch auf Strings anwenden.

print(len("Hallo"))

# ## Übung
#
# Schreibe eine Funktion, die den Gesamtpreis der Produkte im Warenkorb berechnet!
# Vervollständige die Funktion list_sum(), der als Parameter eine Liste mit den Preisen übergeben wird. Die Funktion soll dann die Summe der Zahlen aus der Liste ausgeben.

# +
cart_prices = [20, 3.5, 6.49, 8.99, 9.99, 14.98]

def list_sum(l):
    # hier kommt dein Code hin
    print("Hier kommt dein Code hin")
    
list_sum(cart_prices)
        
# -



# +
cart_prices = [20, 3.5, 6.49, 8.99, 9.99, 14.98]

def list_sum(preislite):
    summe = 0
    for preis in preislite:
        summe = summe + preis
    print(summe)
        
    
list_sum(cart_prices)
        
# -



# +
cart_prices1 = [20, 3.5, 6.49, 8.99, 9.99, 14.98]
cart_prices2 = [12, 8.6, 9.35, 12.20]

def list_sum(preisliste):
    summe = 0
    for preis in preisliste:
        summe = summe + preis
    print("Der GEamstpreis ist: " + str(summe))

list_sum(cart_prices1)
list_sum(cart_prices2)
        
# -

cart_prices1 = [20, 3.5, 6.49, 8.99, 9.99, 14.98]
sum(cart_prices1)


# ## Funktionen mit mehreren Argumenten
#
# Eine Funktion darf auch mehrere Argumente enthalten:
#
# **def Funktionenname(Argument1, Argument2, ...):**
# <br>
# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **Code, in dem mit Argument1, Argument2,... gearbeitet wird**

# +
def multi_print(name, count):
    for i in range(0, count):
        print(name)
        
multi_print("Hallo!", 5)


# -

# ### Funktionen in Funktionen
# Funktionen können auch ineinander geschachtelt werden:

def weitere_funktion():
    multi_print("Hallo!", 3)
    multi_print("Welt!", 3)


weitere_funktion()


# ### Einen Wert zurückgeben
# Bislang führen wir mit Funktionen einen Codeblock aus, der von Argumenten abhängen kann. Funktionen können aber auch mittels des Befehls **return** Werte zurückgeben. 

# +
def return_element(name):
    return name

print(return_element("Hi"))


# -

# Solche Funktionen mit return können wir dann wie Variablen behandeln:

# +
def return_with_exclamation(name):
    return name + "!"

if return_with_exclamation("Hi") == "Hi!":
    print("Right!")
else:
    print("Wrong.")


# +
def maximum(a, b):
    if a < b:
        return b
    else:
        return a

result = maximum(4, 5)
print(result)
# -







# +
def hallo_mutti():
    print("Ciao Alte")

def hallo_vati():
    print("Ciao Alter")
    


# +
def family_print(Begrüssung):
    hallo_mutti()
    hallo_vati()
    
family_print("")

# -

def hallo_mutti(Begrüssungsformel):
    print(Begrüssungsformel + "Mutti")



hallo_mutti("Hallo ")


# +
def hallo_mutti(Begrüssungsformel):
    print(Begrüssungsformel + "Mutti")

def hallo_vati(Begrüssungsformel):
    print(Begrüssungsformel + "Vati")

def family_print(Begrüssung):
    hallo_mutti(Begrüssung)
    hallo_vati(Begrüssung)
    
family_print("Ciao ")

    
# -



# ## Übung
#
# In Amerika ist es üblich "Tips" zu geben. Du möchtest eine Funktion schreiben der du den Preis des Essens eingibst, die erhöhung in % und eine Tabelle erhälst die dir hilft genug tipp zu geben. 
# stehen. Genauer soll jedes Element in der Liste so aussehen: "Anzahl x Artikel: Preis".
#

def tipp_generator(price,steps):
    # dein code hier



# +
def print_percentages(price,percent,multiplikator):
    print("Mit "+ str(percent*multiplikator*100) + "% ist der Preis: " + str(price*(1+percent*multiplikator)))

def tipp_generator(price,percent):
    print("Preis des Essens:" + str(price))

    for i in range(1,4):
        print_percentages(price,percent,i)

    

tipp_generator(10,0.1)
# -



# # Funktionen vs. Methoden

# ### Funktionen
# Bei ihrem Aufruf stehen Funktionen "für sich" und das, worauf sie sich beziehen steht ggf. als Argument in den Klammern hinter ihnen:

liste = [1, 2, 3]

print(liste)

print(len(liste))

# ### Methoden
# Daneben kennen wir aber auch schon Befehle, die mit einem Punkt an Objekte angehängt werden. Eine Liste ist ein solches **Objekt**. Jedes Objekt hat Methoden, auf die wir zurückgreifen können. Diese Methoden können wir aber nicht auf ein Objekt eines anderen Typs anwenden (meistens zumindest).
#
# Schauen wir uns einige nützliche Methoden des Listen-Objektes an :-) (du brauchst sie dir nicht alle merken)

# +
# ein Element anhängen
liste.append(4)

print(liste)
# -

# ein Element an einem bestimmten Index entfernen
liste.pop(2)

# +
# wir sehen, dass die Methode nicht die aktualisierte Liste, sondern das entfernte Element liefert
# -

print(liste)

# +
 # Ein Element an einer bestimmten Stelle einfügen
# das erste Argument bei insert gibt an, welches Element in die Liste eingefügt wird, 
# das zweite Argument bei insert gibt an, an welcher Stelle das Element eingefügt wird; 
# beachte, dass der Index des ersten Elements in einer Liste 0 ist! 
liste.insert(1, 4)

print(liste)

# +
# ein Element entfernen
liste.remove(4)

print(liste)
# -

# den Index eines Elementes angeben (die erste Stelle, an der es vorkommt)
print(liste.index(3))

print(liste.index(4))

print(liste.count(4))

# mit reverse können wir die Reihenfolge einer Liste umkehren
liste.reverse()
print(liste)

# # Übung

# Wann braucht man funktionen und wann methoden?



StarcoderdataJupyterScriptsDedupFiltered