6 Stimmen

Funktionale Programmierung — for- und while-Schleifen

Ich versuche, for und while Schleifen in Python im funktionalen Programmierstil zu schreiben.

Ich denke, die for Schleife ist in Ordnung, aber while funktioniert nicht, sie läuft unendlich.

# for Schleife
lst = [1, 2, 3]
def fun(e):
   return e
print map(fun, lst)

# while Schleife
i = 1
def whileloop():
    global i
    print i
    i = i+1
while_FP = lambda: ((i < 5) and whileloop()) or while_FP()
while_FP()

2 Stimmen

Aus Neugierde, was ist der Sinn dieser Übung?

21 Stimmen

Wer braucht einen Punkt für so etwas? Er lernt und experimentiert, was großartig ist.

1 Stimmen

Ich denke, du brauchst lambda i=i: .... Derzeit wird nur überprüft, ob i<5, wenn du das Lambda initialisierst.

9voto

FP-Stil verwendet keinen globalen Zustand (globale Variablen) und minimiert die Seiteneffekte (z. B. IO). Eine While-Schleife könnte wie folgt aussehen:

fp_while = lambda pred, fun, acc: (lambda val: fp_while(pred, fun, val) if pred(val) else val)(fun(acc))

print fp_while(lambda x: x < 5, lambda x: x + 1, 1)

wenn du einen Seiteneffekt benötigst:

def add_and_print(x):
   print x
   return x + 1

fp_while(lambda x: x < 5, add_and_print, 1)

2voto

sam Punkte 738

Mit Rekursion wie in der Antwort von @aleksei-astynax-pirogov wird ein Rekursionsfehler auftreten, wenn Sie zu viele Iterationen haben. Sie können stattdessen den Seiteneffekt des Zustands innerhalb einer Funktion verbergen.

def fp_while(pred, fun, acc):
    v = acc
    while(pred(v)):
        v = fun(v)
    return v 

Verwendungsbeispiel:

fp_while(lambda x: x < 5, lambda x: x + 1, 1)
print(fp_while(lambda x: x < 5, lambda x: x + 1, 1))
# gibt 5 aus

Verwendung des Generatorenansatzes

Der folgende Generatorenansatz ermöglicht es Ihnen, den Zustand bei jeder Iteration zu speichern

def fp_while_generator(pred, fun, acc):
    v = acc
    while(pred(v)):
        yield v
        v = fun(v)
    yield v # entfernen Sie dies, wenn Sie den letzten Wert, der die Überprüfung nicht besteht, nicht möchten

Verwendungsbeispiel:

my_while_generator = fp_while_generator(lambda x: x < 5, lambda x: x + 1, 1)
print([i for i in my_while_generator])
# gibt [1,2,3,4,5] aus

Weitere Informationen zu Generatoren https://realpython.com/introduction-to-python-generators/

-1voto

Ruggero Turra Punkte 15400

Wahrscheinlich brauchst du:

i = 1
def whileloop():
    global i
    print i
    i = i+1
    return True

while_FP = lambda: ((i < 5) and whileloop()) and while_FP()
while_FP()

aus funktionaler Sicht and bewertet das rechte Feld, wenn das linke True ist. Du kannst es auch mit or umschreiben. Übrigens ist es keine gute Praxis, globals zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X