Funktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mto99
User
Beiträge: 15
Registriert: Mittwoch 30. Oktober 2019, 17:35

hallo

ich habe eine Frage:

ich muss eine Funktion-2 in einer Funktion-1 aufrufen.
darf ich die variablen der F-2 in F-1 verwenden?
Zuletzt geändert von mto99 am Montag 25. November 2019, 07:51, insgesamt 1-mal geändert.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Kannst du die Frage genauer definieren? Weil im Grunde genommen ist das hier schon eine Funktion, welche eine Funktion verwendet.

Code: Alles auswählen

def do_something(parameter):
    print(parameter)

do_something("Test")
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Bitte beim nächsten mal nicht den Ursprungsbeitrag ändern, sondern einfach ein neuen Beitrag posten.

Zur Frage:

Wenn in der Funktion 2 eine Variable a ist, kannst du ohne weiteres nicht von Funktion 1 auf dieses a zugreifen. In Python übergibt man Parameter an Funktionen und diese geben einen Wert zurück, welche man an eine Variable binden kann.

Also das hier geht nicht:

Code: Alles auswählen

def funktion_1(wert):
    funktion_2(wert)
    print(irgendwas)


def funktion_2(wert):
    irgendwas = []
    irgendwas.append(wert)


funktion_1("Hallo")

Das hier geht:

Code: Alles auswählen

def funktion_1(wert):
    irgendwas = funktion_2(wert)
    print(irgendwas)
    

def funktion_2(wert):
    irgendwas = []
    irgendwas.append(wert)
    return irgendwas


funktion_1("Hallo")
Ich weiß nicht genau ob das deine Frage beantwortet, aber falls nicht kannst du hier mehr lesen über die Gültigkeitsbereiche von Variablen.
mto99
User
Beiträge: 15
Registriert: Mittwoch 30. Oktober 2019, 17:35

Also ich habe jetzt eine Funktion Prim geschrieben, die die eingeben Zahl auf eine Primzahl prüft.
in der nächsten Funktion soll ich überprüfen, ob wenn man eine Primzahl mit 2addiert auch eine Primzahl rauskommt.
aber ich weiß eben nicht, wie man eine Funktion in einer Funktion aufruft.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Genauso wie man sie überall aufruft.

rückgabe = aufruf(parameter)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Dazu rufst du die Funktion ganz normal auf als wäre Sie nicht in einer anderen Funktion.

Code: Alles auswählen

def ist_primzahl(zahl):
    return 2 in [zahl, 2**zahl % zahl]

def ist_primzahl_plus_zwei_eine_primzahl(zahl):
    if ist_primzahl(zahl): #hier der Aufruf der Funktion1 (ist_primzahl)
        print(f"Die Zahl {zahl} ist eine Primzahl")
    else:
        print(f"Die Zahl {zahl} ist keine Primzahl")
    if ist_primzahl(zahl + 2): #hier der Aufruf der Funktion1 (ist_primzahl) nur wird der Paramter um zwei erhöht.
        print(f"Die Zahl {zahl} plus Zwei, also {zahl+2} ist eine Primzahl")
    else:
        print(f"Die Zahl {zahl} + 2, also {zahl+2} ist keine Primzahl")




ist_primzahl_plus_zwei_eine_primzahl(9)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

So aber bitte nicht. Die Funktion vermischt Prüfung mit Ausgabe. Und das sollte nicht sein. Sie sollte einfach True oder False liefern. Und die Ausgabe dem Benutzer überlassen.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

War ja eigentlich nur zur Veranschaulichung gedacht. So jetzt einmal umgesetzt dass die Funktion nur True/False zurückgibt.

Code: Alles auswählen

def ist_primzahl(zahl):
    return 2 in [zahl, 2**zahl % zahl]

def ist_primzahl_plus_zwei_eine_primzahl(zahl):
    if ist_primzahl(zahl): 
        if ist_primzahl(zahl+2):
            return True
        else:
            return False
    else:
        return False

def main():
    while True:
        zahl_zu_pruefen = int(input("Bitte eine Primzahl eingeben: "))
        if ist_primzahl_plus_zwei_eine_primzahl(zahl_zu_pruefen):
            print(f"{zahl_zu_pruefen} ist eine Primzahl und {zahl_zu_pruefen + 2} auch.")
        else:
            if ist_primzahl(zahl_zu_pruefen):
                print(f"{zahl_zu_pruefen} ist eine Primzahl, aber {zahl_zu_pruefen + 2} nicht")
            else:
                print(f"{zahl_zu_pruefen} ist keine Primzahl")

main()
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Die Verzweigung in der Funktion finde ich unübersichtlich. Im Zweifelsfall auch fehleranfällig.
Die Aussagekraft der beiden Bedingungen können nicht getrennt werden, also kannst du sie auch direkt in einer einzigen Zeile auswerten.

Code: Alles auswählen

def ist_primzahl_plus_zwei_eine_primzahl(zahl):
    if ist_primzahl(zahl) and ist_primzahl(zahl+2):
        return True
    else:
        return False
Das könnte man noch mehr schrumpfen, aber ich persönlich mag, wenn man die Zweige sieht.
mto99
User
Beiträge: 15
Registriert: Mittwoch 30. Oktober 2019, 17:35

ich habe es hingekriegt. vielen dank für die hilfe
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: in Wirklichkeit gibt es aber keine Zweige, sondern nur eine Bedingung als Ergebnis der Funktion:

Code: Alles auswählen

def ist_primzahl_plus_zwei_eine_primzahl(zahl):
    return ist_primzahl(zahl) and ist_primzahl(zahl+2)
Wobei hier der Funktionsname nicht die doppelte Prüfung erkennen läßt.

Code: Alles auswählen

def ist_primzahl_plus_zwei_eine_primzahl(zahl):
    if not ist_primzahl(zahl):
        raise RuntimeError("zahl ist keine Primzahl")
    return ist_primzahl(zahl+2)
oder halt:

Code: Alles auswählen

def sind_zahl_und_zahl_plus_zwei_primzahlen(zahl):
    return ist_primzahl(zahl) and ist_primzahl(zahl+2)
Antworten