Gegeben die folgende Liste:
%Vor%Ich möchte Strings länger als 3 Zeichen filtern. Ich erreiche das mit dem folgenden Code:
Mit for-Schleife:
%Vor%Aber ich möchte, dass mein Code allgemeiner ist, damit ich später Strings beliebiger Länge filtern kann, also verwende ich eine Funktion und eine for-Schleife:
%Vor% Ich möchte die gleiche Allgemeinheit mit filter()
erreichen, aber das kann ich nicht erreichen. Wenn ich die obige Funktion get_long()
verwende, kann ich einfach keine Argumente an sie übergeben, wenn ich sie mit filter()
verwende. Ist es einfach nicht möglich oder gibt es einen Weg um es herum?
Mein Code mit filter()
für den speziellen Fall:
Verwenden Sie lambda
, um den Schwellenwert wie folgt anzugeben:
Was Sie zu tun versuchen, ist bekannt als Teilfunktionsanwendung : Sie haben eine Funktion mit mehreren Argumenten (in dieser case, 2) und möchte eine davon abgeleitete Funktion mit einem oder mehreren fixen Argumenten erhalten, die Sie dann an filter
übergeben können.
Einige Sprachen (besonders funktionale) haben diese Funktionalität "eingebaut". In Python können Sie dafür lambdas verwenden (wie andere gezeigt haben) oder Sie können die functools
-Bibliothek functools.partial
:
Das partielle () wird für die Anwendung einer Teilfunktion verwendet, die einen Teil der Argumente und / oder Schlüsselwörter einer Funktion "einfriert", was zu einem neuen Objekt mit einer vereinfachten Signatur führt. Beispielsweise kann partial () verwendet werden, um ein Callable zu erstellen, das sich wie die Funktion int () verhält, wobei das Basisargument standardmäßig zwei ist:
%Vor%
So können Sie tun:
%Vor% Müssen Sie filter()
verwenden? Warum nicht ein mehr pythonisches Listenverständnis verwenden?
Beispiel:
%Vor% Diese Methode hat den Vorteil, dass es trivial ist, sie in einen Generator umzuwandeln, der abhängig von Ihrer Anwendung, z. Wenn Sie viele DNA-Sequenzen haben und diese durchlaufen wollen, wird die Realisierung als Liste sehr viel Speicher auf einmal verbrauchen. Der äquivalente Generator muss lediglich die eckigen Klammern []
durch runde Klammern ersetzen ()
:
In Python 2 ist diese Leistungsverbesserung keine Option mit filter()
, weil sie eine Liste zurückgibt. In Python gibt 3 filter()
ein Filterobjekt zurück, das einem Generator ähnlicher ist.
Sie können is_long
eine Funktion zurückgeben, die dna
akzeptiert, wie dies
und dann in filter
verwenden, so
Hinweis: Verwenden Sie nicht den Operator is
, um boolesche Werte oder Zahlen zu vergleichen. Stattdessen verlassen Sie sich so weit wie möglich auf die Wahrheit der Daten. In deinem Fall hättest du deine zweite Version so schreiben können.
Zitieren Programmierempfehlungen in PEP-8 ,
Vergleichen Sie boolesche Werte nicht mit True oder False mit ==.
%Vor%
Hier sind ein paar weitere Möglichkeiten mit lambda
. Der erste verwendet ein Standard-Schlüsselwort-Argument, um die gewünschte Länge zu halten. Der zweite bettet einfach die gewünschte Länge in lambda
body ein.
Ausgabe
%Vor%Im ersten Beispiel könnten Sie auch tun:
%Vor% Ebenso können Sie im zweiten Beispiel das Literal 5
durch eine lokale (oder globale) Variable ersetzen, zB:
Verwenden Sie filter
, um den Schwellenwert wie folgt anzugeben:
Sie können %code% eine Funktion zurückgeben, die %code% akzeptiert, wie dies
%Vor%und dann in %code% verwenden, so
%Vor%Hinweis: Verwenden Sie nicht den Operator %code% , um boolesche Werte oder Zahlen zu vergleichen. Stattdessen verlassen Sie sich so weit wie möglich auf die Wahrheit der Daten. In deinem Fall hättest du deine zweite Version so schreiben können.
%Vor%Zitieren Programmierempfehlungen in PEP-8 ,
Vergleichen Sie boolesche Werte nicht mit True oder False mit ==.
%Vor%
Hier sind ein paar weitere Möglichkeiten mit %code% . Der erste verwendet ein Standard-Schlüsselwort-Argument, um die gewünschte Länge zu halten. Der zweite bettet einfach die gewünschte Länge in %code% body ein.
%Vor%Ausgabe
%Vor%Im ersten Beispiel könnten Sie auch tun:
%Vor%Ebenso können Sie im zweiten Beispiel das Literal %code% durch eine lokale (oder globale) Variable ersetzen, zB:
%Vor%Was Sie zu tun versuchen, ist bekannt als Teilfunktionsanwendung : Sie haben eine Funktion mit mehreren Argumenten (in dieser case, 2) und möchte eine davon abgeleitete Funktion mit einem oder mehreren fixen Argumenten erhalten, die Sie dann an %code% übergeben können.
Einige Sprachen (besonders funktionale) haben diese Funktionalität "eingebaut". In Python können Sie dafür lambdas verwenden (wie andere gezeigt haben) oder Sie können die %code% -Bibliothek
Das partielle () wird für die Anwendung einer Teilfunktion verwendet, die einen Teil der Argumente und / oder Schlüsselwörter einer Funktion "einfriert", was zu einem neuen Objekt mit einer vereinfachten Signatur führt. Beispielsweise kann partial () verwendet werden, um ein Callable zu erstellen, das sich wie die Funktion int () verhält, wobei das Basisargument standardmäßig zwei ist:
%Vor%
So können Sie tun:
%Vor%Gegeben die folgende Liste:
%Vor%Ich möchte Strings länger als 3 Zeichen filtern. Ich erreiche das mit dem folgenden Code:
Mit for-Schleife:
%Vor%Aber ich möchte, dass mein Code allgemeiner ist, damit ich später Strings beliebiger Länge filtern kann, also verwende ich eine Funktion und eine for-Schleife:
%Vor%Ich möchte die gleiche Allgemeinheit mit %code% erreichen, aber das kann ich nicht erreichen. Wenn ich die obige Funktion %code% verwende, kann ich einfach keine Argumente an sie übergeben, wenn ich sie mit %code% verwende. Ist es einfach nicht möglich oder gibt es einen Weg um es herum?
Mein Code mit %code% für den speziellen Fall:
%Vor%Sie könnten immer ein Callable erstellen, das eine Callback-Funktion zurückgibt, die für Vergleiche von %code% geeignet ist, wie das folgende Beispiel zeigt:
%Vor%Sie können einen allgemeineren Fall haben.
Da function ein Objekt in Python ist, können Sie eine andere Funktion erstellen, die die gewünschte Funktion zurückgibt.
%Vor%Das g ist, was Sie wirklich wollen und f ist die Funktion, die es erzeugt.
Müssen Sie %code% verwenden? Warum nicht ein mehr pythonisches Listenverständnis verwenden?
Beispiel:
%Vor%Diese Methode hat den Vorteil, dass es trivial ist, sie in einen Generator umzuwandeln, der abhängig von Ihrer Anwendung, z. Wenn Sie viele DNA-Sequenzen haben und diese durchlaufen wollen, wird die Realisierung als Liste sehr viel Speicher auf einmal verbrauchen. Der äquivalente Generator muss lediglich die eckigen Klammern %code% durch runde Klammern ersetzen %code% :
%Vor%In Python 2 ist diese Leistungsverbesserung keine Option mit %code% , weil sie eine Liste zurückgibt. In Python gibt 3 %code% ein Filterobjekt zurück, das einem Generator ähnlicher ist.
Tags und Links python list python-2.7