2009-03-27 60 views
12

Vì vậy, hàm Python có thể trả về nhiều giá trị. Nó đánh tôi rằng nó sẽ được thuận tiện (mặc dù một chút ít có thể đọc được) nếu sau đây là có thể.Truyền các hàm có nhiều giá trị trả về làm đối số trong Python

a = [[1,2],[3,4]] 

def cord(): 
    return 1, 1 

def printa(y,x): 
    print a[y][x] 

printa(cord()) 

... nhưng không phải. Tôi biết rằng bạn có thể làm điều tương tự bằng cách bán cả hai giá trị trả về thành các biến tạm thời, nhưng nó không có vẻ thanh lịch. Tôi cũng có thể viết lại dòng cuối cùng là "printa (cord() [0], cord() [1])", nhưng điều đó sẽ thực thi dây() hai lần.

Có cách nào hiệu quả, thanh lịch để thực hiện việc này không? Hay tôi chỉ nên thấy câu nói đó về tối ưu hóa sớm và quên điều này?

Trả lời

20
printa(*cord()) 

Các * đây là một nhà điều hành mở rộng tranh luận ... cũng tôi quên những gì nó về mặt kỹ thuật được gọi là, nhưng trong bối cảnh này phải mất một danh sách hoặc tuple và mở rộng nó ra để các chức năng thấy mỗi phần tử danh sách/tuple như một đối số riêng biệt.

Đó là về cơ bản là đảo ngược của * bạn có thể sử dụng để nắm bắt tất cả các đối phi từ khóa trong định nghĩa hàm:

def fn(*args): 
    # args is now a tuple of the non-keyworded arguments 
    print args 

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

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

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

cũng làm như vậy.

+1

Đó là một bộ dữ liệu. :-) –

+0

Và tài liệu: http://docs.python.org/tutorial/controlflow.html#tut-unpacking-arguments – regan

+0

Cảm ơn Jason, tôi đã chỉnh sửa nội dung đó. –

6

Hãy thử điều này:

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

Ngôi sao về cơ bản nói "sử dụng các yếu tố của bộ sưu tập này như các đối số vị trí." Bạn có thể làm tương tự với một dict cho các đối số từ khóa sử dụng hai ngôi sao:

>>> a = {'a' : 2, 'b' : 3} 
>>> def foo(a, b): 
... print a, b 
... 
>>> foo(**a) 
2 3 
4

Trên thực tế, Python không thực sự trả về nhiều giá trị, nó sẽ trả về một giá trị có thể được nhiều giá trị đóng gói vào một tuple. Có nghĩa là bạn cần phải "giải nén" giá trị trả về để có bội số. Một tuyên bố như

x,y = cord() 

nào đó, nhưng trực tiếp sử dụng giá trị trả về như bạn đã làm trong

printa(cord()) 

không, đó là lý do tại sao bạn cần phải sử dụng dấu hoa thị. Có lẽ một thuật ngữ tốt đẹp cho nó có thể là "ngầm giải nén tuple" hoặc "tuple giải nén mà không có nhiệm vụ".

Các vấn đề liên quan