2012-11-21 29 views
25

Đây là vòng lặp Tôi cố gắng để sử dụng chức năng map trên:Sử dụng bản đồ() chức năng với các đối số từ khóa

volume_ids = [1,2,3,4,5] 
ip = '172.12.13.122' 
for volume_id in volume_ids: 
    my_function(volume_id, ip=ip) 

Có cách nào tôi có thể làm điều này? Nó sẽ là tầm thường nếu nó không cho tham số ip, nhưng tôi không chắc chắn làm thế nào để đối phó với điều đó.

Trả lời

55

Sử dụng functools.partial():

from functools import partial 

mapfunc = partial(my_function, ip=ip) 
map(mapfunc, volume_ids) 

partial() tạo ra một callable mới, mà sẽ áp dụng bất kỳ đối số (bao gồm cả đối số từ khóa) với chức năng bọc ngoài bất cứ điều gì đang được truyền cho rằng callable mới.

+1

rất tuyệt, cảm ơn bạn! –

9

Đây là một cách tiếp cận lambda (không tốt hơn, chỉ khác nhau)

volume_ids = [1,2,3,4,5] 
ip = '172.12.13.122' 
map(lambda ids: my_function(ids, ip), volume_ids); 
+2

partials là nhanh hơn, lambdas hỗ trợ ra khỏi đối số thứ tự –

0

Làm thế nào về điều này?

results = [] 
for volume_id in volume_ids: 
    results.append(my_function(volume_id, ip=ip)) 

Đây là ba dòng mã thay vì một --- ba dòng mã rõ ràng và rõ ràng thay vì nhập một số trình trợ giúp đặc biệt từ mô-đun như vậy. Lập luận này có lẽ là một vấn đề về hương vị, nhưng nó có rất nhiều trọng lượng tùy thuộc vào người bạn nói chuyện với.

+0

Vấn đề là chúng ta muốn tránh vòng lặp – mleger45

+0

Tại sao? Bởi vì nó rõ ràng hơn? Hoặc vì một số quan niệm sai lầm như "cho các vòng chậm trong Python"? –

+0

Có, tôi sẽ nói thực sự là rõ ràng hơn, Python hơn, và chức năng bản đồ có nghĩa là để thực hiện lặp đi lặp lại laziest posible. Bên cạnh đó, chúng ta cần một danh sách trở lại, vì vậy bản đồ sẽ thực hiện tốt hơn cho chúng ta hơn là viết nhiều dòng mã hóa cho vòng lặp – mleger45

4

Điều này có thể được thực hiện dễ dàng với danh sách hiểu.

volume_ids = [1,2,3,4,5] 
ip = '172.12.13.122' 
results = [my_function(i,ip=ip) for i in volume_ids] 
+1

Các đối số cho my_function trong hiểu là ngược. Nó phải là my_function (i, ip = ip) –

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