2009-05-15 4 views
1

Ich habe eine Funktion, die mehrere Ausgänge hat, von denen alle "native", d. H. Ganzzahlen und Strings. Angenommen, ich habe eine Funktion, die eine Zeichenfolge analysiert und sowohl die Anzahl der Wörter als auch die durchschnittliche Länge eines Worts ermittelt.Python Newbie: Mehrere Int/String Ergebnisse in Python

In C/C++ würde ich @ verwenden, um 2 Parameter an die Funktion zu übergeben. In Python bin ich mir nicht sicher, was die richtige Lösung ist, weil Integer und Strings nicht als Referenz, sondern als Wert übergeben werden (zumindest verstehe ich das unter Trial-and-Error), so dass der folgende Code nicht funktioniert:

def analyze(string, number_of_words, average_length): 

    ... do some analysis ... 

    number_of_words = ...  
    average_length = ... 

Wenn ich das oben tun, ändern sich die Werte außerhalb des Bereichs der Funktion nicht. Was ich zur Zeit tun, ist ein Wörterbuch benutzen wie so:

def analyze(string, result): 

    ... do some analysis ... 

    result['number_of_words'] = ...  
    result['average_length'] = ... 

Und ich verwende die Funktion wie folgt aus:

s = "hello goodbye" 
result = {} 
analyze(s, result) 

jedoch, die nicht richtig anfühlt. Was ist der richtige pythonische Weg, um dies zu erreichen? Bitte beachten Sie, dass ich nur Fälle betrachte, in denen die Funktion 2-3 Ergebnisse liefert, nicht Dutzende von Ergebnissen. Außerdem bin ich ein kompletter Neuling auf Python, so dass ich weiß, ich kann etwas trivial hier fehlt ...

Dank

+0

Siehe http://www.google.com/url?sa=t&source=web&ct=res&cd=1&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FPython_syntax_and_semantics&ei=Q-oNSoG9C4resgajkY2ICA&usg=AFQjCNG_HE4ZKmUPGvVh9_SqhnJdMdYxaA&sig2=5h95J4BFgltEby5aDtEL0g über "Aufruf nach Objektreferenz" – tzot

Antwort

17

Python hat eine return Aussage, die Sie die follwing tun können:

def func(input): 
    # do calculation on input 
    return result 

s = "hello goodbye" 
res = func(s)  # res now a result dictionary 

aber Sie brauchen nicht result überhaupt haben, können Sie ein paar Werte wie so zurück:

def func(input): 
    # do work 
    return length, something_else   # one might be an integer another string, etc. 

s = "hello goodbye" 
length, something = func(s) 
+0

Das ist, was ich gesucht habe, danke! –

0

Wenn Sie Methodenargumente in beiden Richtungen verwenden müssen, können Sie die Argumente kapseln die Klasse und übergeben Sie das Objekt an die Methode und lassen Sie die Methode ihre Eigenschaften verwenden.

+0

Außer in diesem speziellen Fall, weil Integer und Strings in Python unveränderlich sind. – mipadi

3

Wenn Sie zurückkommen, die Variablen in Ihrer Funktion wie folgt aus:

def analyze(s, num_words, avg_length): 
    # do something 
    return s, num_words, avg_length 

Dann können Sie es so nennen sich die Parameter zu aktualisieren, die übergeben wurden:

s, num_words, avg_length = analyze(s, num_words, avg_length) 

Aber für Ihre Beispielfunktion, wäre dies besser sein:

def analyze(s): 
    # do something 
    return num_words, avg_length 
1

In Python Sie Parameter nicht ändern in der C/C++ - Methode (durch Referenzieren oder durch einen Zeiger und Ausführen von Modifikationen in situ). Es gibt einige Gründe dafür, dass die String-Objekte in Python unveränderbar sind. Sie müssen die geänderten Parameter in einem Tupel (wie SilentGhost vorgeschlagen) zurückgeben und die Variablen an die neuen Werte binden.