Ich würde gerne sehen, ob es möglich ist, eine Liste von Funktionen in einer Funktion zu durchlaufen. Das nächste, was ich finden könnte, ist das Durchlaufen eines ganzen Moduls. Ich möchte nur eine vorgewählte Liste von Funktionen verwenden.
Hier ist mein ursprüngliches Problem:
Beispieleingabe
%Vor%Beispielausgabe (muss in separate Zeilen gedruckt werden, True, wenn mindestens ein Buchstabe übergeben wird, oder false, wenn alle Buchstaben bei jedem Test fehlschlagen):
%Vor%Ich habe dies für einen Test geschrieben. Natürlich könnte ich nur 5 verschiedene Code-Sätze schreiben, aber das scheint hässlich. Dann begann ich mich zu fragen, ob ich einfach alle Tests durchlaufen konnte, nach denen sie verlangten.
Code für nur einen Test:
%Vor%Mein fehlgeschlagener Versuch, eine Schleife mit allen Tests auszuführen:
%Vor%Wie repariere ich diesen Code, um alle Regeln dort zu erfüllen?
Verwendung von Informationen aus allen Kommentaren - dieser Code erfüllt die oben genannten Regeln und durchläuft jede Methode dynamisch.
%Vor%getattr-Ansatz (ich glaube, das nennt man Introspektions-Methode?)
%Vor%Listenverständnisansatz:
%Vor%Die Art und Weise, wie Sie eine Liste von Funktionen durchlaufen, ist etwas aus. Dies wäre ein guter Weg, dies zu tun. Die Funktionen, die Sie in der Liste speichern müssen, sind die generischen Zeichenfolgenfunktionen, die von str.funcname angegeben werden. Sobald Sie diese Liste von Funktionen haben, können Sie sie mit einer for-Schleife durchlaufen und behandeln Sie sie wie eine normale Funktion!
%Vor%Beispielausgaben:
%Vor%Ich merke auch, dass Sie die Indexierung für die Iteration verwenden, was mir das Gefühl gibt, dass Sie aus einer Sprache wie C / C ++ kommen könnten. Das For-In-Loop-Konstrukt ist in Python wirklich mächtig, also würde ich es (y) nachlesen.
Oben ist eine mehr pythische Art, dies zu tun, aber nur als ein Lernwerkzeug, schrieb ich eine Arbeitsversion, die so gut wie möglich zusammenpasst, um Ihnen zu zeigen, wo Sie speziell schief gelaufen sind. Hier ist es mit Kommentaren:
%Vor%Okay, also ist die erste Frage einfach genug. Der einfache Weg ist einfach
%Vor%Vernachlässige nie die einfachste Sache, die funktionieren könnte.
Wenn Sie es jetzt dynamisch tun möchten - was das magische Schlüsselwort ist, das Sie wahrscheinlich gebraucht haben, möchten Sie so etwas anwenden (aus eine andere Frage ):
%Vor% Achtung, dies ist ein nicht getesteter Code, der Ihnen die Idee geben soll. Der Schlüsselgedanke hierbei ist, dass die Methoden eines Objekts genau wie alles andere Attribute sind, also zum Beispiel getattr("a", "isalpha")()
Folgendes tut:
getattr
, um das Attributverzeichnis von "a"
für eine Methode mit dem Namen isalpha
zu durchsuchen.
<function isalpha>
()
auf, das der Funktionsoperator in Python ist. Siehe dieses Beispiel:
%Vor%Ich werde raten, dass Sie die Passwortkomplexität validieren, und ich werde auch sagen, dass Software, die eine Eingabe nimmt und "Falsch" sagt, und es keinen Hinweis darauf gibt, warum Benutzer ist -hostile, also ist das Wichtigste nicht, "wie man über verschachtelten Zeichen Funktionscode-Zauberei (*)", sondern "gibt gutes Feedback" und schlägt etwas mehr wie:
vor %Vor%Versuchen Sie online unter repl.it
Und die Regex-Suche prüft Bereiche von Zeichen und Ziffern in einem Anruf, was besser ist als eine Schleife über Zeichen.
(PS. Ihre Funktionen überschneiden sich; eine Zeichenkette mit Zeichen, die 'isupper', 'islower' und 'isnumeric' entsprechen, hat bereits 'isadigit' und 'isalnum' abgedeckt. Interessanter wäre die Behandlung von Zeichen wie !
which sind nicht obere, untere, Ziffern oder alnum).
(*) Funktionswizardie wie die anderen Antworten ist normalerweise genau das, was ich antworten würde, aber es gibt so viel davon bereits beantwortet, dass ich genauso gut den anderen Weg stattdessen antworten kann: P
Alle anderen Antworten sind korrekt, aber da Sie ein Anfänger sind, möchte ich auf das Problem in Ihrem Code hinweisen:
%Vor%Erstens: Ich bin mir nicht sicher, welchen Wert ich gerade in Ihrem Code hat, aber er scheint irgendwo in den String zu zeigen - was dazu führt, dass einzelne Zeichen ausgewertet werden, nicht die ganze Zeichenfolge roh .
Zweitens: Wenn Sie Ihre Liste erstellen, rufen Sie bereits die Methoden auf, die Sie einfügen möchten, was dazu führt, dass nicht die Funktionen selbst eingefügt werden, sondern ihre Rückgabewerte (deshalb sehen Sie all diese True -Werte in Ihrer print-Anweisung).
Versuchen Sie, Ihren Code wie folgt zu ändern:
%Vor% Da Sie eine Liste von einfachen Elementen durchlaufen und versuchen herauszufinden, ob all
der Funktionen hat any
gültige Ergebnisse, Sie können einfach die Liste der Funktionen definieren möchte die Eingabe aufrufen und diese zurückgeben. Hier ist ein ziemlich pythisches Beispiel für das, was Sie erreichen möchten:
Testen Sie es:
%Vor%Sie können Introspektion , um alle Attribute eines Objekts zu durchlaufen, egal ob es sich um Funktionen oder um einen anderen Typ handelt.
Allerdings möchten Sie das wahrscheinlich nicht, weil str
viele Funktionsattribute hat und Sie nur an fünf interessiert sind. Es ist wahrscheinlich besser, das zu tun, was Sie getan haben, und einfach eine Liste der fünf gewünschten zu erstellen.
Außerdem müssen Sie nicht jedes Zeichen der Zeichenfolge durchlaufen, wenn Sie nicht möchten; Diese Funktionen betrachten bereits die ganze Zeichenfolge.