Bạn có thể sử dụng map
thay vì for
vòng lặp bạn đã thể hiện, nhưng kể từ khi bạn dường như không sử dụng kết quả của item.my_func()
, điều này được không được khuyến khích. map
nên được sử dụng nếu bạn muốn áp dụng một chức năng mà không có tác dụng phụ cho tất cả các yếu tố của danh sách. Trong tất cả các tình huống khác, sử dụng một vòng lặp rõ ràng.
Ngoài ra, như của Python 3.0 map
trả về một máy phát điện, vì vậy trong trường hợp đó map
sẽ không cư xử như nhau (trừ khi bạn đánh giá một cách rõ ràng tất cả các yếu tố được trả về bởi các máy phát điện, ví dụ bằng cách gọi list
vào nó).
Sửa: kibibu hỏi trong các ý kiến làm rõ về việc tại sao map
's đối số đầu tiên không phải là một chức năng với tác dụng phụ. Tôi sẽ trả lời câu hỏi đó một shot:
map
có nghĩa là được chuyển một hàm f
in the mathematical sense. Trong những trường hợp như vậy, không có vấn đề gì trong đó thứ tự f
được áp dụng cho các yếu tố của đối số thứ hai (miễn là chúng là trả lại theo thứ tự ban đầu của chúng, tất nhiên). Quan trọng hơn, trong những trường hợp đó, map(g, map(f, l))
tương đương ngữ nghĩa với map(lambda x: g(f(x)), l)
, bất kể thứ tự trong đó f
và g
được áp dụng cho các đầu vào tương ứng.
Ví dụ: không quan trọng là map
trả về và lặp lại hay danh sách đầy đủ cùng một lúc. Tuy nhiên, nếu f
và/hoặc g
tác dụng phụ gây ra, sau đó tương đương này chỉ được đảm bảo nếu ngữ nghĩa của map(g, map(f, l))
là như vậy mà ở bất kỳ giai đoạn g
được áp dụng cho n yếu tố đầu tiên được trả về bởi map(f, l)
trước map(f, l)
áp dụng f
đến (n + 1) yếu tố st của l
. (Nghĩa là map
phải thực hiện lặp đi lặp lại có thể lười nhất --- mà nó bằng Python 3, nhưng không phải trong Python 2!)
Đi thêm một bước xa hơn: ngay cả nếu chúng ta giả định việc thực hiện Python 3 của map
, sự tương đương ngữ nghĩa có thể dễ dàng bị hỏng nếu đầu ra của map(f, l)
là ví dụ được chuyển qua itertools.tee
trước khi được cung cấp cho cuộc gọi bên ngoài map
.
Thảo luận ở trên có vẻ có tính chất lý thuyết, nhưng khi các chương trình trở nên phức tạp hơn, chúng trở nên khó khăn hơn để giải thích và do đó khó gỡ lỗi hơn. Đảm bảo rằng một số điều là bất biến làm giảm bớt vấn đề đó một chút, và thực tế có thể ngăn chặn toàn bộ một lớp lỗi.
Cuối cùng, map
nhắc nhở nhiều người trong số các đối tác thực sự chức năng của nó bằng các ngôn ngữ khác nhau (thuần túy). Vượt qua nó một "chức năng" với các tác dụng phụ sẽ gây nhầm lẫn cho những người đó. Do đó, việc xem xét thay thế (tức là sử dụng vòng lặp rõ ràng) không khó thực hiện hơn là gọi đến map
, chúng tôi khuyên bạn nên hạn chế sử dụng map
đối với những trường hợp mà chức năng được áp dụng không gây ra tác dụng phụ .
Cảm ơn mọi người! – roder
Tại sao nó không được khuyến cáo? Nó là một điều ngữ nghĩa, hoặc một số loại xử lý phân tán (nơi tác dụng phụ phá vỡ song song)? – kibibu
@kibibu: Tôi đã bắt đầu trả lời câu hỏi của bạn, nhưng kết thúc với quá nhiều văn bản cho trường nhận xét này có chứa. Vì vậy, tôi cập nhật câu trả lời :) Làm thế nào điều này sẽ giúp! (Đối với nhận xét của bạn về xử lý phân tán của iterable: mặc dù * có thể * được trích dẫn như là một đối số bổ sung khi nói về 'map' trong các ngôn ngữ khác, tôi không nghĩ rằng Python (hiện tại) thực hiện bất kỳ tối ưu hóa loại đó.) – Stephan202