Есть ли способ в Python вернуть значение через выходной параметр?
В некоторых языках функция возвращает значения, используя параметры, подобные С#.
Давайте рассмотрим пример:
class OutClass
{
static void OutMethod(out int age)
{
age = 26;
}
static void Main()
{
int value;
OutMethod(out value);
// value is now 26
}
}
Итак, есть ли что-то подобное в Python для получения значения с помощью параметра?
Ответы
Ответ 1
Нет причин, так как Python может возвращать несколько значений через кортеж:
def func():
return 1,2,3
a,b,c = func()
Но вы также можете передать изменяемый параметр и возвращать значения через мутацию объекта:
def func(a):
a.append(1)
a.append(2)
a.append(3)
L=[]
func(L)
print(L) # [1,2,3]
Ответ 2
Ты имеешь в виду передачу по ссылке?
Для объекта Python по умолчанию это передача по ссылке. Однако я не думаю, что вы можете изменить ссылку в Python (иначе это не повлияет на исходный объект).
Например:
def addToList(theList): # yes, the caller list can be appended
theList.append(3)
theList.append(4)
def addToNewList(theList): # no, the caller list cannot be reassigned
theList = list()
theList.append(5)
theList.append(6)
myList = list()
myList.append(1)
myList.append(2)
addToList(myList)
print(myList) # [1, 2, 3, 4]
addToNewList(myList)
print(myList) # [1, 2, 3, 4]
Ответ 3
Передайте список или что-то в этом роде и поместите туда возвращаемое значение.
Ответ 4
Кроме того, если вам нравится читать какой-то код, я думаю, что pywin32
имеет способ обработки выходных параметров.
В API Windows обычно используется большая зависимость от выходных параметров, поэтому я полагаю, что они каким-то образом справились с этим.
Ответ 5
Вы можете сделать это с изменяемыми объектами, но в большинстве случаев это не имеет смысла, потому что вы можете вернуть несколько значений (или словарь, если вы хотите изменить возвращаемое значение функции, не нарушая при этом существующие вызовы).
Я могу только подумать о одном случае, где вам может понадобиться, - это потоковая передача или, точнее, передача значения между потоками.
def outer():
class ReturnValue:
val = None
ret = ReturnValue()
def t():
# ret = 5 won't work obviously because that will set
# the local name "ret" in the "t" function. But you
# can change the attributes of "ret":
ret.val = 5
threading.Thread(target = t).start()
# Later, you can get the return value out of "ret.val" in the outer function
Ответ 6
Если выходные данные являются строками и числами, или если они представляют собой одномерные массивы строк и чисел (как правило, варианты), вы можете получить их с помощью MS Excel, я предоставил решение, которое я использовал в своем приложении, когда столкнулся с такой проблемой с AutoCAD (задал вопрос, но не получил никакого ответа), вы можете проверить мое решение здесь