Thiết lập Anaconda cho Python 3.7 trên CentOS 7

Giới thiệu

Anaconda Distribution là trình quản lý gói, quản lý môi trường và phân phối Python miễn phí, dễ cài đặt với bộ sưu tập hơn 1000 gói nguồn mở với sự hỗ trợ cộng đồng miễn phí.

Anaconda là độc lập nền tảng, vì vậy chúng ta có thể sử dụng trên Windows, macOS hay Linux.

Trong bài này chúng ta thực hiện nội dung thứ hai là cài đặt Anaconda cho Python 3.7 trên CentOS 7.

Các bước cài đặt Anaconda cho Python 3.7

Bước 1.

Chúng ta thực hiện download Anaconda cho Python 3.7 trên Linux tại website:

Here

Chúng ta chú ý lựa chọn phiên bản dành cho Python 3.7.

Bước 2.

Chúng ta mở chương trình Terminal.

Chúng ta thực hiện kiểm tra mã hóa với chuỗi lệnh:

sha256sum /Documents/Software/Anaconda3-2019.10-Linux-x86_64.sh

Bước 3.

Chúng ta thực hiện cài đặt Anaconda với chuỗi lệnh:

bash ~/Documents/Software/Anaconda3-2019.10-Linux-x86_64.sh

Bước 4.

Trong quá trình cài đặt, hệ thống yêu cầu lựa chọn phím Enter để xem bản quyền.

Bước 5.

Chúng ta liên tục lựa chọn phím Enter để xem bản quyền.

Bước 6.

Sau khi xem hết bản quyền, hệ thống yêu cầu nhập yes để chấp nhận.

Bước 7.

Hệ thống tiếp tục thông báo về thư mục mặc định để cài đặt Anaconda.

Chúng ta lựa chọn phím Enter để chấp nhận thư mục mặc định.

Bước 8.

Hệ thống thực hiện cài đặt Anaconda.

Bước 9.

Trong quá trình cài đặt, hệ thống hỏi có khởi tạo chức năng conda không.

Chúng ta nhập yes để chấp nhận thực hiện.

Bước 10.

Hệ thống hoàn thành cài đặt Anaconda.

Chúng ta nhập chuỗi sau để việc cài đặt có hiệu lực ngay:

source ~/.bashrc

Bước 11.

Chúng ta thực thi chương trình Anaconda Navigator, là giao diện đồ họa điều khiển, với chuỗi lệnh:

anaconda-navigator

Bước 12.

Màn hình giao diện chính của Anaconda Navigator.

Tổng kết

Trong bài này chúng ta đã cùng nhau thực hiện cài đặt Anaconda cho Python 3.7 trên CentOS 7.

Phương pháp sinh – Python

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu một số bài toán cơ bản về phương pháp sinh.

Phương pháp sinh có thể áp dụng để giải bài toán liệt kê tổ hợp.

Hai điều kiện để có thể áp dụng phương pháp sinh:

  • Xác định được một thứ tự trên tập các cấu hình tổ hợp. Từ đó suy ra cấu hình đầu tiên và cấu hình cuối cùng.
  • Xây dựng được thuật toán từ một cấu hình trung gian. Từ đó sinh ra cấu hình kế tiếp.

Những bài toán được tìm hiểu trong bài này:

  • Sinh các dãy nhị phân độ dài n.
  • Liệt kê các tập con k phần tử của tập {1, 2, …, n} theo thứ tự từ điển.
  • Liệt kê các hoán vị của {1, 2, …, n} theo thứ tự từ điển.

Thiết kế chương trình

Bước 1.

Chúng ta tạo một PyDev Project trong Eclipse IDE và đặt tên là PythonAlgorithmGenerationMethod.

Chúng ta tiếp tục tạo package mainclass Main.py cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package algorithmclass GenerationAlgorithm.py.

Chúng ta cũng định nghĩa những phương thức chính để thực hiện các bài toán đặt ra.

Phương thức generateBinarySequences()

Phương thức generateBinarySequences() được đặc tả để sinh một dãy nhị phân độ dài n.

Một dãy nhị phân độ dài n là một dãy x[1…n] trong đó x[i] ∈ {0, 1} (∀i : 1 ≤ i ≤ n).

Ví dụ: Khi n = 3, chúng ta có 8 dãy nhị phân độ dài 3 được liệt kê lần lượt như sau:

{000; 001; 010; 011; 100; 101; 110; 111}

Như vậy dãy đầu tiên sẽ là 00…0 và dãy cuối cùng sẽ là 11…1.

Ý tưởng giải thuật:

  • Xét từ cuối dãy về đầu (xét từ hàng đơn vị lên), tìm số 0 gặp đầu tiên.
  • Nếu thấy thì thay số 0 đó bằng số 1 và đặt tất cả các phần tử phía sau vị trí đó bằng 0.
  • Nếu không thấy thì thì toàn dãy là số 1, đây là cấu hình cuối cùng.

Bước 1 – 2.

Chúng ta định nghĩa một mảng gồm n phần tử.

Chúng ta gán giá trị 0 cho từng phần tử trong mảng.

Bước 3.

Chúng ta thực hiện thuật toán sinh trong vòng lặp while() {}.

Nội dung chính của thuật toán bao gồm các bước từ 3.1 đến 3.4.

Bước 3.1.

Tại từng bước lặp, chúng ta nhận được một dãy nhị phân.

Chúng ta thêm dãy nhị phân này vào danh sách sequences.

Bước 3.2.

Chúng ta duyệt các phần tử từ cuối dãy trở lại.

Bước 3.3.

Chúng ta thực hiện điều chỉnh giá trị của x[i] và những phần tử đứng sau trên dãy.

Bước 3.4.

Thuật toán sinh dừng lại khi đã sinh ra dãy 11…1.

Thử nghiệm

Chúng ta thử nghiệm phương thức generateBinarySequences() trong class Main.py.

Phương thức generateSubSets()

Phương thức generateSubSets() được đặc tả để liệt kê các tập con k phần tử của tập {1, 2, …, n} theo thứ tự từ điển.

Ví dụ: với n = 5, k = 3, chúng ta ta phải liệt kê đủ 10 tập con:

1.{1, 2, 3} 2.{1, 2, 4} 3.{1, 2, 5} 4.{1, 3, 4} 5.{1, 3, 5} 6.{1, 4, 5} 7.{2, 3, 4} 8.{2, 3, 5} 9.{2, 4, 5} 10. {3, 4, 5}

Như vậy tập con đầu tiên là {1, 2, …, k}.

Tập con kết thúc là {n - k + 1, n - k + 2, …, n}.

Ý tưởng giải thuật:

  • Tìm từ cuối dãy lên đầu cho tới khi gặp một phần tử x[i] chưa đạt giới hạn trên n - k + i.
  • Nếu tìm thấy: (i) Tăng x[i] đó lên 1; (ii) Gán tất cả các phần tử sau x[i] bằng giới hạn dưới x[i-1] + 1.
  • Nếu không tìm thấy tức là mọi phần tử đã đạt giới hạn trên, đây là tập con cuối cùng.

Bước 1.

Chúng ta định nghĩa một mảng gồm k phần tử.

Bước 2.

Chúng ta gán giá trị là chỉ số vị trí tương ứng cho từng phần tử trong mảng.

Bước 3.

Chúng ta thực hiện thuật toán sinh trong vòng lặp while() {}.

Nội dung chính của thuật toán bao gồm các bước từ 3.1 đến 3.4.

Bước 3.1.

Tại từng bước lặp, chúng ta nhận được một tập con.

Chúng ta thêm tập con này vào danh sách sequences.

Bước 3.2.

Chúng ta duyệt các phần tử từ cuối dãy trở lại.

Bước 3.3.

Chúng ta thực hiện điều chỉnh giá trị của x[i] và những phần tử đứng sau trên dãy.

Bước 3.4.

Thuật toán sinh dừng lại khi tất cả các phần tử đã đạt giới hạn trên.

Thử nghiệm

Chúng ta thử nghiệm phương thức generateSubSets() trong class Main.py.

Phương thức generatePermutation()

Phương thức generatePermutation() được đặc tả để liệt kê các hoán vị của tập {1, 2, …, n} theo thứ tự từ điển.

Ví dụ với n = 4, ta phải liệt kê đủ 24 hoán vị:

1.1234 2.1243 3.1324 4.1342 5.1423 6.1432 7.2134 8.2143 9.2314 10.2341 11.2413 12.2431 13.3124 14.3142 15.3214 16.3241 17.3412 18.3421 19.4123 20.4132 21.4213 22.4231 23.4312 24.4321

Như vậy hoán vị đầu tiên sẽ là <1, 2, …, n>.

Hoán vị cuối cùng là <n, n-1, …, 1>.

Ý tưởng giải thuật:

  • Xác định đoạn cuối giảm dần dài nhất.
  • Xác định chỉ số i của phần tử x[i] đứng liền trước đoạn cuối đó.
  • Nếu tìm thấy chỉ số i như trên: (i) tìm phần tử x[k] nhỏ nhất thoả mãn điều kiện x[k] > x[i]; (ii) Đảo giá trị x[k]x[i]; (iii) Lật ngược thứ tự đoạn cuối giảm dần (từ x[i+1] đến x[k]) trở thành tăng dần.
  • Nếu không tìm thấy tức là toàn dãy đã sắp giảm dần, đây là cấu hình cuối cùng.

Bước 1.

Chúng ta định nghĩa một mảng gồm n phần tử.

Bước 2.

Chúng ta gán giá trị là chỉ số vị trí tương ứng cho từng phần tử trong mảng.

Bước 3.

Chúng ta thực hiện thuật toán sinh trong vòng lặp while() {}.

Nội dung chính của thuật toán bao gồm các bước từ 3.1 đến 3.4.

Bước 3.1.

Tại từng bước lặp, chúng ta nhận được một hoán vị.

Chúng ta thêm hoán vị này vào danh sách sequences.

Bước 3.2.

Chúng ta duyệt các phần tử từ cuối dãy trở lại.

Bước 3.3.

Chúng ta thực hiện xem xét nếu chưa gặp phải hoán vị cuối.

Việc kiểm tra được thực hiện từ Bước 3.3.1 đến 3.3.3.

Bước 3.3.1.

Chúng ta duyệt các phần tử từ cuối dãy trở lại.

Bước 3.3.2.

Chúng ta lùi dần k.

Bước 3.3.3.

Chúng ta thực hiện đổi chỗ x[k]x[i].

Bước 3.3.4.

Chúng ta điều chỉnh những phần tử sau x[i].

Bước 3.4.

Thuật toán sinh dừng lại khi toàn bộ dãy giảm dần.

Thử nghiệm

Chúng ta thử nghiệm phương thức generatePermutation() trong class Main.py.

Kết luận

Trong nội dung bài này, chúng ta đã cùng tìm hiểu một số bài toán con đối với thuật toán sinh để liệt kê một danh sách theo yêu cầu cho trước.

Hi vọng chúng ta có thể hiểu thêm về tư duy thuật toán cũng như một số các kỹ thuật lập trình Python để áp dụng cho các bài khác.

Thiết kế mô hình 3 lớp kết hợp Kết nối và truy vấn Cơ sở dữ liệu theo phương pháp Prepared Statement – Nội dung 3 – Kỹ thuật lập trình – Phần 2 – Tầng 2 – Python

Giới thiệu

Trong nhóm bài này, chúng ta cùng nhau tìm hiểu việc thiết kế một kiến trúc để lập trình phần mềm theo mô hình 3 lớp.

Những nội dung chính sẽ được trình bày trong nhóm bài:

  • Thiết lập một cơ sở dữ liệu cơ bản trong PostgreSQL để áp dụng trong toàn bộ nhóm bài. Chúng ta có thể tham khảo để tự thực hiện đối với những hệ quản trị cơ sở dữ liệu khác như: MySQL / MariaDB; SQLServer; Oracle; …
  • Thiết kế kiến trúc lập trình phần mềm theo mô hình 3 lớp. Chúng ta cũng sẽ áp dụng một chút kiến thức về lập trình hướng đối tượng ở đây.
  • Kỹ thuật kết nối và truy vấn cơ sở dữ liệu theo phương pháp Prepared Statement. Đây là phương pháp được ưu tiên khuyến khích hơn phương pháp thông thường.
  • Những kỹ thuật lập trình cụ thể sẽ được trình bày lần lượt với các ngôn ngữ: Java / C# / Python / PHP.

Nội dung chính của bài này là trình bày phần thứ hai và tập trung vào Tầng 2 trong nội dung về kỹ thuật lập trình với ngôn ngữ Python:

  • Phần 1. Xây dựng kiến trúc tổng quan của mô hình 3 lớp.
  • Phần 2. Kỹ thuật lập trình cụ thể cho từng tầng trong kiến trúc mô hình 3 lớp.

Class BaseService

Bước 1.

Chúng ta thiết kế lớp cơ sở BaseService như sau:

Bước 2.

Chúng ta đặc tả các phương thức chính trong class BaseService:

Class CategoryService

Chúng ta thiết kế lớp dẫn xuất CategoryService như sau:

Class ProductService

Chúng ta thiết kế lớp dẫn xuất ProductService như sau:

Kết luận

Trong bài này, chúng ta cùng nhau tìm hiểu việc thực hiện kỹ thuật lập trình cho phần thứ hai và tập trung vào Tầng 2.

Chúng ta có thể áp dụng những kiến thức trong nhóm bài để thực hiện một số bài tập:

  • Thêm / xóa / sửa / truy vấn dữ liệu trong bảng categoryproduct theo những yêu cầu thực tế khác nhau.
  • Thay đổi cơ sở dữ liệu PostgreSQL bởi các cơ sở dữ liệu khác: MySQL / MariaDB; Oracle; …

Nhóm bài này sẽ trở thành một trong những kiến thức nền để thực hiện các dạng phần mềm: Desktop / Web Application.

Thiết kế mô hình 3 lớp kết hợp Kết nối và truy vấn Cơ sở dữ liệu theo phương pháp Prepared Statement – Nội dung 3 – Kỹ thuật lập trình – Phần 2 – Tầng 3 – Python

Giới thiệu

Trong nhóm bài này, chúng ta cùng nhau tìm hiểu việc thiết kế một kiến trúc để lập trình phần mềm theo mô hình 3 lớp.

Những nội dung chính sẽ được trình bày trong nhóm bài:

  • Thiết lập một cơ sở dữ liệu cơ bản trong PostgreSQL để áp dụng trong toàn bộ nhóm bài. Chúng ta có thể tham khảo để tự thực hiện đối với những hệ quản trị cơ sở dữ liệu khác như: MySQL / MariaDB; SQLServer; Oracle; …
  • Thiết kế kiến trúc lập trình phần mềm theo mô hình 3 lớp. Chúng ta cũng sẽ áp dụng một chút kiến thức về lập trình hướng đối tượng ở đây.
  • Kỹ thuật kết nối và truy vấn cơ sở dữ liệu theo phương pháp Prepared Statement. Đây là phương pháp được ưu tiên khuyến khích hơn phương pháp thông thường.
  • Những kỹ thuật lập trình cụ thể sẽ được trình bày lần lượt với các ngôn ngữ: Java / C# / Python / PHP.

Nội dung chính của bài này là trình bày phần thứ hai và tập trung vào Tầng 3 trong nội dung về kỹ thuật lập trình với ngôn ngữ Python:

  • Phần 1. Xây dựng kiến trúc tổng quan của mô hình 3 lớp.
  • Phần 2. Kỹ thuật lập trình cụ thể cho từng tầng trong kiến trúc mô hình 3 lớp.

Class BaseDAO – Kiến trúc tổng quan

Bước 1.

Chúng ta thiết kế lớp cơ sở BaseDAO thành abstract class như sau:

Bước 2.

Chúng ta định nghĩa các phương thức chính trong class BaseDAO:

Class BaseDAO – Phương thức getConnection()

Chúng ta đặc tả phương thức getConnection() đối với tác vụ kết nối đến PostgreSQL:

Class BaseDAO – Phương thức selectDataFromOneTable()

Bước 1.

Chúng ta đặc tả phương thức selectDataFromOneTable() đối với tác vụ truy xuất dữ liệu từ một bảng trong PostgreSQL.

Mã nguồn SQL tổng quan để thực hiện truy vấn dữ liệu:

SELECT column_i, …, column_j FROM table [WHERE column_k = value_k AND … AND column_l = value_l]

Chúng ta đặc tả phần thứ nhất của chuỗi SQL như sau:

Bước 2.

Chúng ta đặc tả phần thứ hai của chuỗi SQL như sau:

Kỹ thuật lập trình cần chú ý ở đây:

  • Giá trị của từng trường điều kiện được thể hiện bằng dấu “%s”.
  • Chúng ta sẽ thay thế từng dấu “%s” bằng giá trị tương ứng trong dataSet ở các bước sau.
  • Đây là bước đầu tiên của kỹ thuật Prepared Statement. Kỹ thuật này giúp truy xuất dữ liệu thuận tiện hơn, độc lập cơ sở dữ liệu và phần nào chống được kỹ thuật tấn công SQL Injection.

Bước 3.

Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 4.

Chúng ta định nghĩa một cursor:

Đây là bước thứ hai của kỹ thuật Prepared Statement giúp chuẩn bị thay thế từng dấu “%s” trong chuỗi SQL bởi giá trị tương ứng.

Bước 5.

Chúng ta thực hiện truy vấn dữ liệu.

Chúng ta tiếp tục gọi phương thức mappingData() để thực hiện việc chuyển đổi dữ liệu trong thực thể này về dạng mong muốn và thêm vào results.

Kỹ thuật lập trình cần chú ý ở đây:

  • Chúng ta định nghĩa phương thức mappingData()abstract trong class BaseDAO.
  • Chúng ta đặc tả cụ thể các kỹ thuật lập trình của phương thức mappingData() trong các lớp dẫn xuất là CategoryDAOProductDAO.

Bước 6.

Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class BaseDAO – Phương thức insertData()

Bước 1.

Chúng ta đặc tả phương thức insertData() đối với tác vụ thêm dữ liệu vào một bảng trong PostgreSQL.

Mã nguồn SQL tổng quan để thực hiện thêm dữ liệu:

INSERT INTO table (column_i, …, column_j) VALUE (value_i, …, value_j)

Chúng ta đặc tả phần thứ nhất của chuỗi SQL như sau:

Bước 2.

Chúng ta đặc tả phần thứ hai của chuỗi SQL như sau:

Bước 3.

Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 4.

Chúng ta định nghĩa một thực thể cursor:

Bước 5.

Chúng ta thực hiện thêm dữ liệu:

Bước 6.

Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class BaseDAO – Phương thức updateData()

Bước 1.

Chúng ta đặc tả phương thức updateData() đối với tác vụ cập nhật dữ liệu trong một bảng trong PostgreSQL.

Mã nguồn SQL tổng quan để thực hiện thêm dữ liệu:

UPDATE table SET (column_i = value_i, …, column_j = value_j) [WHERE column_k = value_k AND … AND column_l = value_l]

Chúng ta đặc tả phần thứ nhất của chuỗi SQL như sau:

Bước 2.

Chúng ta đặc tả phần thứ hai của chuỗi SQL như sau:

Bước 3.

Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 4.

Chúng ta định nghĩa một thực thể cursor:

Bước 5.

Chúng ta thực hiện cập nhật dữ liệu:

Bước 6.

Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class BaseDAO – Phương thức deleteData()

Bước 1.

Chúng ta đặc tả phương thức deleteData() đối với tác vụ xóa dữ liệu trong một bảng trong PostgreSQL.

Mã nguồn SQL tổng quan để thực hiện truy vấn dữ liệu:

DELETE FROM table WHERE column_k = value_k AND … AND column_l = value_l

Chúng ta đặc tả chuỗi SQL như sau:

Bước 2.

Chúng ta gọi phương thức getConnection() để thực hiện kỹ thuật kết nối cơ sở dữ liệu:

Bước 3.

Chúng ta định nghĩa một thực thể cursor:

Bước 4.

Chúng ta thực hiện xóa dữ liệu:

Bước 5.

Chúng ta thực hiện đóng kết nối đến cơ sở dữ liệu:

Class CategoryDAO

Chúng ta thiết kế lớp dẫn xuất CategoryDAO như sau:

Class ProductDAO

Chúng ta thiết kế lớp dẫn xuất ProductDAO như sau:

Kết luận

Trong bài này, chúng ta cùng nhau tìm hiểu việc thực hiện kỹ thuật lập trình cho phần thứ hai và tập trung vào Tầng 3.

Trong bài tiếp theo, chúng ta cùng tìm hiểu việc thực hiện kỹ thuật lập trình cho Tầng 2.

Thiết kế mô hình 3 lớp kết hợp Kết nối và truy vấn Cơ sở dữ liệu theo phương pháp Prepared Statement – Nội dung 3 – Kỹ thuật lập trình – Phần 1 – Xây dựng kiến trúc tổng quan – Python

Giới thiệu

Trong nhóm bài này, chúng ta cùng nhau tìm hiểu việc thiết kế một kiến trúc để lập trình phần mềm theo mô hình 3 lớp.

Những nội dung chính sẽ được trình bày trong nhóm bài:

  • Thiết lập một cơ sở dữ liệu cơ bản trong PostgreSQL để áp dụng trong toàn bộ nhóm bài. Chúng ta có thể tham khảo để tự thực hiện đối với những hệ quản trị cơ sở dữ liệu khác như: MySQL / MariaDB; SQLServer; Oracle; …
  • Thiết kế kiến trúc lập trình phần mềm theo mô hình 3 lớp. Chúng ta cũng sẽ áp dụng một chút kiến thức về lập trình hướng đối tượng ở đây.
  • Kỹ thuật kết nối và truy vấn cơ sở dữ liệu theo phương pháp Prepared Statement. Đây là phương pháp được ưu tiên khuyến khích hơn phương pháp thông thường.
  • Những kỹ thuật lập trình cụ thể sẽ được trình bày lần lượt với các ngôn ngữ: Java / C# / Python / PHP.

Nội dung chính của bài này là trình bày phần thứ nhất trong nội dung về kỹ thuật lập trình với ngôn ngữ Python:

  • Phần 1. Xây dựng kiến trúc tổng quan của mô hình 3 lớp.
  • Phần 2. Kỹ thuật lập trình cụ thể cho từng tầng trong kiến trúc mô hình 3 lớp.

Xây dựng kiến trúc tổng quan của mô hình 3 lớp

Bước 1.

Chúng ta tạo mới PyDev Project trong Eclipse IDE và đặt tên là PythonThreeTiersProject.

Chúng ta tạo class Main trong package main.

Chúng ta sẽ thực hiện các kỹ thuật lập trình về đặc tả giao diện Console ở Tầng 1.

Bước 2.

Chúng ta tạo class BaseService trong package service.

Đây là lớp cơ sở của Tầng 2 về xử lý các tác vụ trung gian.

Bước 3.

Chúng ta tạo class CategoryServiceProductService trong package service.

Đây là các lớp dẫn xuất của BaseService để thực thi cụ thể các tác vụ ở Tầng 2.

Bước 4.

Chúng ta tạo class BaseDAO trong package dao.

Đây là lớp cơ sở của Tầng 3 về xử lý các tác vụ kết nối và truy vấn cơ sở dữ liệu.

Bước 5.

Chúng ta tạo class CategoryDAOProductDAO trong package dao.

Đây là các lớp dẫn xuất của BaseDAO để thực thi cụ thể các tác vụ ở Tầng 3.

Thiết lập driver điều khiển để kết nối PostgreSQL

Chúng ta cài đặt thư viện psycopg2 trong Anaconda.

Kết luận

Trong bài này, chúng ta đã cùng nhau tìm hiểu việc xây dựng kiến trúc tổng quan của mô hình 3 lớp cho một PyDev Project.

Trong bài tiếp theo, chúng ta sẽ cùng thực hiện các tác vụ cụ thể.

Kỹ thuật cơ bản để kết nối và truy xuất Cơ sở dữ liệu MySQL – Python

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu kỹ thuật cơ bản trong Python để kết nối và truy vấn Cơ sở dữ liệu MySQL.

Những nội dung chính được trình bày trong bài này:

  • Thiết kế một bảng cơ sở dữ liệu đơn giản gồm một số các trường cơ bản.
  • Cấu hình Hệ quản trị phpMyAdmin để thực hiện việc kết nối và truy xuất được thuận tiện.
  • Kỹ thuật cơ bản trong Python bao gồm việc thêm mới dữ liệu và truy xuất toàn bộ dữ liệu trong bảng.

Thiết kế Cơ sở dữ liệu đơn giản

Chúng ta thiết kế bảng users gồm các trường như sau:

Mã nguồn SQL để thực hiện tạo bảng users trong MySQL:

Chúng ta lưu thành file Create_MySQL.sql.

Cấu hình Hệ quản trị phpMyAdmin

Bước 1.

Chúng ta khởi động LAMP Stack Control Panel.

Chúng ta start service MySQL DatabaseApache Web Server.

Bước 2.

Chúng ta mở giao diện phpMyAdmin trên trình duyệt với địa chỉ:

127.0.0.1:8080/phpmyadmin/

Chúng ta nhập usernamepassword để đăng nhập vào phpMyAdmin.

Ví dụ ở đây là:

Username : root

Password : adminadmin

Bước 3.

Giao diện màn hình chính của phpMyAdmin hiện ra.

Chúng ta nhận thấy địa chỉ chính thức của MySQL: localhost:3306.

Bước 4.

Chúng ta mở tab Databases trong phpMyAdmin.

Chúng ta nhập thông tin tạo database mới trong mục Create database:

firstdb

utf8_unicode_ci

Chúng ta lựa chọn nút Create để tạo database firstdb.

Bước 5.

Giao diện của database firstdb hiện ra.

Bước 6.

Chúng ta mở tab Import trong giao diện của firstdb.

Chúng ta lựa chọn file Create_MySQL.sql đã được tạo ra bên trên.

Chúng ta lựa chọn nút Go để thực hiện Import.

Bước 7.

Giao diện firstdb sau khi đã thực hiện import và tạo mới bảng users:

Bước 8.

Chúng ta lựa chọn bảng users.

Chúng ta lựa chọn tab Structure trong giao diện này:

Bước 9.

Chúng ta thực hiện stop service MySQL Database.

Chúng ta lựa chọn nút Configure để cấu hình các thông số.

Bước 10.

Cửa sổ Configure MySQL Database hiện ra.

Chúng ta nhận thấy Port 3306 của MySQL.

Chúng ta có thể để nguyên hoặc điều chỉnh theo yêu cầu thực tiễn.

Chúng ta lựa chọn nút Open Conf File để mở file cấu hình my.cnf.

Bước 11.

Nội dung file my.cnf hiện ra.

Chúng ta loại bỏ dòng “skip-name-resolve …”.

Chúng ta lưu lại file này.

Bước 12.

Chúng ta thực hiện cài đặt MySQL Connector/Python trong Anaconda.

Kỹ thuật cơ bản để kết nối và truy xuất Cơ sở dữ liệu MySQL

Bước 1.

Chúng ta tạo mới PyDev Project trong Eclipse IDE và đặt tên là PythonFirstDBProject.

Bước 2.

Chúng ta tạo mới module DBConnection trong package connection.

Bước 3.

Chúng ta định nghĩa các thuộc tính trong phương thức khởi tạo trong module DBConnection.

Ý nghĩa các thuộc tính như sau:

  • Thuộc tính dbHostdbPort lưu trữ thông tin về địa chỉ và cổng của MySQL.
  • Thuộc tính dbName lưu trữ thông tin về tên của database. Ở đây chúng ta sử dụng database firstdb.
  • Thuộc tính usernamepassword lưu trữ thông tin về tên đăng nhập và mật khẩu để vào được MySQL.
  • Thuộc tính conn lưu trữ thông tin về kết nối và truy xuất đến cơ sở dữ liệu.

Bước 4.

Chúng ta định nghĩa phương thức đặc tả kết nối đến cơ sở dữ liệu.

Bước 5.

Chúng ta định nghĩa phương thức truy xuất để lấy dữ liệu.

Những kỹ thuật lập trình cần chú ý:

  • Phương thức này có 02 tham số. Tham số sqlQuery lưu trữ câu truy vấn SQLSELECT …”. Tham số results là một cấu trúc Dictionary dùng lưu trữ dữ liệu được trả về: (i) từ_khóa lưu trữ dữ liệu của trường khóa chính id trong bảng users; (ii) giá_trị là một danh sách deque có thứ tự trước sau lưu trữ dữ liệu của những trường còn lại trong bảng users.
  • Bước 1. Chúng ta thực hiện gọi phương thức kết nối: self.getConnection().
  • Bước 2. Chúng ta thực hiện tạo một phát biểu: cursor = self.Conn.cursor().
  • Bước 3. Chúng ta thực hiện truy xuất dữ liệu: cursor.execute(sqlQuery).
  • Bước 4. Chúng ta trả về một resultSet: records = cursor.fetchall().
  • Bước 5. Chúng ta lần lượt truy xuất từng bộ dữ liệu trong resultSet: for row in records.
  • Bước 6. Chúng ta thêm bộ dữ liệu hiện tại vào một phần tử trong resultSet. Chú ý: vị trí tương ứng và kiểu dữ liệu của trường tương ứng trong cơ sở dữ liệu.
  • Bước 7. Chúng ta thực hiện đóng phát biểu và kết nối: cursor.close(); self.Conn.close().

Bước 6.

Chúng ta định nghĩa phương thức thêm mới / chỉnh sửa / xóa bộ dữ liệu.

Bước 7.

Chúng ta thực hiện import những thư viện phù hợp trong module DBConnection để thực hiện định nghĩa các phương thức trên:

Bước 8.

Chúng ta thực hiện tạo thực thể của DBConnection trong module Main.

Bước 9.

Chúng thực hiện thử nghiệm thêm mới bộ dữ liệu.

Bước 10.

Chúng ta kiểm tra trong phpMyAdmin xem bộ dữ liệu mới đã được thêm thành công hay chưa.

Bước 11.

Chúng thực hiện thử nghiệm truy xuất toàn bộ dữ liệu.

Bước 12.

Chúng ta thực thi project để kiểm tra kết quả.

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số kỹ thuật cơ bản để kết nối và truy xuất đến Cơ sở dữ liệu MySQL thực hiện bằng ngôn ngữ Python.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Ước số / bội số – Python

Giới thiệu

Trong nội dung bài này, chúng ta cùng nhau tìm hiểu một số bài toán cơ bản về ước số và bội số:

  • Tìm ước số chung lớn nhất của hai số tự nhiên.
  • Tìm bộ số chung nhỏ nhất của hai số tự nhiên.
  • Phân tích một số tự nhiên thành các thừa số nguyên tố.
  • Tính số lượng các ước số của một số tự nhiên.
  • Tính tổng các ước số của một số tự nhiên.

Ước số chung lớn nhất của hai số

Ý tưởng giải thuật

Ước số chung lớn nhất (USCLN) của 2 số được tính theo thuật toán Euclid:

UCLN (a, b) = UCLN (b, (a mod b))

Bước 1.

Chúng ta tạo một PyDev Project trong Eclipse IDE và đặt tên là PythonAlgorithmSecondProject.

Chúng ta tiếp tục tạo package mainmodule Main.py cùng phương thức main() mặc định.

Bước 2.

Chúng ta tạo package algorithmmodule UocBoi.py.

Bước 3.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Bội số chung nhỏ nhất của hai số

Ý tưởng giải thuật

Bội số chung nhỏ nhất (BSCNN) của hai số được tính theo công thức:

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức tinhUCLN()tinhBCNN() trong module Main.py như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Phân tích thừa số nguyên tố

Ý tưởng giải thuật

Chúng ta thực hiện chia số N cho các số nguyên tố trong đoạn [2; N].

  • Với mỗi số nguyên tố đó, đếm số lần mà số N chia hết.
  • Sau mỗi lần chia cho số i, số N của chúng ta sẽ giảm đi i lần.
  • Chúng ta dừng quá trình chia khi số chia lớn hơn N.

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Những kỹ thuật lập trình cần chú ý:

  • Chúng ta sử dụng kiểu dữ liệu Dictionary của Python để lưu trữ tập hợp không giới hạn các phần tử theo từng cặp <từ_khóa, giá_trị>. Mỗi phần tử là một cặp: từ_khóa là thừa số nguyên tố; giá_trị là số mũ tương ứng với thừa số nguyên tố này.

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức phanTichTSNT() trong module Main.py như sau:

Những kỹ thuật lập trình cần chú ý:

  • Cách thức để duyệt từng phần tử trong Dictionary để lấy ra được cả từ_khóagiá_trị là: for (từ_khóa, $giá_trị in dic.items) {}.

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Số các ước số của một số

Ý tưởng giải thuật

Giả sử N được phân tích thành thừa số nguyên tố như sau:

Số các ước số của N là

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Tổng các ước số của một số

Ý tưởng giải thuật

Tổng các ước của N là

Bước 1.

Chúng ta thực hiện giải thuật bằng ngôn ngữ Python như sau:

Bước 2.

Chúng ta thực hiện thử nghiệm phương thức tinhSoUocSo()tinhTongUocSo() trong module Main.py như sau:

Bước 3.

Chúng ta thực thi toàn bộ project để kiểm tra kết quả thử nghiệm:

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số giải thuật cơ bản xung quanh ước số và bội số của một số tự nhiên và thực hiện bằng ngôn ngữ Python.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Lập trình hướng đối tượng – Phần 3 – Tính chất đa hình (polymorphism), lớp trừu tượng (abstract class) và giao diện (interface) – Python

Giới thiệu

Trong nội dung bài viết này, chúng ta cùng nhau tìm hiểu cách thức mà Java hỗ trợ việc thực hiện những thuật ngữ về Lập trình hướng đối tượng: (i) tính chất trừu tượng – abstraction; (ii) tính chất đa hình – polymorphism; (iii) lớp trừu tượng – abstract class; (iv) giao diện – interface.

Không giống như những ngôn ngữ lập trình khác như Java / C# / PHP, quan điểm của Python là một sự linh động hết sức có thể. Chúng ta có thể tham khảo những đặc trưng của quan điểm Python như sau (https://www.python.org/dev/peps/pep-0020/):

  • Đẹp thì tốt hơn xấu.
  • Rõ ràng là tốt hơn so với ngầm.
  • Đơn giản là tốt hơn phức hợp.
  • Phức hợp tốt hơn phức tạp.
  • Bằng phẳng là tốt hơn so với lồng nhau.
  • Thưa thì tốt hơn dày đặc.
  • Tính dễ đọc.
  • Trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc.
  • Mặc dù thực tế đánh bại sự tinh khiết.
  • Lỗi không bao giờ nên âm thầm vượt qua.
  • Trừ khi im lặng rõ ràng.
  • Trước sự mơ hồ, hãy từ chối sự cám dỗ để đoán.
  • Nên có một – và tốt nhất là chỉ có một cách rõ ràng để làm điều đó.
  • Mặc dù cách đó ban đầu có thể không rõ ràng trừ khi bạn là người Hà Lan.
  • Bây giờ tốt hơn không bao giờ.
  • Mặc dù không bao giờ thường tốt hơn * ngay * bây giờ.
  • Nếu việc thực hiện khó giải thích, đó là một ý tưởng tồi.
  • Nếu việc thực hiện khó giải thích, đó là một ý tưởng tồi.
  • Namespaces là một ý tưởng tuyệt vời – hãy làm nhiều hơn nữa!

Đối với tính chất đa hình cũng vậy, Python xem khái niệm abstract classinterface là như nhau và dưới một sự thể hiện duy nhất là abstract class.

Như vậy chúng ta muốn phân tích và thiết kế một chương trình hướng đối tượng càng thuần túy, thì chúng ta phải phân hoạch các class dựa vào tư duy Lập trình hướng đối tượng.

Chúng ta thiết kế một chương trình nhỏ bao gồm các lớp và giao diện như sau:

  • Lớp trừu tượng: PhuongTienGiaoThong.
  • Các lớp đối tượng ở tầng dưới thứ hai: PhuongTienDuongBo; PhuongTienDuongThuy; PhuongTienDuongKhong.
  • Các lớp đối tượng ở tầng dưới cùng: Oto; XeMay; XeDap; TauThuy; Thuyen; MayBay; KhinhKhiCau; ThuyPhiCo.
  • Giao diện ở cấp cao nhất: HoatDong.
  • Giao diện ở tầng dưới: CoTheChay; CoTheBay; CoTheBoi.

Thiết kế Lớp trừu tượng

Bước 1.

Chúng ta thực hiện tạo PyDev Project trong Eclipse IDE và đặt tên là PythonOOPThirdProject.

Chúng ta thực hiện tạo package mainfile Main.py.

Bước 2.

Chúng ta thực hiện tạo package object.

Chúng ta thực hiện tạo class PhuongTienGiaoThong.

Những điểm cần chú ý:

  • Cách thức để định nghĩa một lớp đối tượng trong Python là kế thừa từ lớp ABC (viết tắt của Abstract Base Class) trong module abc.

Bước 3.

Chúng ta thực hiện tạo class PhuongTienDuongBo là một dẫn xuất của class PhuongTienGiaoThong.

Bước 4.

Chúng ta thực hiện tạo class PhuongTienDuongThuy là một dẫn xuất của class PhuongTienGiaoThong.

Bước 5.

Chúng ta thực hiện tạo class PhuongTienDuongKhong là một dẫn xuất của class PhuongTienGiaoThong.

Thiết kế Lớp đối tượng

Bước 1.

Chúng ta thực hiện tạo class Oto là một dẫn xuất của class PhuongTienDuongBo.

Bước 2.

Chúng ta thực hiện tạo class XeMay là một dẫn xuất của class PhuongTienDuongBo.

Bước 3.

Chúng ta thực hiện tạo class XeDap là một dẫn xuất của class PhuongTienDuongBo.

Bước 4.

Chúng ta thực hiện tạo class Thuyen là một dẫn xuất của class PhuongTienDuongThuy.

Bước 5.

Chúng ta thực hiện tạo class TauThuy là một dẫn xuất của class PhuongTienDuongThuy.

Bước 6.

Chúng ta thực hiện tạo class MayBay là một dẫn xuất của class PhuongTienDuongKhong.

Bước 7.

Chúng ta thực hiện tạo class KhinhKhiCau là một dẫn xuất của class PhuongTienDuongKhong.

Bước 8.

Chúng ta thực hiện tạo class ThuyPhiCo là một dẫn xuất của class PhuongTienGiaoThong.

Thiết kế Giao diện

Bước 1.

Chúng ta thực hiện tạo package action.

Chúng ta thực hiện tạo abstract class CoTheChay đóng vai trò như một interface.

Bước 2.

Chúng ta thực hiện tạo abstract class CoTheBoi đóng vai trò như một interface.

Bước 3.

Chúng ta thực hiện tạo abstract class CoTheBay đóng vai trò như một interface.

Bước 4.

Chúng ta thực hiện tạo abstract class HoatDong đóng vai trò như một interface, là class cơ sở của các class: CoTheChay; CoTheBay; CoTheBoi.

Thiết kế Tính đa hình thứ nhất

Bước 1.

Chúng ta đặc tả những đặc trưng của abstract class PhuongTienGiaoThong:

  • Thuộc tính: soLuongBanhXe; soLuongChoNgoi.
  • Những phương thức get / set.
  • Phương thức trừu tượng: gioiThieu().

Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienGiaoThong trên cây gia phả.

Những điểm cần chú ý:

  • Chúng ta sử dụng decorator @abstractmethod trong module abc để định nghĩa một phương thức trừu tượng.

Bước 2.

Chúng ta đặc tả những đặc trưng của class PhuongTienDuongBo:

  • Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 01 thuộc tính riêng biệt: loaiDongCo.
  • Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức get / set đối với những thuộc tính được đặc tả ở lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thức get / set đối với thuộc tính loaiDongCo.
  • Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienDuongBo trên cây gia phả.

Bước 3.

Chúng ta đặc tả những đặc trưng của class PhuongTienDuongKhong:

  • Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 02 thuộc tính riêng biệt: soLuongCanh; soLuongQuat.
  • Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức get / set đối với những thuộc tính được đặc tả ở lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thức get / set đối với thuộc tính soLuongCanh; soLuongQuat.
  • Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienDuongKhong trên cây gia phả.

Bước 4.

Chúng ta đặc tả những đặc trưng của class PhuongTienDuongThuy:

  • Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 01 thuộc tính riêng biệt: loaiBanhLai.
  • Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức get / set đối với những thuộc tính được đặc tả ở lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thức get / set đối với thuộc tính loaiBanhLai.
  • Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Chú ý rằng những đặc trưng này sẽ được kế thừa lại hoàn toàn từ những lớp dẫn xuất của PhuongTienDuongThuy trên cây gia phả.

Bước 5.

Chúng ta đặc tả những đặc trưng của class Oto:

  • Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở PhuongTienDuongBo.
  • Phương thức. Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 6.

Chúng ta đặc tả những đặc trưng của class XeMay:

  • Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở PhuongTienDuongBo.
  • Phương thức. Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 7.

Chúng ta đặc tả những đặc trưng của class XeDap:

  • Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở PhuongTienDuongBo.
  • Phương thức. Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 8.

Chúng ta đặc tả những đặc trưng của class MayBay:

  • Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở PhuongTienDuongKhong.
  • Phương thức. Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 9.

Chúng ta đặc tả những đặc trưng của class KhinhKhiCau:

  • Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở PhuongTienDuongKhong.
  • Phương thức. Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 10.

Chúng ta đặc tả những đặc trưng của class TauThuy:

  • Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở PhuongTienDuongThuy.
  • Phương thức. Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 11.

Chúng ta đặc tả những đặc trưng của class Thuyen:

  • Thuộc tính. Kế thừa trọn vẹn những thuộc tính từ lớp cơ sở PhuongTienDuongThuy.
  • Phương thức. Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 12.

Chúng ta đặc tả những đặc trưng của class ThuyPhiCo:

  • Thuộc tính. Đầu tiên là kế thừa những thuộc tính từ lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa thêm 02 thuộc tính riêng biệt: loaiBanhLai; soLuongCanh.
  • Phương thức. Đầu tiên là kế thừa trọn vẹn những phương thức get / set đối với những thuộc tính được đặc tả ở lớp cơ sở PhuongTienGiaoThong. Tiếp đến là định nghĩa các phương thức get / set đối với thuộc tính loaiBanhLai; soLuongCanh.
  • Kế thừa và đặc tả lại phương thức gioiThieu(). Đây là một phương thức được sử dụng trong ví dụ về tính chất đa hình.

Bước 13.

Chúng ta thực hiện thử nghiệm tính đa hình như bên dưới.

Chúng ta có thể nhận thấy những điểm rất rõ ở đây là:

  • Thực thể của đối tượng nào thì sẽ tự biết mình là ai.
  • Và như vậy sẽ tự thực hiện một cách chính xác phương thức gioiThieu() cũng như các phương thức get / set của các thuộc tính được đặc tả trong lớp trừu tượng PhuongTienGiaoThong.

Bước 14.

Kết quả thực hiện thử nghiệm đa hình thứ nhất như sau:

Thiết kế Tính đa hình thứ hai

Bước 1.

Chúng ta định nghĩa phương thức trừu tượng thongBao() trong class cơ sở HoatDong.

Bước 2.

Chúng ta định nghĩa class CoTheChay kế thừa từ class HoatDong:

  • Kế thừa việc định nghĩa các phương thức trừu tượng từ class HoatDong.
  • Định nghĩa phương thức trừu tượng riêng biệt: chay().

Bước 3.

Chúng ta định nghĩa class CoTheBoi kế thừa từ class HoatDong:

  • Kế thừa việc định nghĩa các phương thức trừu tượng từ class HoatDong.
  • Định nghĩa phương thức trừu tượng riêng biệt: boi().

Bước 4.

Chúng ta định nghĩa class CoTheBay kế thừa từ class HoatDong:

  • Kế thừa việc định nghĩa các phương thức trừu tượng từ class HoatDong.
  • Định nghĩa phương thức trừu tượng riêng biệt: bay().

Bước 5.

Chúng ta điều chỉnh class PhuongTienDuongBo để thuộc phạm vi ảnh hưởng của class CoTheChay:

Bước 6.

Chúng ta điều chỉnh class PhuongTienDuongThuy để thuộc phạm vi ảnh hưởng của class CoTheBoi:

Bước 7.

Chúng ta điều chỉnh class PhuongTienDuongKhong để thuộc phạm vi ảnh hưởng của class CoTheBay:

Bước 8.

Chúng ta điều chỉnh class ThuyPhiCo để thuộc phạm vi ảnh hưởng của class CoTheChayCoTheBoi.

Bước 9.

Chúng ta điều chỉnh class Oto:

Bước 10.

Chúng ta điều chỉnh class XeMay:

Bước 11.

Chúng ta điều chỉnh class XeDap:

Bước 12.

Chúng ta điều chỉnh class MayBay:

Bước 13.

Chúng ta điều chỉnh class KhinhKhiCau:

Bước 14.

Chúng ta điều chỉnh class TauThuy:

Bước 15.

Chúng ta điều chỉnh class Thuyen:

Bước 16.

Chúng ta điều chỉnh lại ví dụ về tính đa hình như bên dưới.

Chúng ta cần kiểm tra một chút để biết thực thể của đối tượng nào bằng cách sử dụng từ khóa isinstance.

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu sự hỗ trợ của Python trong việc thực hiện tính chất đa hình trong Lập trình hướng đối tượng.

Hi vọng với bài này thì chúng ta đã có cái nhìn tổng quát hơn về cả 04 tính chất đặc trưng nhất của Lập trình hướng đối tượng.

Học kỹ thuật lập trình Python cơ bản qua các ví dụ – Phần 2 – Xây dựng phương thức và Debug trong Eclipse IDE

Giới thiệu

Tiếp theo nội dung của bài trước, trong bài này chúng ta cùng nhau tìm hiểu một số kỹ thuật lập trình cơ bản trong Python đồng thời tìm hiểu một số chức năng cần thiết trong Eclipse IDE.

Chúng ta thực hiện tiếp Yêu cầu 2 và Yêu cầu 3 của bài toán cơ bản thông qua những kỹ thuật về lập trình:

  • Kỹ thuật vòng lặp for kiểu mới.
  • Câu lệnh điều khiển và rẽ nhánh.
  • Các toán tử cơ bản.
  • Định nghĩa và thực thi các phương thức.

Chúng ta cũng tìm hiểu phương pháp debug trong Eclipse IDE để kiểm tra từng câu lệnh cũng như bắt lỗi.

Những kỹ thuật được trình bày sẽ mang tính phổ quát và độc lập ngôn ngữ lập trình. Điều đó có nghĩa rằng chúng ta có thể áp dụng ý tưởng từ các kỹ thuật này khi tìm hiểu các ngôn ngữ khác như PHP / C# / Java.

Xây dựng phương thức trong Python

Một phương thức trong Python là một khối các câu lệnh có tên và có thể được thực thi bằng cách gọi từ một nơi khác trong chương trình.

Cấu trúc cú pháp của một phương thức như sau:

def tên_phương_thức (danh_sách_tham_số) :
  // Thực hiện công việc

Chúng ta có hai dạng phương thức chính:

  • Dạng phương thức không trả về kết quả.
  • Dạng phương thức có trả về kết quả.

Xây dựng phương thức không trả về kết quả

Bước 1.

Chúng ta thực hiện việc tạo một PyDev Project mới trong Eclipse IDE.

Chúng ta tiếp tục thực hiện việc tạo package mainmodule Main.py.

Màn hình giao diện Eclipse IDE hiển thị nội dung của module Main.py hiện ra.

Bước 2.

Chúng ta thực hiện việc tạo package baitapmodule class BaiCoBan.py.

Nội dung về packagemodule class sẽ được thảo luận sâu hơn trong các bài tiếp theo về lập trình hướng đối tượng.

Ở đây chúng ta chỉ cần chú ý tạo theo hướng dẫn, trong đó tên của packagemodule class có thể đặt theo mục đích riêng.

Chúng ta tiếp tục tạo phương thức:

def tinhTong(self):

Những điểm đáng chú ý ở đây:

  • Phương thức trong Python không có quy định kiểu dữ liệu trả về cũng như phạm vi được truy xuất tương tự như trong Java / C#.
  • Chúng ta sẽ tự quyết định về việc có dữ liệu trả về hay không đối với từng phương thức.
  • Tham số self là một từ khóa mặc định, cho biết đây là phương thức bên trong một class. Điều này giúp phân biệt cách thức gọi đến đối với một phương thức bên ngoài class.

Bước 3.

Nội dung đầu tiên bên trong phương thức tinhTong() như sau:

Bước 4.

Nội dung thứ hai bên trong phương thức tinhTong() như sau:

Bước 5.

Nội dung thứ ba bên trong phương thức tinhTong() như sau:

Ở đây chúng ta có một số điểm cần chú ý:

  1. Thứ nhất, kỹ thuật lặp for mới.

Cú pháp cho kỹ thuật lặp for mới như sau:

for phần_tử in danh_sách :
  // Thực hiện công việc

Ý nghĩa của cú pháp trên: hệ thống tự động truy xuất lần lượt từng phần tử trong danh_sách và gán giá trị cho phần_tử.

  1. Thứ hai, câu lệnh điều kiện và rẽ nhánh.

Câu lệnh điều kiện if có cấu trúc cú pháp như sau:

if (điều_kiện_1) :
  // Thực thi công việc nếu điều_kiện_1 là đúng
elif (điều_kiện_2) :
  // Thực thi công việc nếu điều_kiện_2 là đúng
else :
  // Thực thi công việc nếu cả điều_kiện_1 và điều_kiện_2 đều sai

Chú ý rằng tùy trường hợp chúng ta mới cần đến rẽ nhánh elif hoặc else.

  1. Thứ ba, một số toán tử cơ bản.

Chúng ta có thể tham khảo một số toán tử cơ bản trong Python như sau:

  • Toán tử +. Thực hiện phép cộng: x + y.
  • Toán tử . Thực hiện phép trừ: x – y.
  • Toán tử *. Thực hiện phép nhân: x * y.
  • Toán tử /. Thực hiện phép chia: x / y.
  • Toán tử %. Thực hiện phép chia lấy số dư: x % y.

Bước 6.

Nội dung thứ tư bên trong phương thức tinhTong() như sau:

Bước 7.

Chúng ta thực thi phương thức tinhTong() trong module Main.py như sau:

Xây dựng phương thức có trả về kết quả

Bước 1.

Đối với phương thức tinhTong() có trả về kết quả, chúng ta có một số chú ý như sau:

  • Chúng ta có thể cung cấp tham số cho phương thức này. Ở đây chúng ta cung cấp tham số là mảng tapHop để thực hiện việc tính tổng các số tự nhiên.
  • Do là có trả về kết quả nên ở câu lệnh cuối chúng ta sử dụng từ khóa return. Ở đây chúng ta thực hiện return tong.

Bước 2.

Trong phương thức main() của module Main.py, chúng ta thực hiện một số nội dung trước khi thực thi phương thức tinhTongSoChan().

Chúng ta chú ý rằng nên định nghĩa một biến để lưu giá trị được trả về của phương thức tinhTongSoChan().

Bước 3.

Chúng ta thực thi toàn bộ project để thử nghiệm những đoạn mã nguồn Python được xây dựng bên trên:

Thực hiện Debug để kiểm tra các dòng lệnh và bắt lỗi trong Eclipse IDE

Bước 1.

Chúng ta nhấn chuột phải vào cột bên trái dòng lệnh muốn bắt đầu thực hiện debug.

Chúng ta lựa chọn chức năng Add Breakpoint để tạo điểm bắt đầu debug.

Bước 2.

Chúng ta nhận thấy có sự xuất hiện của một chấm nhỏ màu xanh ngay vị trí dòng lệnh này.

Chúng ta nhấn chuột phải vào chấm nhỏ này để tham khảo các chức năng đối với breakpoint.

Bước 3.

Chúng ta chú ý đến nút hình con bọ trên thanh Toolbars và nút mũi tên ngay bên phải.

Chúng ta lựa chọn thực hiện chức năng debug project khi nhấn vào nút mũi tên.

Bước 4.

Màn hình thông báo về việc lựa chọn chuyển sang giao diện debug hiện ra.

Chúng ta lựa chọn nút Switch để chuyển sang giao diện debug.

Bước 5.

Giao diện debug Python của Eclipse IDE hiện ra.

Chúng ta nhận thấy dòng lệnh đầu tiên có đánh dấu chấm nhỏ màu xanh đã được tô đậm màu xanh lá cây.

Các chức năng của project cũng được thực thi và dừng lại tại dòng lệnh này.

Chúng ta có thể nhận thấy các kết quả thực thi trước dòng lệnh này trong phần màn hình Console ở góc bên dưới.

Trong phần màn hình ở góc bên phải, giá trị của các biến được định nghĩa bên trong phương thức đang được debug sẽ được hiển thị. Chú ý rằng chỉ những biến được định nghĩa trước dòng lệnh đang được debug mới được hiển thị.

Bước 6.

Chúng ta có thể nhấn menu Run trên thanh Toolbars để tham khảo các chức năng cơ bản cho tác vụ debug:

  • Chức năng Terminate với cặp phím Ctrl + F2. Chấm dứt tác vụ debug tại thời điểm hiện tại.
  • Chức năng Step Into với phím F5. Thực hiện lần lượt chuyển đến phương thức gặp phải tại dòng lệnh đang được debug.
  • Chức năng Step Over với phím F6. Thực thi dòng lệnh hiện tại và chuyển tiếp đến dòng lệnh tiếp theo bên dưới.
  • Chức năng Run to Line với cặp phím Ctrl + R. Thực thi các dòng lệnh liên tiếp và chuyển đến dòng lệnh đang đặt con trỏ chuột.

Bước 7.

Chúng ta thực hiện chức năng Step Over với phím F6 tại một số dòng lệnh liên tiếp.

Chúng ta thử dừng lại tại dòng lệnh:

tong += phanTu

Chúng ta chú ý phần màn hình Variables ở góc bên phải.

Giá trị của các biến được định nghĩa trước dòng lệnh hiện tại đã được hiển thị chi tiết.

Bước 8.

Chúng ta thử thực hiện chức năng Terminate với cặp phím Ctrl + F2.

Chúng ta nhận thấy tác vụ debug được dừng lại và chỉ còn phần màn hình Console ở góc bên dưới là hiển thị các thông tin cho đến dòng lệnh hiện tại.

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số kỹ thuật lập trình cơ bản trong Python đồng thời tìm hiểu một số chức năng cần thiết trong Eclipse IDE.

Hy vọng rằng chúng ta có thể áp dụng phù hợp những kỹ thuật và chức năng này cho những bài tiếp theo.

Học kỹ thuật lập trình Python cơ bản qua các ví dụ – Phần 1

Giới thiệu

Trong chuỗi các bài học về kỹ thuật lập trình Python cơ bản qua các ví dụ, chúng ta sẽ cùng nhau tìm hiểu những kỹ thuật lập trình cơ bản nhất mà có thể áp dụng ngay để xây dựng các chương trình ứng dụng thực tế.

Những kỹ thuật được trình bày sẽ mang tính phổ quát và độc lập ngôn ngữ lập trình. Điều đó có nghĩa rằng chúng ta có thể áp dụng các kỹ thuật này đối với các ngôn ngữ khác như PHP / Java / C#.

Đề bài

Yêu cầu 1: Thiết lập một tập hợp gồm một số lượng nhất định các số tự nhiên ngẫu nhiên.

Yêu cầu 2: Tính tổng các số chẵn trong tập hợp này.

Yêu cầu 3: Hiển thị các số này và tổng ra màn hình Console.

Phân tích và lập trình Yêu cầu 1

Phân tích

Để thực hiện Yêu cầu 1, chúng ta xem xét một số tác vụ nhỏ sau:

  • Tác vụ 1. Xác định một số lượng cố định.
  • Tác vụ 2. Thiết lập một tập hợp với số lượng phần tử được xác định bên trên.
  • Tác vụ 3. Xác định giá trị số tự nhiên cho từng phần tử.

Như vậy chúng ta sẽ cùng tìm hiểu những kỹ thuật lập trình sau để thực hiện lần lượt các tác vụ trên:

  • Kỹ thuật 1. Các kiểu dữ liệu số nguyên cơ bản trong Python.
  • Kỹ thuật 2. Khai báo biến và gán giá trị.
  • Kỹ thuật 3. Kiểu dữ liệu về tập hợp: mảng.
  • Kỹ thuật 4. Sử dụng thư viện toán học cơ bản trong Python 3.
  • Kỹ thuật 5. Kỹ thuật thực hiện vòng lặp để duyệt các phần tử trong tập hợp.

Lập trình với ngôn ngữ Python

Thực hiện Tác vụ 1 – Xác định một số lượng cố định

Chúng ta có thể thực hiện Tác vụ 1 với chuỗi lệnh sau:

n = 10

Chú ý rằng, khác với những ngôn ngữ khác như Java / C# / PHP, trong Python thì không cần có thêm dấu ; ở cuối mỗi dòng lệnh.

Những điểm cơ bản cần chú ý với chuỗi lệnh trên:

  1. Thứ nhất, kiểu dữ liệu và gán giá trị cho một biến.

Python rất linh động trong việc khai báo biến và gán giá trị.

Chúng ta không cần định nghĩa kiểu dữ liệu mà có thể gán giá trị trực tiếp lên biến. Biến được khai báo sẽ tự động nhận về kiểu dữ liệu tương ứng với giá trị được gán.

Tên của biến có thể bao gồm nhiều ký tự viết liền nhau và nên bắt đầu bằng một ký tự in thường.

Ví dụ với Yêu cầu 1 trong bài này, chúng ta có thể đặt tên biến là n hoặc soPhanTu.

  1. Thứ hai, xác định số lượng.

Chúng ta cũng có thể xác định một cách ngẫu nhiên một số lượng trong phạm vi nào đó.

Chúng ta thực hiện ý tưởng trên với chuỗi lệnh sau:

import random
x = random.randint(0, 10)

Python cung cấp cho chúng ta module random để thực hiện tạo ra ngẫu nhiên một giá trị thuộc kiểu dữ liệu nào đó.

Theo Yêu cầu 1, chúng ta sử dụng phương thức randint() để tạo sinh ngẫu nhiên một số tự nhiên trong phạm vi cho trước.

Thực hiện Tác vụ 2 và Tác vụ 3 – Thiết lập một tập hợp bao gồm các số tự nhiên

Những điểm cần chú ý khi thực hiện Tác vụ 2 và Tác vụ 3:

  1. Thứ nhất, khởi tạo mảng và truy xuất từng phần tử trong mảng.

Mặc định, khác với những ngôn ngữ khác, Python không cung cấp một kiểu dữ liệu mảng thuần túy giống như Java hay C#.

Chúng ta có thể sử dụng kiểu dữ liệu List và truy xuất theo phương pháp tương tự như kiểu dữ liệu mảng trong Java hay C#.

Chúng ta có thể khởi tạo mảng với một số phần tử sẵn có như sau:

tapHop = [15, 10, 2, 4]

Chúng ta truy xuất phần tử bắt đầu từ vị trí 0 đến số_lượng – 1.

Như vậy phần tử tapHop[1] có giá trị là 10.

  1. Thứ hai, gán giá trị cho từng phần tử trong mảng bằng phương pháp tự động với kỹ thuật lặp for.

Cú pháp cơ bản cho việc truy xuất các phần tử trong một mảng một chiều với kỹ thuật lặp for như sau:

for biến in range(số_lượng):
  // thực hiện công việc

Python cung cấp phương thức range() để trả về các số tự nhiên trong khoảng từ 0 đến số_lượng – 1.

Ví dụ với mảng tapHop[] gồm có n phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

for i in range(n):
  tapHop[i] = random.randint(0, 100)

  1. Thứ ba, gán giá trị cho từng phần tử trong mảng bằng phương pháp tự động với kỹ thuật lặp while.

Vòng lặp while là câu lệnh vòng lặp cơ bản.

  • Nó lặp lại một câu lệnh hoặc khối trong khi biểu thức kiểm soát của nó là đúng. Điều kiện có thể là bất kỳ biểu thức Boolean nào.
  • Phần thân của vòng lặp sẽ được thực thi miễn là biểu thức điều kiện là đúng.
  • Khi điều kiện trở thành sai, điều khiển chuyển sang dòng mã tiếp theo ngay sau vòng lặp.

Ví dụ với mảng tapHop[] gồm có n phần tử là các số tự nhiên. Chúng ta thực hiện gán giá trị như sau:

i=1
while i < n:
  tapHop[i] = random.randint(0, 100)
  i=i+1

Tổng kết

Trong bài này, chúng ta đã cùng nhau tìm hiểu một số những kỹ thuật lập trình cơ bản đầu tiên trong ngôn ngữ Python.

Trong những bài tiếp theo, chúng ta sẽ tiếp tục tìm hiểu những kỹ thuật lập trình cơ bản khác để hoàn thành bài toán đặt ra ban đầu.