2017-01-17 1 views
4

Ich habe die folgende Funktion. Idealerweise möchte ich entweder eine einzelne Zeichenfolge oder eine Liste von Strings als Eingabe übergeben haben. In jedem Fall muss ich .upper darauf verwenden. Wenn jedoch nur eine einzige Zeichenfolge übergeben wird, durchläuft der Iterator jedes Zeichen. Wie kann ich eine if-Anweisung haben, die prüft, ob eine Liste von Zeichenfolgen oder eine einzelne Zeichenfolge? (Ich kann nicht die iterable Natur von Strings scheinen zu vermeiden) die ArtIf-Anweisung, ob eine Zeichenfolge oder eine Liste von Zeichenfolgen

def runthis(stringinput): 

    for t in stringinput: 
     t = t.upper() 
+0

Also, auch wenn "stringinput" eine Liste von Strings wäre, würde Ihr Code diese nicht verändern. –

+2

Scheint netter, immer eine Liste von Zeichenfolgen zu akzeptieren, die nur eine einzelne Zeichenfolge enthalten können. Was ist der Wert dafür, dass der Anrufer Ihnen eine nicht aufgelistete Zeichenfolge übergeben kann? – amalloy

Antwort

4

Prüfung mit isinstance.

def runthis(stringinput): 
    if isinstance(stringinput, list): 
     for t in stringinput: 
      t = t.upper() 
      # Some other code should probably be here. 
    elif isinstance(stringinput, basestring): 
     t = t.upper() 
     # Some other code perhaps as well. 
    else: 
     raise Exception("Unknown type.") 

Verwenden str statt basestring für Python 3.

+0

danke! Das hat gut funktioniert – keynesiancross

0

könnten Sie die type() Funktion als so:

if type(stringinput) is list: 
    #Your list code 
elif type(stringinput) is str: 
    #Your string code 
else: 
    #stringinput isn't a list or a string, throw an error 
1

Sie isinstance() verwenden können, um zu überprüfen, ob die Funktion arg vom Typ list oder nicht:

def to_upper(arg): 
    if isinstance(arg, list): 
     return [item.upper() for item in arg] # This is called list comprehension 
    else: 
     return arg.upper() 
1

Eine Möglichkeit wäre, explizit zu überprüfen, ob das Argument eine Liste oder eine Zeichenfolge ist, und es in bedingten Klauseln anders zu behandeln.

Eine Alternative, die ich denke, könnte schöner sein (wenn es für Ihren Anwendungsfall geeignet ist) könnte die folgende sein:

def runthis(*stringinput): 
    for t in stringinput: 
     t = t.upper() 
     print(t) 
    print() 

runthis("test") # TEST 
runthis("another", "test") # ANOTHER TEST 
runthis(*["one", "final", "test"]) # ONE FINAL TEST 

Doch dieser Ansatz nicht geeignet ist, wenn Aufruf Codelisten zur Verfügung stellen können, ohne Splatting .


Dieser Ansatz beruht auf der Nutzung des * Betreiber, hier die auf zwei verschiedene Arten verwendet wird.

in der Funktionsdefinition Kontext (*stringinput), dieser Operator macht Wesentlichen stringinput ein variadische Argument; Das heißt, ein Argument, das alle Argumente, die an die Funktion übergeben werden, in ein Tupel "hochlädt", das für die Zwecke von runthis wie eine Liste wirkt (es kann iteriert werden). Wenn ich einen Anruf machen würde runthis("foo", "bar", "baz"), hätte stringinput den Wert ("foo", "bar", "baz").

Sie können mehr über Variadic Argumente here lesen.

Im Funktionsaufrufkontext (runthis(*["one", "final", "test"])) "splat" oder entpackt dieser Operator jedes Element der Liste. Im Wesentlichen entspricht runthis(*["one", "final", "test"])runthis("one", "final", "test").

Sie können mehr über Splatting here lesen.

+0

Hallo, danke dafür. Was macht das "*"? – keynesiancross

+0

"*" ist der Splat-Operator. Ich bearbeite meinen Beitrag, um weitere Informationen hinzuzufügen. – Tagc

+0

@keynesiancross Ich habe diese Details jetzt bearbeitet. – Tagc

Verwandte Themen