将函数输出作为参数传递给另一个函数

时间:2015-04-13 10:09:31

标签: python argument-passing function-calls

我需要将Python中函数的输出作为参数传递给另一个函数。唯一的问题是第一个函数返回一个元组,整个元组需要传递给第二个函数。

例如:

我有一个库函数:

def some_function(some_string, some_number):
    # does something
    return (text,id)

现在我想将从text返回的idsome_function作为参数传递给另一个函数。问题是该函数还有其他参数。我还需要检索由some_stringnumber的不同值生成的许多文本和ID。

根据遇到的条件,我想调用另一个看起来像这样的函数

 if abcd:
     other_function(name,phone,**some_function("abcd","123")**,age)
 elif xyz:
     other_function(name,phone,**some_function("xyz","911")**,age)
 else:
     other_function(name,phone,**some_function("aaaa","000")**,age)

那么我该如何替换some_function("abcd","123")以便扩展元组并将textid作为参数发送?

other_function定义如下

def other_function(name, phone, text, id, age):
   ...
    return 

只是简单地传递some_function("aaaa","000")作为参数吗?


我问的是因为我写了一个简单的代码来测试我的假设,它给了我一个空白的输出。

def f(id,string):
    return ("123", "hello")

def a(name, age, id, words, phone):
     print name + age + id + words + phone


def main():
    a("piyush", "23", f("12", "abc"), "123")

2 个答案:

答案 0 :(得分:4)

你有两个选择*;要么先显式解包函数结果:

id, words = f('12', 'abc')
a('piyush', '23', id, words, '123')

或在a的调用中使用元组解包,并按关键字提供最后一个参数:

a('piyush', '23', *f('12', 'abc'), phone='123')

如果不熟悉此语法,请参阅What does ** (double star) and * (star) do for parameters?


请注意,如果您尝试将phone作为位置参数(而不是上面的关键字参数)之后传递来自f的解压缩结果,即

a('piyush', '23', *f('12', 'abc'), '123')

您将获得SyntaxError: only named arguments may follow *expression。在*解包后,您无法获得位置参数,必须将关键字用于任何其他参数。


* 除非您:

答案 1 :(得分:2)

您还可以更改签名中参数的顺序:

def a(name, age, id, words, phone):
     name = name
     age=age
     id=id
     words=words
     phone=phone
     print name+age+id+words+phone

a("piyush", "23", 123, *f("12","123"))
piyush23123123hello

这样,您可以在调用函数时直接解压缩返回的值。 但请注意,这使得可读性非常差并且调试更加困难。

此外,如果您不想使用解包并更改您调用您的功能,您可以更改以下代码:

def a(name, age, id_words, phone):
     name = name
     age=age
     id=id_words[0]
     words=id_words[1]
     phone=phone
     print name+age+id+words+phone

a("piyush", "23", f("12","123"), "123")
piyush23123hello123

这样可以保持所有函数的调用与它们相同。只有函数的内部工作改变,而不是签名。