Qua đây, thấy rằng
Python là ngôn ngữ đơn giản (giản lược để đỡ phải gõ code nhiều)
....
Theo các bạn, anh chị thì có nên hay không nên chọn python học như ngôn ngữ lập trình đầu tiên?
Tùy theo bạn học lập trình theo kiểu lý thuyết hay ứng dụng (tôi chỉ dùng từ "lý thuyết" để phân biệt căn bản, không có nghĩa là không ứng dụng được)
Lập trình lý thuyết mới cần mấy cái chặt chẽ.
Ứng dụng thì cứ tiện mà làm. Python là loại này.
Ngày xưa, sức mạnh của một ngôn ngữ tùy thuộc vào cấu trúc. Ngày nay, sức mạnh của một ngôn ngữ ứng dụng tùy thuojc vào đám thư viện mà nó có thể truy cập.
Lúc lập ra Python, bọn thành lập này là dân chuyên Unix và C (lưu ý: không phải C++). Vì vậy họ có cả đống code thư viện C viết sẵn, làm rất nhiều việc. Cộng thêm là code C nếu viết giỏi thì rất tốc độ. Khi chỉ định ngữ pháp và cấu trúc Python thì họ chú trọng thế nào để kết nối các thư viện thật hiệu quả.
Về câu hỏi của bạn: có nên học Python như ngôn ngữ đầu tiên?
Trả lời: thằng cháu nhà tôi chỉ học R và Python. Nó không hề biết các ngôn ngữ khác. Và với cái nó cần làm (thống kê Y Tế Quần Chúng - Population Health Statistics) thì chả cần biết thêm gì nữa. Excel nó chỉ cần biết căn bản. Dữ liệu thiết kế bảng chuẩn, chuyển qua CSV mấy cái phần mềm chuyên thống kê chúng nhai rồn rột. (từ "nhai" dịch ở "crunch", tiếng nghề của IT)
Lưu ý là Python đâu có buộc bạn phải biết OOP. Cũng như VB dot net. Nhiều người viết code ào ào mà căn bản hiểu biết về OOP là con số không.
Lưu ý thứ hai là những lý thuyết bạn học về OOP như tính gói gọn, đa hình,... chỉ là hướng dẫn những điều nên làm thôi. Không phải bắt buộc. Cũng như nhiều người đưa cái bảng tính Excel như hạch lên, mấy bạn chuyên công thức khủng bở đây vẫn giải quyết được như thường.
Tài liệu ghi rõ vậy rồi còn gì.
...
Người ta nói chuyện đổi tên (mắm nêm nấu măng cá linh) là nhìn vào bên trong. Nhiều người như tôi lười nhìn cái mớ debug dump ấy lắm.
Vì vậy tôi giải thích bằng cách dùng luật tiền tố. Nhìn vào cái thiết kế class, thấy cái tên nào có hai gạch ở đầu thì biết nó không thể truy cập trực tiếp. Cực chẳng đã cần truy cập thì qua tiền tố <tên class>. Hết.
Ở đây người ta chọn tiền tố bằng cách thêm một cái string, tức là đổi tên. Nhưng ở ngôn ngữ khác, có thể người ta chọn tiền tố là một class con nào đó và dùng toán tử dấu chấm (.)
-------
Chú thích:
Cái cụm từ "class attribute" đúng ra không khó hiểu lắm. Nhưng vì nó được nêu lên ở đây cho nên gây hiểu lầm. Xin chớ lầm nó với _class__attribute của Python.
class attribute là danh từ chung. Chúng định nghĩa một loại thuộc tính trong class.
_class__attribute là danh từ riêng. Chúng là tên của thuộc tính nào đó trong class.
Cái danh từ riêng không cần phải giải thích thêm. Cái kia thì có lẽ cần giải thích cho các bạn chưa quen thuộc với LTHĐT:
Về tầm nhìn (visibility) thì class có hai loại attributes: private và public (thực ra còn loại protected, nhưng chưa cần biết tới ở đây)
Về phạm vi thực chất (physical scope) khi thiết kế thì class có hai loại attibutes: loại chung cho cả class (class attributes) và loại riêng biệt cho mỗi đối tượng được dựng lên từ class (tiếng nghề gọi là instance).
class attributes được truy cập qua tên class. Và đối với class, chúng in hệt nhau. Bạn sử dụng chúng mà không cần phải dựng đối tượng (*1)
instance attributes được truy cập qua tên dối tượng. Chúng là thuộc tính riêng của đối tượng. Vì chúng liên quan đến đối tượng cho nên hoàn toàn vô nghĩa nếu sử dụng ngoài đối tượng.
Ví dụ tôi có class XeDoVet. Tôi có thể thiết kế các thuộc tính như loại xe, tuyến đường là thuộc tính riêng. Và ga ra chứa xe là thuộc tính chung.
Như vậy: XeDoVet.Gara = "bến An Đông" --> tất cả xe của tôi sẽ chứa ở bến An Đông.
XeMytho = XeDoVet() (dựng đối tượng) ::: XeMytho.Loai = "Toyota" ::: XeMytho.Tuyen = "SG-Mytho" --> đối tượng XeMytho của tôi chiếc Toyota, và nó chuyên chạy chuyến SG-Mytho.
XeBinhduong = XeDoVet() (dựng đối tượng) ::: XeBinhduong.Loai = "Isuzu" ::: XeBinhduong.Tuyen = "SG-Binhduong" --> đối tượng thứ hai, XeBinhduong của tôi là chiếc Isuzu, và nó chuyên chạy chuyến SG-Binhduong.
Nếu bảo in ra XeMytho.Gara hay XeBinhduong.Gara thì vẫn là "bến An Đông". Bởi vì đó là thuộc tính chung. Cả hai xe, cũng như tất cả mọi xe thuộc class XeDoVet đều ga ra ở đó.
Đối với Python, những thuộc tính instance attributes được khai báo bên trong __init__(self...), những thuộc tính class attributes được khai báo bên ngoài __init__
(*1) đặc điểm của class attributes này được được người ta lợi dụng để viết wrapper class, sử dụng một số hàm thư viện. Tôi thêm chỗ này để bạn nào về sau đọc từ "wrapper class" thì biết người ta nói gì.