Wie beurteilt man (oder wie schreibt man) eine Python-Funktion ohne Nebenwirkungen?

8

Die Antwort entspricht der Definition von side effects .

Bisher finde ich keine genaue Antwort. Das Python-Dokument sagt: Functional style discourages functions with side effects that modify internal state or make other changes that aren’t visible in the function’s return value.

Was ist modify internal state und make other changes that aren’t visible... ?

Ist die Bindung von Variablen an Objekte (nur binden, nicht verändern) keine Nebenwirkungen? beispielsweise a=1 oder a=[1,2,3] oder a,b=1,2 .

Hier sind 4 Funktionen. Sind sie alle ohne Nebenwirkungen? Warum?

Beachten Sie, dass das Argument n ein Objekt int sein muss.

%Vor%

Meine Vermutung: purefunc1 ist ohne Nebenwirkungen. Aber ich kenne die folgende purefunc * nicht.

Die Ausgabe ist:

%Vor%

Wenn Sie fragen, warum solche ungeraden Funktionen existieren, ist die Antwort nur aus Bequemlichkeit. Die wirkliche Funktion ist kompliziert. Aber wenn Sie interessiert sind, können Sie hier klicken , um zu sehen, ob die Funktion ieval ohne Seite ist Effekte oder nicht.

Danke euch allen im Voraus.

    
tcpiper 17.11.2013, 04:10
quelle

4 Antworten

4

In Pythons Dokumentation zur funktionalen Programmierung gibt es einen kleinen Absatz. Ich zitiere unten (Hervorhebung von mir):

  

Python-Programme, die im funktionalen Stil geschrieben sind, gehen normalerweise nicht so weit, dass alle I / O oder alle Zuweisungen vermieden werden ; Stattdessen werden sie eine funktional erscheinende Schnittstelle zur Verfügung stellen, jedoch intern nicht-funktionale Merkmale verwenden. Zum Beispiel verwendet die Implementierung einer Funktion weiterhin Zuweisungen zu lokalen Variablen , ändert aber keine globalen Variablen oder hat andere Nebeneffekte.

Mit anderen Worten, denke an das, was von außen aussieht. Ändert die Funktion einige globale Variable, Klassenvariable? Manipuliert es irgendeinen Zustand? Wenn nein, dann ist es rein . Entsprechend den oben genannten Dokumenten kann intern eine Funktion lokalen Variablen zuweisen, aber was wichtig ist, sollte die Funktion keinen extern zugewandten Zustand verändern.

  

Was ist Modify Internal State und andere Änderungen, die nicht sichtbar sind ...?

Sehen Sie sich ein Beispiel an. Wir ändern ein global_list jedes Mal, wenn wir non_pure_add1_func(..) aufrufen.

%Vor%

Obwohl die obige Funktion möglicherweise idempotent ist, aber nicht rein ist.

    
SuperSaiyan 17.11.2013, 04:23
quelle
5

Im Kontext der funktionalen Programmierung ist eine Funktion eine deterministische Sache, die bei einer Eingabe etwas ausgibt. Das machen pure Funktionen. Sie berechnen nur Dinge. Sie "tun" keine Dinge. Wenn Ihr Funktionscode theoretisch durch eine Tabelle (sogar eine unendliche) umgeschaltet werden könnte, dann haben Sie eine Funktion ohne Nebenwirkungen.

Alles Neben der Rückgabe eines Werts ist dies ein Nebeneffekt. Die Begriffe "internen Status ändern" und "andere Änderungen vornehmen, die nicht sichtbar sind" beziehen sich darauf. Das Ändern des internen Status oder das Vornehmen von Änderungen ... kann bedeuten:

  1. Etwas drucken
  2. Ändern eines Objekts außerhalb des Gültigkeitsbereichs
  3. Etwas speichern

Sie können die Nebenwirkung als "Veränderung der Außenwelt" verstehen. In Ihren Beispielen tut keiner von ihnen das. Aber wenn Sie n etwas zuweisen, etwas anhängen oder irgendetwas, das nach der Rückkehr der Funktion in Ihrer Umgebung verbleiben würde, wäre das ein Nebeneffekt.

Alle Ihre Funktionen können beim Vergleich von Ein- und Ausgängen getestet werden. Wenn Sie Nebenwirkungen (wie mutieren n) hatten, würden Ihre Tests komplizierter und Sie müssten den Kontext Ihrer Funktion analysieren.

    
Lucas Ribeiro 17.11.2013 04:55
quelle
2

Eine Python-Funktion hat keine Nebeneffekte, wenn und nur wenn globale Variablen nicht geändert werden, nur Seiteneffekt-freie Funktionen aufgerufen werden und löst keine Exceptions aus, die abgefangen werden . Zitat Wikipedia:

  

In der Informatik wird gesagt, dass eine Funktion oder ein Ausdruck eine Seite hat   Effekt, wenn zusätzlich zur Rückgabe eines Wertes auch einige geändert werden   eine beobachtbare Interaktion mit aufrufenden Funktionen der   Außenwelt.

Grundsätzlich kann eine Nebeneffekt-freie Funktion aufgerufen werden und nichts ist nach dem Anruf anders, d.h. nach dem Anruf ist alles gleich.

    
Ramchandra Apte 17.11.2013 04:21
quelle
2

Sie haben selbst geantwortet. Sie wollen Beispiele für Nebenwirkungen?

%Vor%

Dies ändert sys.stdout, indem es darauf schreibt. sys.stdout ist nicht intern in der Funktion.

%Vor%

Dies ändert a , eine globale, nicht lokale Funktion.

Ein elegantes Beispiel für die Speicherung des Zustands in einer einfachen Funktion (keine Klasse, nichts Externes) ist dies:

%Vor%

Das Array (weil es nur einmal bei der Funktionsdefinition erstellt wird) ist für jeden Aufruf der Funktion gleich, es gehört dazu. Und es ändert sich für jeden Aufruf und ändert den Rückgabewert in Abhängigkeit von state . : -)

Ihre Funktionen tun nichts davon. Deshalb haben sie keine Nebenwirkungen.

    
Robert Siemer 17.11.2013 04:31
quelle