Python Programming: An Introduction to Computer Science
This is an introductory college-level textbook designed to teach the fundamental principles of computer science using Python as the primary programming language. It focuses on problem-solving, design, and programming through a spiral coverage model and a graphics-oriented approach.
Tổng quan khóa học
📚 Tóm tắt nội dung
Đây là một giáo trình đại học cấp độ giới thiệu, được thiết kế để giảng dạy những nguyên lý cơ bản của khoa học máy tính bằng Python như ngôn ngữ lập trình chính. Tài liệu tập trung vào giải quyết vấn đề, thiết kế và lập trình thông qua mô hình phủ sóng xoắn ốc (spiral coverage model) và tiếp cận dựa trên đồ họa.
Một sự giới thiệu nhẹ nhàng và toàn diện về nghệ thuật khoa học máy tính qua lăng kính của Python.
Tác giả: John M. Zelle
Lời cảm ơn: Guido van Rossum (Lời mở đầu), Jim Leisy, và các đồng nghiệp học thuật từ trường Wartburg College cùng nhiều trường đại học khác bao gồm Owen Astrachan, Cay Horstmann, và Nell Dale.
🎯 Mục tiêu học tập
- Phân biệt giữa phần cứng/phần mềm và thuật toán/chương trình.
- Giải thích cách bộ dịch Python chuyển đổi mã cấp cao thành các lệnh thực thi thông qua mã byte.
- Định nghĩa và gọi các hàm Python đơn giản sử dụng tham số và đối số.
- Liệt kê và mô tả sáu giai đoạn trong Quy trình Phát triển Phần mềm.
- Áp dụng các quy tắc cú pháp Python để tạo ra các tên hợp lệ và biểu thức toán học với thứ tự ưu tiên đúng.
- Phân biệt giữa mô hình biến "Hộp" và "Ghi chú dính", và giải thích quá trình đánh giá và gán giá trị.
- Phân biệt các kiểu dữ liệu
intvàfloat, và áp dụng chuyển đổi kiểu dữ liệu rõ ràng. - Triển khai mẫu tích lũy để giải các bài toán toán học như hoán vị.
- Sử dụng thư viện
mathcủa Python để giải các phương trình đại số, bao gồm công thức bậc hai. - Định nghĩa và áp dụng các khái niệm cốt lõi của lập trình hướng đối tượng: đối tượng, phương thức, truy cập (accessors), thay đổi (mutators), và gán tên (aliasing).
🔹 Bài học 1: Giới thiệu về Khoa học Máy tính và Cơ bản Python
Tổng quan: Bài học này giới thiệu khoa học máy tính như là môn nghiên cứu về các quá trình có thể tính toán, chứ không chỉ đơn thuần là nghiên cứu về máy móc vật lý. Sinh viên sẽ khám phá khái niệm "Máy универсальный", nơi phần mềm cung cấp sức mạnh để biến phần cứng thành bất kỳ công cụ nào tưởng tượng được. Buổi học kết thúc bằng phần giới thiệu kỹ thuật về các nền tảng cơ bản của Python, bao gồm việc thực thi dựa trên bộ dịch, định nghĩa hàm, và sự phân biệt giữa cú pháp và ngữ nghĩa.
Kết quả học tập:
- Phân biệt giữa phần cứng/phần mềm và thuật toán/chương trình.
- Giải thích cách bộ dịch Python chuyển đổi mã cấp cao thành các lệnh thực thi thông qua mã byte.
- Định nghĩa và gọi các hàm Python đơn giản sử dụng tham số và đối số.
🔹 Bài học 2: Quy trình Phát triển Phần mềm và Chương trình Đơn giản
Tổng quan: Bài học này giới thiệu phương pháp hệ thống để tạo phần mềm thông qua quy trình phát triển gồm sáu bước, và các khối xây dựng cơ bản của lập trình Python. Sinh viên sẽ tìm hiểu cú pháp cơ bản, bao gồm tên, biểu thức và gán giá trị, trong khi so sánh mô hình biến "Ghi chú dính" với các khái niệm truyền thống. Bài học kết thúc bằng việc triển khai các vòng lặp xác định sử dụng hàm range() để xử lý các tính toán lặp lại.
Kết quả học tập:
- Liệt kê và mô tả sáu giai đoạn trong Quy trình Phát triển Phần mềm.
- Áp dụng các quy tắc cú pháp Python để tạo ra các tên hợp lệ và biểu thức toán học với thứ tự ưu tiên đúng.
- Phân biệt giữa mô hình biến "Hộp" và "Ghi chú dính", và giải thích quá trình đánh giá và gán giá trị.
🔹 Bài học 3: Biểu diễn Dữ liệu Số và Thư viện Toán học
Tổng quan: Bài học này khám phá cách máy tính biểu diễn và thao tác dữ liệu số, phân biệt giữa các số nguyên rời rạc (số nguyên) và các xấp xỉ của số thực (số dấu phẩy động). Sinh viên sẽ học cách thực hiện các tính toán phức tạp bằng các toán tử tích hợp sẵn trong Python và thư viện math, đồng thời hiểu các giới hạn tiềm tàng của biểu diễn nhị phân và độ chính xác.
Kết quả học tập:
- Phân biệt các kiểu dữ liệu
intvàfloat, và áp dụng chuyển đổi kiểu dữ liệu rõ ràng. - Triển khai mẫu tích lũy để giải các bài toán toán học như hoán vị.
- Sử dụng thư viện
mathcủa Python để giải các phương trình đại số, bao gồm công thức bậc hai.
🔹 Bài học 4: Đồ họa Hướng Đối tượng và Giao diện Người dùng Tương tác
Tổng quan: Bài học này chuyển sinh viên từ lập trình dựa trên văn bản sang các Giao diện Người dùng Đồ họa (GUI) bằng cách tiếp cận hướng đối tượng (OO). Sinh viên sẽ học cách thao tác các đối tượng đồ họa (điểm, đường thẳng, hình dạng), quản lý hệ tọa độ, và tạo các chương trình tương tác phản hồi với các thao tác chuột, phím và nhập liệu văn bản.
Kết quả học tập:
- Định nghĩa và áp dụng các khái niệm cốt lõi của OOP: đối tượng, phương thức, truy cập (accessors), thay đổi (mutators), và gán tên (aliasing).
- Xây dựng và hiển thị các đối tượng đồ họa bao gồm Điểm, Đường thẳng, Hình tròn, Hình chữ nhật, Oval và Đa giác.
- Triển khai các phép biến đổi tọa độ và các yếu tố tương tác (chuột/bàn phím/ô nhập liệu) để tạo nên các GUI chức năng.
🔹 Bài học 5: Chuỗi: Chuỗi ký tự, Danh sách và I/O Tập tin
Tổng quan: Bài học này khám phá cách khoa học máy tính biểu diễn và thao tác các chuỗi dữ liệu, tập trung cụ thể vào chuỗi ký tự và danh sách. Sinh viên sẽ học các thao tác chỉ mục và cắt bỏ, sự khác biệt then chốt giữa các đối tượng thay đổi được (mutable) và không thay đổi được (immutable), cũng như cách giao tiếp với dữ liệu bên ngoài thông qua xử lý tập tin. Ngoài ra, bài học còn đề cập đến mã hóa dữ liệu qua Unicode và các nguyên lý nền tảng của mật mã học bằng các bộ mã cơ bản.
Kết quả học tập:
- Thực hiện các thao tác nâng cao trên chuỗi và danh sách bằng chỉ mục, cắt bỏ và các phương thức tích hợp (split, join, upper, lower).
- Thiết kế và triển khai các thuật toán mã hóa/giải mã đơn giản và các bộ mã mật mã học (Caesar và Thay thế).
- Phát triển các chương trình xử lý hàng loạt mở, đọc, xử lý và đóng tập tin dữ liệu bên ngoài.
🔹 Bài học 6: Định nghĩa Hàm và Phạm vi Biến
Tổng quan: Bài học này khám phá hành trình từ viết các tập lệnh đơn lẻ sang tạo các chương trình có cấu trúc bằng cách sử dụng hàm. Nó bao gồm cú pháp để định nghĩa và gọi hàm, cơ chế truyền thông tin thông qua tham số hình thức và tham số thực tế, và cách các hàm giao tiếp kết quả trở lại thông qua giá trị trả về (bao gồm cả giá trị nhiều hơn và đối tượng None). Sinh viên cũng sẽ học về phạm vi biến — cụ thể là sự khác biệt giữa biến cục bộ và biến toàn cục — và cách các hàm có thể thay đổi các tham số thay đổi được để ảnh hưởng đến trạng thái chương trình.
Kết quả học tập:
- Chứng minh cách định nghĩa và gọi hàm để giảm thiểu trùng lặp mã và cải thiện cấu trúc chương trình.
- Phân biệt giữa tham số hình thức và tham số thực tế, và giải thích cách khớp tham số theo vị trí.
- Triển khai các hàm trả về một giá trị duy nhất, nhiều giá trị, hoặc mặc định là đối tượng
None.
🔹 Bài học 7: Cấu trúc Rẽ Nhánh và Xử lý Ngoại lệ
Tổng quan: Bài học này giới thiệu các cấu trúc rẽ nhánh, cho phép chương trình thực hiện các chuỗi lệnh khác nhau dựa trên điều kiện cụ thể. Sinh viên sẽ học cách tạo biểu thức Boolean bằng các toán tử quan hệ, triển khai các quyết định một chiều, hai chiều và đa chiều, và sử dụng lồng ghép để xử lý logic phức tạp. Bài học cũng đề cập đến việc thực thi theo module với biến __name__ và quản lý lỗi kiên cường thông qua xử lý ngoại lệ.
Kết quả học tập:
- Triển khai các cấu trúc rẽ nhánh đơn giản, hai chiều và đa chiều bằng
if,elsevàelif. - Xây dựng và đánh giá biểu thức Boolean sử dụng toán tử quan hệ và thứ tự từ điển cho chuỗi ký tự.
- Áp dụng mẫu
try-exceptđể xử lý lỗi tại thời điểm chạy và ngăn chương trình sập.
🔹 Bài học 8: Vòng lặp Không xác định và Logic Boolean
Tổng quan: Bài học này chuyển từ các vòng lặp "đếm cố định" (definite) sang vòng lặp không xác định, hoạt động dựa trên điều kiện thay vì một dãy cố định. Sinh viên sẽ thành thạo câu lệnh while và các mẫu thiết kế phổ biến để xử lý dữ liệu, bao gồm vòng lặp tương tác, vòng lặp dấu hiệu (sentinel), và mẫu đọc khởi tạo (priming read). Ngoài ra, bài học còn đề cập đến Logic Boolean, cung cấp công cụ đại số cần thiết để xây dựng và đơn giản hóa các cấu trúc ra quyết định phức tạp trong mã nguồn.
Kết quả học tập:
- Thiết kế và triển khai vòng lặp không xác định bằng câu lệnh
whilecủa Python. - Áp dụng các mẫu vòng lặp phổ biến, bao gồm vòng lặp tương tác, vòng lặp dấu hiệu, và mẫu đọc khởi tạo.
- Đơn giản hóa các điều kiện logic phức tạp bằng Đại số Boolean và Luật DeMorgan.
🔹 Bài học 9: Mô phỏng, Thiết kế và Làm mịn từng bước
Tổng quan: Bài học này khám phá quy trình hệ thống để phát triển các chương trình máy tính phức tạp thông qua Thiết kế từ trên xuống và Làm mịn từng bước. Sinh viên sẽ học cách chia nhỏ các vấn đề lớn thành các "mảnh nhỏ" dễ giải quyết bằng cách trừu tượng hóa và phân mảnh, trực quan hóa các cấu trúc chương trình bằng Sơ đồ cấu trúc, và triển khai các mô phỏng sử dụng kỹ thuật Monte Carlo. Nội dung chương trình cũng bao gồm các chiến lược phát triển lặp lại như Phát triển mẫu thử (Prototyping) và Phát triển xoắn ốc (Spiral Development), cùng với các phương pháp kiểm thử vững chắc như Kiểm thử đơn vị (Unit Testing).
Kết quả học tập:
- Phân tách một vấn đề phức tạp thành các vấn đề con nhỏ hơn, khả thi hơn bằng Thiết kế từ trên xuống.
- Xây dựng và diễn giải Sơ đồ cấu trúc thể hiện luồng dữ liệu (tham số và giá trị trả về) giữa các khối.
- Áp dụng kỹ thuật mô phỏng Monte Carlo để mô hình hóa các sự kiện ngẫu nhiên bằng thư viện
randomcủa Python.
🔹 Bài học 10: Định nghĩa Lớp và Lập trình Dựa trên Sự kiện
Tổng quan: Bài học này chuyển từ thiết kế thủ tục, dựa trên hàm sang thiết kế dựa trên đối tượng bằng cách sử dụng lớp Python. Sinh viên sẽ học cách đóng gói dữ liệu (biến thể thể hiện) và hành vi (phương thức) trong một đơn vị duy nhất, tạo các thành phần giao diện người dùng đồ họa (GUI) tương tác, và quản lý luồng chương trình thông qua lập trình dựa trên sự kiện và các vòng lặp hoạt ảnh đồng bộ.
Kết quả học tập:
- Phân biệt giữa thiết kế chương trình dựa trên hàm và thiết kế dựa trên đối tượng.
- Định nghĩa các lớp Python tùy chỉnh bằng các hàm khởi tạo (
__init__), biến thể thể hiện và tham sốself. - Triển khai đóng gói và tài liệu hóa bằng docstrings.
🔹 Bài học 11: Bộ Thu thập Dữ liệu: Danh sách và Từ điển nâng cao
Tổng quan: Bài học này khám phá các kỹ thuật thu thập dữ liệu nâng cao trong Python, tập trung vào tính linh hoạt của danh sách và từ điển. Sinh viên sẽ học cách phân biệt danh sách với mảng truyền thống, thực hiện các thao tác danh sách phức tạp như cắt bỏ và sắp xếp bản ghi, và áp dụng ánh xạ không tuần tự thông qua từ điển. Module kết thúc bằng việc ứng dụng các cấu trúc này vào phân tích thống kê và các thuật toán cổ điển như Sàng Eratosthenes.
Kết quả học tập:
- So sánh danh sách động của Python với mảng cố định, đồng nhất.
- Thực hiện các thao tác danh sách nâng cao bao gồm cắt bỏ, xóa chọn lọc, và sắp xếp tùy chỉnh các bản ghi đối tượng.
- Triển khai các thuật toán thống kê (Trung bình, Trung vị, Độ lệch chuẩn) và thiết kế bảng điều khiển bằng các bộ thu thập.
🔹 Bài học 12: Nguyên tắc Thiết kế Hướng Đối tượng (OOD)
Tổng quan: Bài học này khám phá hành trình chuyển từ thiết kế chức năng từ trên xuống sang Thiết kế Hướng Đối tượng (OOD), một cách tiếp cận lấy dữ liệu làm trung tâm, nơi các hệ thống được mô tả như một tập hợp các "hộp đen" tương tác (đối tượng). Sinh viên sẽ học cách nhận diện các đối tượng và phương thức tiềm năng, triển khai các mô phỏng đa lớp như Racquetball và Poker xúc xắc, và áp dụng ba trụ cột của OOP: Đóng gói, Đa hình và Kế thừa. Bài học kết thúc bằng việc quản lý các tương tác GUI phức tạp thông qua kế thừa lớp và ghi đè phương thức.
Kết quả học tập:
- Nhận diện các lớp và phương thức tiềm năng từ một yêu cầu bài toán bằng cách phân tích danh từ và động từ.
- Triển khai một mô phỏng phức tạp, đa đối tượng sử dụng các lớp có cấu trúc (ví dụ:
Player,Game,Stats). - Phân biệt và áp dụng các khái niệm cốt lõi của đóng gói, đa hình và kế thừa.
🔹 Bài học 13: Thiết kế Thuật toán, Đệ quy và Hiệu suất
Tổng quan: Bài học này khám phá các kỹ thuật cơ bản dùng để giải quyết các vấn đề tính toán một cách hiệu quả. Nó bao gồm các chiến lược tìm kiếm, cơ chế giải bài toán đệ quy (trường hợp cơ sở và bước đệ quy), và so sánh các thuật toán sắp xếp như Sắp xếp lựa chọn và Sắp xếp trộn để hiểu cách thiết kế thuật toán ảnh hưởng đến hiệu suất.
Kết quả học tập:
- So sánh và triển khai các chiến lược Tìm kiếm tuyến tính và Tìm kiếm nhị phân.
- Thiết kế các hàm đệ quy sử dụng trường hợp cơ sở và bước đệ quy cho các bài toán như đảo ngược chuỗi và mũ nhanh.
- Phân tích các lợi thế và bất lợi về hiệu suất giữa đệ quy và lặp lại, và giữa các thuật toán sắp xếp khác nhau (n^2 so với n \log n).