Tôi thấy những gì có vẻ giống như phần lớn các nhà phát triển Python về StackOverflow chứng thực việc sử dụng các công cụ chức năng ngắn gọn như lambdas, bản đồ, bộ lọc, v.v., trong khi những người khác nói mã của họ rõ ràng và có thể duy trì hơn bằng cách không sử dụng chúng. Sở thích của bạn là gì?
Ngoài ra, nếu bạn là một lập trình viên chức năng khó tính hoặc Hardcore thành OO, bạn sử dụng những thực hành lập trình cụ thể nào khác mà bạn nghĩ là tốt nhất cho phong cách của bạn?
Thực sự cảm ơn ý kiến của bạn!
hỏi ngày 6 tháng 6 năm 2010 lúc 14:09Jun 6, 2010 at 14:09
1
Tôi chủ yếu sử dụng Python bằng cách sử dụng các kiểu theo hướng đối tượng và thủ tục. Python thực sự không đặc biệt phù hợp với lập trình chức năng.
Rất nhiều người nghĩ rằng họ đang viết mã python chức năng bằng cách sử dụng rất nhiều lambda
, map
, filter
và reduce
, nhưng điều này hơi đơn giản. Tính năng đặc trưng của lập trình chức năng là thiếu các tác dụng phụ hoặc trạng thái. Các yếu tố quan trọng của một phong cách chức năng là các hàm thuần túy, thuật toán đệ quy và các hàm hạng nhất.
Dưới đây là những suy nghĩ của tôi về lập trình chức năng và Python:
Các chức năng thuần túy là tuyệt vời. Tôi làm hết sức mình để làm cho các chức năng cấp độ mô-đun của tôi tinh khiết. I do my best to make my module-level functions pure.
- Các chức năng thuần túy có thể được kiểm tra. Vì chúng không phụ thuộc vào trạng thái bên ngoài, chúng dễ kiểm tra hơn nhiều.
- Các chức năng thuần túy có thể hỗ trợ các tối ưu hóa khác, chẳng hạn như ghi nhớ và song song tầm thường.
Lập trình dựa trên lớp có thể là thuần túy. Nếu bạn muốn có một chức năng tương đương với các chức năng thuần túy bằng cách sử dụng các lớp Python [đôi khi nhưng không phải lúc nào cũng là những gì bạn muốn], If you want an equivalent to pure functions using Python classes [which is sometimes but not always what you want],
- Làm cho các trường hợp của bạn bất biến. Cụ thể, điều này chủ yếu có nghĩa là làm cho các phương thức của bạn luôn trả về các phiên bản mới của lớp của bạn thay vì thay đổi hiện tại.
- Sử dụng tiêm phụ thuộc thay vì nhận các công cụ [như mô -đun nhập khẩu] từ phạm vi toàn cầu.
- Điều này có thể không phải lúc nào cũng chính xác là những gì bạn muốn.
Đừng cố tránh trạng thái cùng nhau. Đây không phải là một chiến lược hợp lý trong Python. Ví dụ, sử dụng
some_list.append[foo]
thay vìnew_list = some_list + [foo]
, trước đây là thành ngữ và hiệu quả hơn. . ] This isn't a reasonable strategy in Python. For example, usesome_list.append[foo]
rather thannew_list = some_list + [foo]
, the former of which is more idiomatic and efficient. [Indeed, a ton of the "functional" solutions I see people use in Python are algorithmically suboptimal compared to just-as-simple or simpler solutions that are not functional or are just as functional but don't use the functional-looking tools.]Tìm hiểu các bài học tốt nhất từ lập trình chức năng, ví dụ như trạng thái đột biến là nguy hiểm. Hãy tự hỏi mình, tôi có thực sự muốn thay đổi X này hay tôi muốn một X mới?mutable state is dangerous. Ask yourself, Do I really want to change this X or do I want a new X?
Một nơi thực sự phổ biến này xuất hiện là khi xử lý một danh sách. tôi sẽ dùng
foo = [bar[item.baz[]] for item in foo]
còn hơn là
for index, _ in enumerate[foo]: foo[index] = bar[foo[index].baz[]]
Và những thứ như nó. Điều này tránh các lỗi khó hiểu trong đó cùng một đối tượng danh sách được lưu trữ ở nơi khác và không nên thay đổi. .
Đừng sử dụng
map
và bạn bè vô cớ. Không có gì có chức năng hơn về việc làm điều này. There is nothing more functional about doing this.- ________ 3/________ 4 không có nhiều chức năng hơn so với danh sách toàn diện. Danh sách toàn diện được mượn từ Haskell, một ngôn ngữ chức năng thuần túy.
map
và đặc biệt làfilter
có thể khó hiểu hơn so với việc hiểu danh sách. Tôi sẽ không bao giờ sử dụngmap
hoặcfilter
với Lambda nhưng có thể nếu tôi có một chức năng đã tồn tại; Tôi sử dụngmap
một chút tốt.not more functional than list comprehensions. List comprehensions were borrowed from Haskell, a pure functional language.map
and especiallyfilter
can be harder to understand than a list comprehension. I would never usemap
orfilter
with a lambda but might if I had a function that already existed; I usemap
a decent bit. - Điều tương tự cũng xảy ra với ____ 16/________ 17 so với các biểu thức của máy phát. [Những điều này có phần lười biếng, đó là một điều tuyệt vời mà chúng ta có thể mượn từ thế giới chức năng.]
- Không sử dụng
map
vàfilter
cho các tác dụng phụ. Tôi thấy điều này vớimap
rất nhiều, cả hai đều tạo ra mã khó hiểu, danh sách không cần thiết và quyết định không có chức năng [mặc dù mọi người nghĩ rằng nó phải là domap
.] Chỉ cần sử dụng một vòng lặp. reduce
khó hiểu ngoại trừ các trường hợp rất đơn giản. Python có các vòng lặp và không có tổn thương trong việc sử dụng chúng.
- ________ 3/________ 4 không có nhiều chức năng hơn so với danh sách toàn diện. Danh sách toàn diện được mượn từ Haskell, một ngôn ngữ chức năng thuần túy.
Không sử dụng các thuật toán đệ quy. Đây là một phần của Python lập trình chức năng không hỗ trợ tốt. Cpython [và tôi nghĩ rằng tất cả các trăn khác] không hỗ trợ tối ưu hóa cuộc gọi đuôi. Sử dụng phép lặp thay thế. This is one part of functional programming Python just does not support well. CPython [and I think all other Pythons] do not support tail call optimization. Use iteration instead.
Chỉ sử dụng
lambda
khi bạn đang xác định các chức năng khi đang bay. Các hàm ẩn danh không tốt hơn các hàm được đặt tên, sau này thường mạnh mẽ hơn, có thể duy trì và được ghi lại. Anonymous functions aren't better than named functions, the latter of which are often more robust, maintainable, and documented.
Paulmcg
60.8K15 Huy hiệu vàng90 Huy hiệu bạc128 Huy hiệu đồng15 gold badges90 silver badges128 bronze badges
Đã trả lời ngày 6 tháng 6 năm 2010 lúc 18:32Jun 6, 2010 at 18:32
Mike Grahammike GrahamMike Graham
71.5K14 Huy hiệu vàng98 Huy hiệu bạc129 Huy hiệu đồng14 gold badges98 silver badges129 bronze badges
Tôi sử dụng các tính năng của ngôn ngữ hoàn thành công việc với mã ngắn nhất, sạch nhất có thể. Nếu điều đó có nghĩa là tôi phải trộn cả hai, mà tôi làm khá thường xuyên, thì đó là những gì được thực hiện.
Đã trả lời ngày 6 tháng 6 năm 2010 lúc 14:12Jun 6, 2010 at 14:12
Tôi vừa là một OPOP và lập trình viên chức năng và các phong cách này hoạt động rất tốt với nhau, chủ yếu là vì chúng hoàn toàn trực giao. Có rất nhiều ngôn ngữ định hướng đối tượng, chức năng và Python là một trong số đó.
Vì vậy, về cơ bản, việc phân tách một ứng dụng thành các lớp là rất hữu ích khi thiết kế một hệ thống. Khi bạn thực hiện triển khai thực tế, FP sẽ giúp viết mã chính xác.
Ngoài ra, tôi thấy rất khó chịu khi bạn ngụ ý rằng lập trình chức năng chỉ có nghĩa là "sử dụng các nếp gấp ở mọi nơi". Đó có lẽ là quan niệm sai lầm lớn nhất và tồi tệ nhất về FP. Nhiều điều đã được viết về chủ đề đó, vì vậy tôi sẽ chỉ nói rằng điều tuyệt vời về FP là ý tưởng kết hợp các hàm đơn giản [, chính xác và có thể tái sử dụng] thành chức năng mới, ngày càng phức tạp hơn. Bằng cách đó, khá khó để viết mã "gần như chính xác" - toàn bộ điều này thực hiện chính xác những gì bạn muốn, hoặc nó bị phá vỡ hoàn toàn.
FP trong Python chủ yếu xoay quanh các trình tạo viết và người thân của họ [danh sách toàn diện] và những điều trong mô -đun lambda
4. Bản đồ/bộ lọc/giảm các cuộc gọi rõ ràng chỉ không cần thiết.
Đã trả lời ngày 6 tháng 6 năm 2010 lúc 14:52Jun 6, 2010 at 14:52
Jochen Ritzeljochen RitzelJochen Ritzel
102K30 Huy hiệu vàng196 Huy hiệu bạc193 Huy hiệu Đồng30 gold badges196 silver badges193 bronze badges
1
Python chỉ có các tính năng lập trình chức năng cận biên nên tôi sẽ ngạc nhiên nếu nhiều người sử dụng nó đặc biệt cho điều đó. Ví dụ, không có cách nào để thực hiện thành phần chức năng và lambda
5 của thư viện tiêu chuẩn đã được không phản đối để có lợi cho các vòng lặp rõ ràng.
Ngoài ra, tôi không nghĩ rằng lambda
6 hoặc lambda
7 thường được chứng thực. Ngược lại, thường danh sách toàn diện dường như được ưu tiên.
Đã trả lời ngày 6 tháng 6 năm 2010 lúc 14:17Jun 6, 2010 at 14:17
STHSTHsth
Phim thương hiệu vàng 216K5252 gold badges274 silver badges364 bronze badges
4
Hầu hết các câu trả lời trên StackoverFlow đều ngắn, câu trả lời ngắn gọn và các khía cạnh chức năng của Python làm cho việc viết loại câu trả lời dễ dàng.
Các tính năng oo của Python chỉ đơn giản là không cần thiết trong các câu trả lời 10-20 dòng, vì vậy bạn không thấy chúng ở đây nhiều như vậy.
Đã trả lời ngày 6 tháng 6 năm 2010 lúc 14:49Jun 6, 2010 at 14:49
TSTENNERTSTENNERtstenner
9.84610 Huy hiệu vàng55 Huy hiệu bạc90 Huy hiệu Đồng10 gold badges55 silver badges90 bronze badges
1
Tôi chọn Python khi tôi tham gia một vấn đề ánh xạ tốt cho một giải pháp OO. Python chỉ cung cấp một khả năng hạn chế để lập trình một cách chức năng so với các ngôn ngữ chức năng toàn diện.
Nếu tôi thực sự muốn lập trình chức năng, tôi sử dụng LISP.
Đã trả lời ngày 6 tháng 6 năm 2010 lúc 14:22Jun 6, 2010 at 14:22
LancehlancehLanceH
1.68613 Huy hiệu bạc20 Huy hiệu đồng13 silver badges20 bronze badges
2