Mở rộng bộ dữ liệu thành đối số


411

Có cách nào để mở rộng một tuple Python thành một hàm - như các tham số thực tế không?

Ví dụ, ở đây expand()có phép thuật:

some_tuple = (1, "foo", "bar")

def myfun(number, str1, str2):
    return (number * 2, str1 + str2, str2 + str1)

myfun(expand(some_tuple)) # (2, "foobar", "barfoo")

Tôi biết người ta có thể định nghĩa myfunmyfun((a, b, c)), nhưng tất nhiên có thể có mã kế thừa. Cảm ơn

Câu trả lời:


734

myfun(*some_tuple)làm chính xác những gì bạn yêu cầu. Các *nhà điều hành chỉ đơn giản là giải nén tuple (hoặc bất kỳ iterable) và vượt qua chúng như các đối số vị trí để hàm. Đọc thêm về giải nén các đối số .


8
Toán tử * chỉ đơn giản giải nén bộ dữ liệu và chuyển chúng dưới dạng đối số vị trí cho hàm. Xem thêm ở đây: docs.python.org/3/tutorial/...
john_mc

4
Lưu ý rằng cú pháp tương tự có thể được sử dụng cho danh sách cũng như bộ dữ liệu.
brendon-ai

Tôi thấy rằng bạn có thể làm tương tự với các danh sách, (trên thực tế, bất kỳ lần lặp nào, bao gồm cả chuỗi), không chắc khả năng biến đổi của chúng ảnh hưởng đến mọi thứ như thế nào. Đó sẽ là thú vị để xem xét.
wcyn

52

Lưu ý rằng bạn cũng có thể mở rộng một phần của danh sách đối số:

myfun(1, *("foo", "bar"))

13
Dường như bạn chỉ có thể làm điều này nếu bộ mở rộng nằm sau các đối số được cung cấp thông thường - trình thông dịch không thích khi tôi làm điều này:some_func(*tuple_of_stuff, another_argument)
Tom Galvin

6
@Quackmatic Có bộ dữ liệu mở rộng ở bất kỳ vị trí nào dường như hoạt động tốt trong Python 3.5.1
River

1
@Quackmatic biệt phái @River, điều này hoạt động tốt trong Python 3.5.4: def func(a,b,c,d): print(a,b,c,d)vớiargs = ('fee', 'fi', 'fo'); func(*args, 'fum')
R. Navega

15

Hãy xem phần hướng dẫn Python 4.7.3 và 4.7.4. Nó nói về việc vượt qua các bộ dữ liệu như là đối số.

Tôi cũng sẽ xem xét sử dụng các tham số được đặt tên (và truyền từ điển) thay vì sử dụng một tuple và truyền một chuỗi. Tôi thấy việc sử dụng các đối số vị trí là một thực tiễn xấu khi các vị trí không trực quan hoặc có nhiều tham số.


8

Đây là phương pháp lập trình chức năng. Nó nâng tính năng mở rộng tuple ra khỏi cú pháp đường:

apply_tuple = lambda f, t: f(*t)

Ví dụ sử dụng:

from toolz import * 
from operator import add, eq

apply_tuple = curry(apply_tuple)

thread_last(
    [(1,2), (3,4)],
    (map, apply_tuple(add)),
    list,
    (eq, [3, 7])
)
# Prints 'True'

cà ri redefiniton của apply_tupletiết kiệm rất nhiều partialcuộc gọi trong thời gian dài.


5
Điều này không hữu ích cho người mới bắt đầu. Nó sử dụng các mô-đun của bên thứ ba và thực hiện các công cụ khó hiểu khác ...
gberger

gberger, lambda f, t: f(*t)không sử dụng các mô-đun của bên thứ ba và tôi là người mới bắt đầu Python và điều này rất hữu ích với tôi. Đây là một cách tiếp cận chức năng thuần túy. Nếu bạn không sử dụng phong cách này thì câu trả lời này không dành cho bạn.
Dominykas Mostauskis

1
toolz là bên thứ ba, ý ​​tôi là vậy
gberger

5
Không phải câu trả lời nào cũng phải dành cho người mới bắt đầu
Jordan

1
Đối với ví dụ bạn đã đưa ra, người ta có thể sử dụng starmap docs.python.org/3.7/l Library / itemools.html
Bo.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.