Hướng dẫn is python better for functional or object - python tốt hơn cho chức năng hoặc đối tượng

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

Hướng dẫn is python better for functional or object - python tốt hơn cho chức năng hoặc đối tượng

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, filterreduce, 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, use some_list.append(foo) rather than new_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ụng map hoặc filter 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ụng map một chút tốt.not more functional than list comprehensions. List comprehensions were borrowed from Haskell, a pure functional language. map and especially filter can be harder to understand than a list comprehension. I would never use map or filter with a lambda but might if I had a function that already existed; I use map 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 mapfilter cho các tác dụng phụ. Tôi thấy điều này với map 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à do map.) 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.
  • 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.

Hướng dẫn is python better for functional or object - python tốt hơn cho chức năng hoặc đối tượng

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

Hướng dẫn is python better for functional or object - python tốt hơn cho chức năng hoặc đối tượng

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 lambda4. 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à lambda5 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 lambda6 hoặc lambda7 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

Là đối tượng Python hay chức năng?

Python là định hướng đối tượng.Bạn có thể thực hiện lập trình chức năng trong đó.Nó được thiết kế, tuy nhiên, để ưu tiên lập trình dựa trên đối tượng.object-oriented. You can do functional programming in it. It is designed, however, to prioritize object-based programming.

Là lập trình chức năng Python tốt hơn?

Python không phải là một ngôn ngữ lập trình chức năng nghiêm ngặt.Nhưng thật tầm thường để viết Python theo phong cách chức năng.Có ba chức năng cơ bản trên Iterables cho phép chúng tôi viết một chương trình mạnh mẽ theo cách rất tầm thường: bộ lọc, bản đồ và giảm.. But it is trivial to write Python in a functional style. There are three basic functions on iterables that allow us to write a powerful program in a very trivial way: filter, map, and reduce.

Là đối tượng Python

Python được coi là một ngôn ngữ lập trình hướng đối tượng hơn là ngôn ngữ lập trình thủ tục.object-oriented programming language rather than a procedural programming language.

OOP hay lập trình chức năng tốt hơn?

Lập trình chức năng sẽ tốt hơn nếu bạn có một tập hợp cố định và bạn cần thêm các hoạt động cho chúng.Thêm các chức năng thực hiện các tính toán trên các loại dữ liệu hiện có là một ví dụ về điều này.OOP hoạt động tốt khi bạn có một bộ hoạt động cố định trên mọi thứ và bạn cần thêm nhiều thứ hơn.. Adding functions that perform calculations on existing data types is one example of this. OOP works well when you have a fixed set of operations on things, and you need to add more things.