2009-05-15 10 views
1

J'ai une fonction qui a plusieurs sorties, toutes "natives", c'est-à-dire des entiers et des chaînes. Par exemple, disons que j'ai une fonction qui analyse une chaîne, et trouve à la fois le nombre de mots et la longueur moyenne d'un mot.Débutant Python: Renvoyer plusieurs résultats Int/String en Python

En C/C++ j'utiliserais @ pour passer 2 paramètres à la fonction. En Python, je ne sais pas quelle est la bonne solution, car les entiers et les chaînes ne sont pas transmis par référence mais par valeur (du moins c'est ce que je comprends des essais et erreurs), donc le code suivant ne fonctionnera pas:

def analyze(string, number_of_words, average_length): 

    ... do some analysis ... 

    number_of_words = ...  
    average_length = ... 

Si je fais ce qui précède, les valeurs hors de la portée de la fonction ne changent pas. Ce que je fais actuellement est d'utiliser un dictionnaire comme ceci:

def analyze(string, result): 

    ... do some analysis ... 

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

Et j'utiliser la fonction comme ceci:

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

Cependant, cela ne se sent pas bien. Quelle est la bonne façon Pythonienne d'y parvenir? S'il vous plaît noter que je ne fais référence qu'aux cas où la fonction renvoie 2-3 résultats, pas des dizaines de résultats. De plus, je suis un débutant complet à Python, donc je sais que je peux manquer quelque chose trivial ici ...

Merci

+0

Voir 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 à propos "appel par référence d'objet" – tzot

Répondre

17

python a une déclaration return, ce qui vous permet de faire le follwing:

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

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

mais vous n'avez pas besoin d'avoir result du tout, vous pouvez retourner quelques valeurs comme ceci:

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

C'est ce que je cherchais, merci! –

0

Si vous avez besoin d'utiliser des arguments de méthode dans les deux sens, vous pouvez encapsulent les arguments la classe et passez l'objet à la méthode et laissez la méthode utiliser ses propriétés.

+0

Sauf dans ce cas particulier, car en Python, les entiers et les chaînes sont immuables. – mipadi

3

Si vous retournez les variables dans votre fonction comme ceci:

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

Ensuite, vous pouvez l'appeler comme celui-ci de mettre à jour les paramètres qui ont été passés:

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

Mais, pour votre exemple fonction, ce serait mieux:

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

En python, vous ne modifiez pas les paramètres de la manière C/C++ (en les passant par référence ou à travers un pointeur et en faisant des modifications in situ). Il y a des raisons pour lesquelles les objets string sont inmutable dans python. La bonne chose à faire est de retourner les paramètres modifiés dans un tuple (comme suggéré par SilentGhost) et de relier les variables aux nouvelles valeurs.