Passing functions which have multiple return values as arguments in Python

前端 未结 3 485
忘掉有多难
忘掉有多难 2021-01-01 19:57

So, Python functions can return multiple values. It struck me that it would be convenient (though a bit less readable) if the following were possible.

a = [[         


        
相关标签:
3条回答
  • 2021-01-01 20:37

    Actually, Python doesn't really return multiple values, it returns one value which can be multiple values packed into a tuple. Which means that you need to "unpack" the returned value in order to have multiples. A statement like

    x,y = cord()
    

    does that, but directly using the return value as you did in

    printa(cord())
    

    doesn't, that's why you need to use the asterisk. Perhaps a nice term for it might be "implicit tuple unpacking" or "tuple unpacking without assignment".

    0 讨论(0)
  • 2021-01-01 20:42

    Try this:

    >>> def cord():
    ...     return (1, 1)
    ...
    >>> def printa(y, x):
    ...     print a[y][x]
    ...
    >>> a=[[1,2],[3,4]]
    >>> printa(*cord())
    4
    

    The star basically says "use the elements of this collection as positional arguments." You can do the same with a dict for keyword arguments using two stars:

    >>> a = {'a' : 2, 'b' : 3}
    >>> def foo(a, b):
    ...    print a, b
    ...
    >>> foo(**a)
    2 3
    
    0 讨论(0)
  • 2021-01-01 20:44
    printa(*cord())
    

    The * here is an argument expansion operator... well I forget what it's technically called, but in this context it takes a list or tuple and expands it out so the function sees each list/tuple element as a separate argument.

    It's basically the reverse of the * you might use to capture all non-keyword arguments in a function definition:

    def fn(*args):
        # args is now a tuple of the non-keyworded arguments
        print args
    
    fn(1, 2, 3, 4, 5)
    

    prints (1, 2, 3, 4, 5)

    fn(*[1, 2, 3, 4, 5])
    

    does the same.

    0 讨论(0)
提交回复
热议问题