Новичок в Python: возвращение нескольких результатов типа Int / String в Python - PullRequest
1 голос
/ 15 мая 2009

У меня есть функция, которая имеет несколько выходов, каждый из которых "родной", то есть целые числа и строки. Например, допустим, у меня есть функция, которая анализирует строку и находит как количество слов, так и среднюю длину слова.

В C / C ++ я бы использовал @ для передачи 2 параметров в функцию. В Python я не уверен, что это правильное решение, потому что целые и строки передаются не по ссылке, а по значению (по крайней мере, это то, что я понимаю из метода проб и ошибок), поэтому следующий код не будет работать:

def analyze(string, number_of_words, average_length):

    ... do some analysis ...

    number_of_words = ...    
    average_length = ...

Если я сделаю выше, значения, выходящие за рамки функции, не изменятся. В настоящее время я использую словарь так:

def analyze(string, result):

    ... do some analysis ...

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

И я использую такую ​​функцию:

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

Однако это не так. Какой правильный Pythonian способ достичь этого? Обратите внимание, что я имею в виду только случаи, когда функция возвращает 2-3 результата, а не десятки результатов. Кроме того, я новичок в Python, так что я знаю, что я могу упустить что-то тривиальное здесь ...

Спасибо

Ответы [ 4 ]

17 голосов
/ 15 мая 2009

python имеет оператор return, который позволяет выполнить следующее:

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

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

но вам вообще не нужно иметь result, вы можете вернуть несколько значений, например:

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

s = "hello goodbye"
length, something = func(s)
3 голосов
/ 15 мая 2009

Если вы возвращаете переменные в вашей функции следующим образом:

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

Затем вы можете вызвать его так, чтобы обновить переданные параметры:

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

Но для вашего примера функции это будет лучше:

def analyze(s):
    # do something
    return num_words, avg_length
1 голос
/ 15 мая 2009

В python вы не изменяете параметры способом C / C ++ (передавая их по ссылке или через указатель и внося изменения in situ ). Есть несколько причин, например, что строковые объекты неизменный в питоне. Правильнее всего будет вернуть измененные параметры в кортеже (как предложил SilentGhost) и привязать переменные к новым значениям.

0 голосов
/ 15 мая 2009

Если вам нужно использовать аргументы метода в обоих направлениях, вы можете инкапсулировать аргументы в класс и передать объект методу и позволить методу использовать его свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...