2016-08-01 6 views
0

Wie kann ich Funktion mit optionalen Ausgabeparametern schreiben. In BeispielWie kann ich Funktion mit optionalen Ausgabeparametern in Python schreiben

1) mat = ReadBinFile(filename) oder
2) [mat,titles] = ReadBinFile(filename)

wenn ich die "ReadBinFile" -Funktion mit

return mat,titles 

i in "mat"

in dem ersten Beispiel ein Tupel beendet haben

Vielen Dank für die Hilfe

+0

Was ist Ihr Anwendungsfall dafür? Wenn Sie das zweite Tupel-Element nicht möchten, ignorieren Sie es einfach. – mhawke

+0

Sie können dies nicht tun. Es ist sowieso keine großartige Idee. Packen Sie einfach das Ergebnis aus und löschen Sie alle Elemente, die Sie nicht möchten. – BrenBarn

+0

Die Verwendung eines Generators über ein Tupel hat den Vorteil, die Zeit potenziell zu verkürzen (wenn jedes Element eine Weile braucht) –

Antwort

-1

Es gibt zwei Möglichkeiten, dies zu tun. Einer ist, ein Argument zu akzeptieren, das den Rückgabewert bestimmt. Die zweite (und interessantere) ist die Rückgabe eines Generators.

def ReadBinFile(filename): 
    yield mat 
    yield titles 

mat,titles = ReadBinFile(filename) 

Dadurch erhalten Sie nur die ersten oder erhalten die ersten n Rückgabewerte.

+1

Dies funktioniert nicht wirklich. Wenn Sie 'mat = ReadBinFile (Dateiname)' eingeben, wird 'mat' den Generator selbst erhalten, nicht den ersten erhaltenen Wert. – BrenBarn

+0

Ich glaube nicht, dass es einen Weg gibt, genau das zu tun, was Sie tun möchten. In Python können Sie die Syntax nicht ändern, aber Sie können funktionale Ergebnisse erhalten. Ich bin mir ziemlich sicher, dass dies alles bietet, was Sie suchen. –

0

Sie können dies nicht tun, ohne der Funktion anzugeben, welcher Rückgabetyp benötigt wird, oder den Funktionsnamen zu maskieren (siehe meinen Kommentar).

Lassen Sie mich zeigen, warum.

In Perl können wir dies tun, indem Sie den Kontext des Aufrufs testen. Der erste (einzelne Rückgabewert) wäre ein skalarer Kontext und der zweite im Listenkontext. Wir könnten testen mit einer Funktion namens wantarray (Google "Python wantarray" - andere Suchmaschinen sind verfügbar). Perl ist aus diesem Grund und vielen anderen ungewöhnlich, wenn nicht einzigartig.

Python funktioniert nicht so, obwohl die Introspektion im Vergleich zu anderen Sprachen extrem sein kann. Die Form einer Zuweisung ist:

name = object 

wo name ist eine typenlos Referenz. Also:

mat = ReadBinFile(filename) 

Auch wenn von einigen hinterhältigen Mitteln wir den Byte-Code überprüft, hätten wir keine Möglichkeit zu wissen, welche Klasse von Objekt mat sollte verweisen. A list, ein tuple, ein int, ein bird, ein plane?

Die Syntax Sie zeigen:

[mat,titles] = ReadBinFile(filename) 

ein Rätsel ist. Obwohl gültig, hat es keinen praktischen Unterschied zu:

mat,titles = ReadBinFile(filename) 

was natürlich ein Tupel ist. Also, wie können wir sagen, ob:

mat = ReadBinFile(filename) 

sollte ein tuple, ein list sein, oder was auch immer Objektklasse mat soll verweisen.

Nach all dem ist meiner Meinung nach das Zurückbringen von Objekten verschiedener Klassen eine zweifelhafte Übung, sogar in Perl.Es gibt einige Ausnahmen, die unter bestimmten Umständen None zurückgeben. Warum zweifelhaft? Weil der Code schwer zu lesen, zu modifizieren und zu unterstützen ist.

Verwandte Themen