Java dev học Python: tôi cần những khái niệm gì để quấn đầu?


38

Bối cảnh: Tôi đã chạy qua một vài hướng dẫn và viết một số dự án nhỏ. Tất cả đều ổn khi sử dụng Google và StackOverflow .

Vài lần trong vài ngày qua tôi thấy mình băn khoăn "mình đang thiếu gì?" - Tôi cảm thấy rằng tôi vẫn đang suy nghĩ bằng Java khi tôi viết bằng Python.

Câu hỏi này tại StackOverflow có đầy đủ các mẹo về những tài nguyên cần đọc để học Python, nhưng tôi vẫn cảm thấy rằng tôi là một nhà phát triển Java có từ điển (không có ý định chơi chữ) để dịch sang Python.

Điều tôi thực sự muốn làm là tái cấu trúc đầu để có thể viết Python Pythonic thay vì Java ngụy trang thành Python, mà không mất các kỹ năng Java của tôi.

Vì vậy, mấu chốt của câu hỏi của tôi là: một nhà phát triển Java thực sự cần học gì để nghĩ về Pythonic? Điều này bao gồm bất cứ điều gì cần phải được học.

Lưu ý: Tôi đang hỏi về các khái niệm ngôn ngữ, không phải về cú pháp ngôn ngữ.


9
Hãy từ bỏ ý tưởng rằng lập trình được cho là khó khăn.
Công việc

Câu trả lời:


40

Một vài điểm ngoài những điều đã được nói:

  • Python là năng động. Tạo một lớp là một câu lệnh thực thi , cũng như nhập một mô-đun; nó có thể được thực hiện có điều kiện. Một lớp có thể được thay đổi sau khi tạo; điều này cho phép dễ dàng lập trình siêu dữ liệu và AOP.

  • Không có giao diện; quy tắc gõ vịt. Nếu bạn rất cần chúng, có 'các lớp cơ sở trừu tượng (ABC)', nhưng thường thì bạn không bỏ lỡ các giao diện, vì dù sao cũng không có kiểu kiểm tra tĩnh.

  • Mặc dù tất cả mọi thứ là một đối tượng, các chức năng đến trước các đối tượng. Chỉ có các chức năng (và không có lớp) trong một mô-đun là hoàn toàn tốt.

  • Tất cả mọi thứ là một thực thể hạng nhất. Truyền các hàm làm tham số, trả về chúng và gán cho các biến là chuẩn. Ditto cho các lớp học. Phương thức chỉ là chức năng; bạn có thể xử lý một phương thức cá thể như thể nó là một hàm thông thường, truyền nó xung quanh, v.v.

  • Sử dụng các ký tự, bộ, danh sách và bộ dữ liệu tích hợp. Danh sách và dicts là có thể thay đổi, tuples không. Tất cả chúng đều rất hiệu quả và cú pháp cô đọng. Làm quen với việc trả về một số giá trị từ một hàm bằng cách sử dụng bộ dữ liệu (bạn thậm chí không cần dấu ngoặc đơn). Làm quen với việc thay thế hệ thống phân cấp phức tạp của các đối tượng rất đơn giản bằng các bản sao được tạo từ danh sách đơn giản, bộ dữ liệu và ký tự ('hashtables'), nó đơn giản hóa cuộc sống.

  • Python có một chút hỗ trợ FP; tìm hiểu danh sách và sau đó lặp và máy phát điện. Những điều này giúp rất nhiều.

  • Bất kỳ toán tử nào cũng có thể bị quá tải bằng cách xác định các phương thức thích hợp, vì vậy phép cộng hoặc so sánh có thể trả về bất cứ thứ gì bạn muốn. Hãy nhớ điều này làm việc với những thứ như SQLAlchemy.

  • Không có null, chỉ có Không, một đối tượng chính thức. Bạn có thể in Không chỉ đơn giản là tốt, v.v. Không vượt qua nơi mà một trường hợp khác được mong đợi thường có kết quả trong AttributionError, không phải NPE, đôi khi ở xa hơn trong đường ống thực thi.

  • Do tính chất hoàn toàn động của Python, bạn gần như không có kiểm tra tĩnh . Bạn có thể đề cập đến một tên không bao giờ tồn tại trong chương trình của bạn (ví dụ như một lỗi đánh máy) hoặc chỉ được xác định trong một đường dẫn thực thi cụ thể và không có gì nhắc nhở bạn về nó cho đến khi thực thi đánh vào tham chiếu này và NameError được đưa ra. Hãy cẩn thận với phạm vi của các biến của bạn và viết thêm các bài kiểm tra đơn vị.

  • Do tính chất hoàn toàn năng động của Python, các đối tượng hầu như luôn dễ uốn. Thông thường, bạn có thể thêm các trường và phương thức ngay cả vào một thể hiện và do đó vô tình xóa hoặc ghi đè lên trạng thái hoặc tập phương thức của nó. Hãy cẩn thận gán thuộc tính. Điều này cũng cho phép những khả năng thú vị :)

  • Không có hằng số tượng trưng , chỉ có các biến. Kiểm tra xem bạn không vô tình ghi đè lên 'hằng số'. Nếu bạn muốn chắc chắn tích cực rằng bạn không thể ghi đè lên hằng số, hãy sử dụng hàm hoặc thuộc tính (là hàm được ngụy trang).

  • Các luồng của Python tốt cho xử lý ràng buộc I / O, nhưng không bị ràng buộc với CPU. Đừng cố tăng tốc một tác vụ tính toán bằng cách chạy nó trong các luồng song song.


+1 điểm rất tốt. Nitpicking: Nonethường gây ra AttributeError(nhưng không thành vấn đề, bạn thường không cần nó) và bạn có thể (và trong một số trường hợp nên) viết các đối tượng bất biến (ví dụ như thông qua namedtuple).

@danlan: cảm ơn, tôi đã sửa văn bản :) Vâng, bạn có thể tạo các đối tượng bất biến. Nhưng các đối tượng mà bạn thường tạo bằng cách tạo một lớp thông thường và sau đó các thể hiện của nó rất dễ biến đổi, trừ khi bạn thực hiện một số biện pháp đặc biệt. Việc gán cho một thuộc tính cá thể không xác định thường âm thầm định nghĩa nó thay vì gây ra lỗi có thể gây bất ngờ cho một lập trình viên Java.
9000

1
Python (và các ngôn ngữ FP khác) thay thế việc xây dựng mã dài hơn của các khối xây dựng đơn giản hơn với mã xây dựng nhỏ gọn trên các khối xây dựng phức tạp hơn. Hãy nghĩ rằng bộ xử lý RISC vs CISC.
Paul

1
Tôi sẽ thêm bộ vào cấu trúc dữ liệu.
sakisk

2
Hơn 3 năm kể từ khi tôi hỏi câu hỏi này. Tôi phải nói rằng lời khuyên này đã đứng lên rất tốt.
LRE

14

Đọc bài viết này: Python không phải là Java . (Cộng với hầu hết các bài viết khác trong thanh bên đều đáng đọc, mặc dù không liên quan đến Java.) Bài viết đưa ra một số gợi ý tuyệt vời về cách các lập trình viên Java có thể vô tình sử dụng Python (và cách không sử dụng).


6
"XML không phải là câu trả lời." - vượt xa Java v Python ;-)
LRE

3

Tôi đã chuyển từ Java sang Python và một trong những điều hữu ích nhất mà tôi tìm thấy là có thể kiểm tra mã từ trình thông dịch dòng lệnh. Nhập python vào dòng lệnh và chạy mã của bạn từ đó cho đến khi bạn hiểu đúng.

Các khung cũng được định nghĩa ít hơn một chút trong Python. Có 10 giây khung web hoạt động chỉ dành cho người mới bắt đầu. Django ít nhiều thay thế Spring và SQL Alchemy cho Hibernate.


2

Một điều quan trọng là phải hiểu gõ động; khác là các đối tượng là đột biến và công khai. Ít quan trọng hơn, ít nhất là ban đầu, là ràng buộc tên với các biến.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

Ở đây, myjobtitle và giá trị của job.title trỏ đến cùng một đối tượng. Thuộc tính class job.startDate trước tiên được gán một chuỗi, sau đó đến một đối tượng thời gian. Và thông qua tất cả, ví dụ công việc và thậm chí cả lớp có thể được thay đổi linh hoạt.


1

Bạn cũng có thể muốn xem Jython . Nó chỉ có thể hỗ trợ Python 2.5, nhưng chúng tôi thấy nó thực sự mạnh mẽ để có thể nhanh chóng tạo nguyên mẫu với Python và sau đó viết lại trong Java sau nếu cần.

Dựa trên câu trả lời của tôi về Tôi nên nghĩ gì khi chuyển từ Python sang Java? vì câu hỏi đó đã được đóng lại như một bản sao của câu hỏi này!

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.