Tải bản đầy đủ (.doc) (61 trang)

NGHIÊN CỨU NGÔN NGỮ LẬP TRÌNH PYTHON VÀ ỨNG DỤNG PHÂN TÍCH MỘT SỐ CÚ PHÁP ĐƠN GIẢN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (829.55 KB, 61 trang )

NGHIÊN CỨU NGÔN NGỮ LẬP TRÌNH
PYTHON VÀ ỨNG DỤNG PHÂN TÍCH MỘT
SỐ CÚ PHÁP ĐƠN GIẢN
GIỚI THIỆU

Sự ra đời và lịch sử phát triển của công nghệ thông tin luôn gắn liền với khái niệm về lập
trình và ngôn ngữ lập trình. Các ngôn ngữ lập trình phát triển theo thời gian từ các ngôn
ngữ thô sơ cấp thấp như ngôn ngữ máy, assembly cho tới các ngôn ngữ cấp cao hiện nay
như .NET, Java, Python…
Các ngôn ngữ lập trình là những công cụ giúp lập trình viên thực hiện những công việc
theo ý muốn bằng cách ra lệnh cho máy tính thực hiện. Để người lập trình hiểu rõ hơn và
nhờ đó nâng cao khả năng làm việc và giảng dạy, chúng ta cần phải tìm hiểu các nguyên
lý cơ bản của ngôn ngữ lập trình, từ đó có thể dễ dạng tiếp cận một ngôn ngữ mới và biết
được các điểm mạnh yếu của nó khi sử dụng cho các ứng dụng thực tế.
Được sự giảng dạy và hướng dẫn của thầy TS. Nguyễn Tuấn Đăng trong môn “Nguyên
Lý và Phương Pháp Lập Trình”, em đã có thể hiểu rõ được các khái niệm cơ bản này.
Từ đó em đã thử tìm hiểu về một ngôn ngữ mới mà hiện tại google đang sử dụng làm một
trong các ngôn ngữ để phát triển ứng dụng trên nền cloud computing. Đó là ngôn ngữ
python trong đề tài “NGHIÊN CỨU NGÔN NGỮ LẬP TRÌNH PYTHON VÀ ỨNG
DỤNG PHÂN TÍCH MỘT SỐ CÚ PHÁP ĐƠN GIẢN”.
Em rất chân thành cám ơn thầy, TS. Nguyễn Tuấn Đăng đã định hướng và hướng dẫn
em trong suốt môn học và đặc biệt là nhận xét để giới hạn lại nội dung của đề tài này.
TP. HCM, Ngày 22 tháng 02 năm 2012
Đỗ Văn Cang
2
GIỚI THIỆU 2
1. NGÔN NGỮ LẬP TRÌNH 5
1.1. Định nghĩa 5
1.2. Trình biên dịch và thông dịch 6
1.3. Phân tích cú pháp của chương trình 8
(1.3.1. Phân tích từ vựng 8


(1.3.2. Phân tích cú pháp 9
(1.3.3. Phân tích ngữ nghĩa 10
1.4. Cấu trúc chung của một ngôn ngữ lập trình 11
1.5. Ngôn ngữ scripting 13
(1.5.1. Khái niệm ngôn ngữ script 13
(1.5.2. Ưu và khuyết điểm 14
2. NGÔN NGỮ PYTHON 15
2.1. Các đặc điểm tiêu biểu của Python 15
(2.1.1. Giá trị và kiểu 15
(2.1.2. Biến, sự lưu trữ và điều khiển 16
(2.1.3. Liên kết và tầm vực 17
(2.1.4. Thủ tục trừu tượng 18
(2.1.5. Dữ liệu trừu tượng 18
(2.1.6. Trình biên dịch độc lập 18
(2.1.7. Thư viện module 19
2.2. Các kiểu dữ liệu cơ bản 19
(2.2.1. Biến số (numerics) 19
(2.2.2. Biến chuỗi (Strings) 20
(2.2.3. Chuỗi Unicode 21
(2.2.4. Lists (Danh sách) 21
2.3. Các cấu trúc điều khiển 22
(2.3.1. Lệnh if 22
(2.3.2. Lệnh for 22
(2.3.3. Hàm range() 23
(2.3.4. Lệnh break, continue và else trong vòng lặp 23
(2.3.5. Lệnh pass 24
(2.3.6. Định nghĩa hàm 24
2.4. Cấu trúc dữ liệu 27
(2.4.1. Lists ( danh sách) 27
(2.4.2. Lệnh del 29

(2.4.3. Tuples và Sequences 29
(2.4.4. Sets (tập hợp) 30
(2.4.5. Dictionaries (bảng tra) 30
(2.4.6. Các kỹ thuật lặp 31
(2.4.7. Tìm hiểu thêm về điều kiện 32
(2.4.8. So sánh danh sách 32
2.5. Modules 33
(2.5.1. Thực thi module như script 34
(2.5.2. Truy xuất và biên dịch modules 34
(2.5.3. Packages 35
2.6. Lớp 35
(2.6.1. Định nghĩa lớp 35
(2.6.2. Một số nhận xét 37
3
(2.6.3. Kế thừa 38
(2.6.4. Biến private 40
(2.6.5. Cấu trúc trong python 40
(2.6.6. Lớp Exception 41
(2.6.7. Lớp duyệt ( Iterators) 41
(2.6.8. Generators 42
(2.6.9. Generator Expressions 43
2.7. Giới thiệu sơ về một số thư viện chuẩn 43
(2.7.1. Giao tiếp với hệ thống 43
(2.7.2. Ký tự thay thế tập tin 44
(2.7.3. Thông số dòng lệnh 44
(2.7.4. Khớp chuỗi mẫu 44
(2.7.5. Toán học 45
(2.7.6. Tuy cập internet 45
(2.7.7. Ngày và giờ 45
(2.7.8. Nén dữ liệu 46

(2.7.9. Đo hiệu suất 46
(2.7.10. Điều khiển chất lượng 47
(2.7.11. Đa luồng - Multi-threading 47
(2.7.12. Tham chiếu yếu - Weak References 48
(2.7.13. Làm việc với bản ghi dữ liệu nhị phân 49
3. ỨNG DỤNG PHÂN TÍCH MỘT SỐ CÚ PHÁP ĐƠN GIẢN 50
3.1. Phân tích các phép tính cơ bản 50
3.2. Phân tích cú pháp có chọn lọc : ví dụ phân tích file cấu hình DNS 53
3.3. Phân tích và thu thập các địa chỉ trên một trang web 55
3.4. Phân tích câu lệnh SELECT SQL 57
4. KẾT LUẬN 61
Tài liệu tham khảo 61
4
1. NGÔN NGỮ LẬP TRÌNH
1.1. Định nghĩa
Ngôn ngữ lập trình là một hệ thống được ký hiệu hóa để miêu tả những tính toán
(qua máy tính) trong một dạng mà cả con người và máy đều có thể đọc và hiểu
được.
Theo định nghĩa ở trên thì một ngôn ngữ lập trình phải thỏa mãn được hai điều
kiện cơ bản là:
- Nó phải dễ hiểu và dễ sử dụng đối với người lập trình, để con người có
thể dùng nó giải quyết các bài toán khác.
- Nó phải miêu tả một cách đầy đủ và rõ ràng các tiến trình (process), để có
thể chạy được trên các máy tính khác.
Một tập hợp các chỉ thị được biểu thị nhờ ngôn ngữ lập trình để thực hiện các
thao tác máy tính nào đó thông qua một chương trình. Các tên khác của khái
niệm này nếu không bị lầm lẫn là chương trình máy tính hay chương trình điện
toán.
Chữ lập trình dùng để chỉ thao tác của con người nhằm kiến tạo nên các
chương trình máy tính thông qua các ngôn ngữ lập trình. Người ta còn gọi quá

trình lập trình đó là quá trình mã hoá thông tin tự nhiên thành ngôn ngữ máy.
Trong các trường hợp xác định thì chữ lập trình còn được viết là "viết mã" (cho
chương trình máy tính).
Như vậy, theo định nghĩa, mỗi ngôn ngữ lập trình cũng chính là một chương
trình, nhưng có thể được dùng để tạo nên các chương trình khác. Một chương
trình máy tính được viết bằng một ngôn ngữ lập trình thì những chỉ thị (của riêng
ngôn ngữ ấy) góp phần tạo nên chương trình được gọi là mã nguồn của
chương trình ấy.
Thao tác chuyển dạng từ mã nguồn sang thành chuỗi các chỉ thị máy tính được
thực hiện hoàn toàn tương tự như là việc chuyển dịch giữa các ngôn ngữ tự
nhiên của con người. Các thao tác này gọi là biên dịch (hay ngắn gọn hơn là
dịch). Người ta còn phân việc biên dịch làm hai loại tùy theo quá trình dịch xảy
ra trước quá trình thực thi các tính toán hay nó xảy ra cùng lúc với quá trình tính
toán:
- Một phần mềm thông dịch là một phần mềm có khả năng đọc, chuyển
dịch mã nguồn của một ngôn ngữ và ra lệnh cho máy tính tiến hành các
tính toán dựa theo cú pháp của ngôn ngữ.
- Một phần mềm biên dịch hay ngắn gọn hơn trình dịch là phần mềm có
khả năng chuyển dịch mã nguồn của một ngôn ngữ ban đầu sang dạng
mã mới thuộc về ngôn ngữ cấp thấp hơn.
Ngôn ngữ cấp thấp nhất là một chuỗi các chỉ thị máy tính mà có thể được thực
hiện trực tiếp bởi chính máy tính (thông qua các theo tác trên vùng nhớ). Trước
đây, hầu hết các trình dịch cũ thường phải thông dịch từ mã nguồn sang bộ mã
phụ (các tệp có dang *.obj), rồi sau đó, mới biên dịch tiếp sang các tập tin thi
hành. Ngày nay, hầu hết các trình dịch đều có khả năng viên dịch mã nguồn trực
5
tiếp sang thành các tập tin thi hành hay biên dịch sang các dạng mã khác thấp
hơn tuỳ theo yêu cầu của người lập trình.
Điểm khác nhau giữa thông dịch và biên dịch là: Trình thông dịch sẽ dịch từng
câu lệnh một và chương trình đích sẽ không được lưu lại. Còn trình biên dịch sẽ

dịch toàn bộ chương trình, cho ra chương trình đích được lưu lại trong máy tính
rồi mới thực hiện chương trình.
Một chương trình máy tính có thể được thực thi bằng cách tổ hợp của việc biên
dịch và thông dịch.
1.2. Trình biên dịch và thông dịch
Chúng ta hãy tìm hiểu một số khái niệm về việc thực thi các chương trình
được viết bằng ngôn ngữ cấp cao. Như chúng ta đã thấy, ngôn ngữ mà máy tính
có thể hiểu được gọi là ngôn ngữ máy. Những ngôn ngữ này chứa tập các toán
tử cơ bản được thực thi và cài đặt bên trong phần cứng của bộ xử lý. Chúng ta
cũng đã nhìn thấy ngôn ngữ lập trình cấp cao cung cấp một mức độ trừ tượng
độc lập với máy cao hơn ngôn ngữ máy, vì vậy nó thích nghi hơn với tương tác
giữa người và máy. Nhưng điều này cũng chắc rằng có một sự truyển đổi ngầm
định giữa ngôn ngữ lập trình cấp cao và ngôn ngữ máy.
Có hai kiểu chuyển đổi:
Trình thông dịch:
Là một chương trình cài đặt hoặc giả lặp máy ảo sử dụng tập lệnh cơ bản của
ngôn ngữ lập trình như là ngôn ngữ máy của nó. Có thể hình dung, một trình
thông dịch như một chương trình cài đặt thư viện có chứa việc thực hiện các
lệnh cơ bản của ngôn ngữ lập trình sang ngôn ngữ máy.
Một trình thông dịch đọc những câu lệnh, phân tích và thực hiện chúng trên máy
ảo bằng cách gọi các lệnh tương ứng của thư viện.
Trình biên dịch:
Là một chương trình chuyển đổi mã của ngôn ngư lập trình sang mã máy, cũng
được gọi là mã đối tượng. Mã đối tượng có thể được thực hiện trực tiếp trên
máy mà nó biên dịch.
Hình bên dưới so sánh cách sử dụng của trình thông dịch và biên dịch
6
Hình 1.1. so sánh trình thông dịch và trình biên dịch
Vì vậy trình biên dịch phân định rõ ràng giữa việc chuyển đổi và việc thực thi một
chương trình, nó ngược lại với trình thông dịch là chỉ chuyển đổi một lần duy

nhất.
Mã đối tượng phụ thuộc vào máy có nghĩa là chương trình chỉ có thể chạy trên
máy mà nó biên dịch, trong khi đó chương trình thông dịch thì không phụ thuộc
vào máy việc phụ thuộc vào máy là do bản thân trình thông dịch.
Hình dưới minh họa một khái niệm khác của việc thực thi chương trình kết hợp
điểm mạnh của trình thông dịch và trình biên dịch với nhau. Ví dụ, khái niệm này
được sử dụng bởi ngôn ngữ lập trình Java và rõ ràng hơn là Python.
Hình 1.2. Việc thực thi byte code đã được biên dịch
Trong trường hợp này, mã nguồn được chuyển đổi bởi một trình biên dịch sang
một dạng mã đối tượng, còn được gọi là byte code sau đó được thực thi bởi một
trình thông dịch chạy một máy ảo bằng cách sử dụng byte code này. Việc thực
7
thi các byte code nhanh hơn so với thông dịch mã nguồn, vì phần lớn của các
phân tích và xác minh của các mã nguồn được thực hiện trong bước biên dịch.
Tuy nhiên, byte code vẫn độc lập với máy vì phần phụ thuộc vào máy nằm bên
trong máy ảo.
1.3. Phân tích cú pháp của chương trình
Mỗi ngôn ngữ lập trình khác nhau sẽ có những nguyên tắc về cú pháp khác
nhau. Tuy nhiên, dù bằng ngôn ngữ nào đi nữa thì cũng cần phải có một chương
trình làm nhiệm vụ dịch ngôn ngữ này ra ngôn ngữ máy. Chương trình này gọi
chung là chương trình dịch (biên dịch hoặc thông dịch). Như vậy việc thực hiện
dịch này xảy ra như thế nào ?
Quá trình này có thể được phát thảo sơ lượt như sau:
Chúng ta sẽ phân tích về 3 bước chính quá trình trên gồm: phân tích từ vựng, cú
pháp và ngữ nghĩa. Riêng phần phát sinh mã trung gian ( vd như IL trong
.NET ) , mã đích và tối ưu không đề cập trong phần này.
(1.3.1. Phân tích từ vựng
Các công việc mà trình dịch thực hiện phân tích từ vựng:
- Đọc luồng kí tự của chương trình nguồn.
- Nhóm các kí tự thành các câu (vị từ, mệnh đề) có nghĩa.

- Với mỗi câu bộ phân tích từ vựng:
8
o Tạo token tương ứng và gửi cho bộ phận phân tích cú pháp
 Token là một chuỗi gồm một hay nhiều kí tự
 Token là nguyên tố : không thể phân tách nhỏ hơn.
 Ví dụ : định danh (count), từ khóa (if), toán tử (==), hằng số
(123.4), vv…
o Lưu thông tin vào bảng định danh
- Loại trừ các khoảng trắng ( tab,blank,comment,….).
- Kiểm tra lỗi từ vựng.
Ví dụ lệnh gán sau đây:
totalminutes= minute + hour*60
Sẽ được tách thành các token sau đây
- định danh “totalminutes”
- kí hiệu gán “=”
- định danh “minute”
- toán tử “+”
- định danh “hour”
- toán tử “*”
- hằng số “60”
Bảng định danh
1 totalminutes
2 minute
3 hour

(1.3.2. Phân tích cú pháp
Giai đoạn phân tích cú pháp thực hiện công việc nhóm các token của chương
trình nguồn thành văn phạm của ngôn ngữ lập trình mà sau đó sẽ được trình
dịch tổng hợp ra thành sản phẩm.
Văn phạm ngôn ngữ lập trình

<exp> ::= <exp> +<exp> | <exp> *<exp> | ( <exp> )
| a | b | c
Một biểu thức có thể là tổng của của 2 biểu thức, hoặc tích của 2 biểu thức, hoặc
một biểu thức trong cặp ngoặc đơn…
Hoặc có thể là một trong các biến a,b hay c.
Để xác định cú pháp của một ngôn ngữ, người ta dung văn phạm phi ngữ cảnh
CFG( Context Free Grammar) hay còn gọi là văn phạm BNF (Brackers Naur
Form).
Gọi văn phạm phi ngữ cảnh với G = (S,N,T,P), với:
- N : tập các kí hiệu không kết thúc.
- S : Ký hiệu bắt đầu của văn phạm, là N nhưng sử dụng làm gốc của cây.
9
- T : tập các kí hiệu kết thúc.
- P : tập các luật sinh có dạng A  B với A thuộc N và B thuộc N hoặc T.
Ví dụ:
1. <assign>  id = <expr>
2. <expr>  <expr> + <term> | <term>
3. <term>  <term> * <fact> | <fact>
4. <fact>  id | num
(1.3.3. Phân tích ngữ nghĩa
Sử dụng cây cú pháp trừu tượng và bảng định danh để kiểm tra “ngữ nghĩa”.
- Biến sử dụng đã được khao báo hay chưa ?
Tập hợp các thông tin, lưu trữ lên cây cú pháp và/hoặc bảng định danh.
Tiến hành kiểm tra kiểu (type checking):
- Toán tử có phù hợp với toán hạng.
- Chỉ số mảng phải là kiểu số nguyên ?
- Kiểu của toán hạng bên trái và bên phải có cùng kiểu ?
- …
Thực hiện chuyển kiểu (coercion)
10

1.4. Cấu trúc chung của một ngôn ngữ lập trình
Dưới đây là liệt kê một số khái niệm bên trong một ngôn ngữ lập trình nhằm
mục đích tìm hiểu chúng trong ngôn ngữ cụ thể python ở phần sau:
 Giá trị và kiểu
 Kiểu nguyên thủy
 Kiểu cấu trúc và kiểu đệ quy
 Kiểu hệ thống
 Biểu thức
 Biến, sự lưu trữ và và điều khiển
 Biến đơn
 Biến cấu trúc
 Sao chép và tham chiếu
 Chu kì tồn tại
 Local
 Global
 Biến head
 Lưu trữ biến
 Con trỏ
 Con trỏ của kiểu đệ quy
 Con trỏ mồ côi
11
 Lệnh
 Skip
 Lệnh Gán
 Gọi thủ tục
 Lệnh tuần tự
 Chuỗi lệnh không thứ tự
 Lệnh điều kiện
 Lệnh duyệt (tương tác-lặp)
 Liên kết và tầm vực

 Liên kết và môi trường : liến kết định danh và giá trị.
 Tầm vực :Tầm vực của khai báo là phạm vi mà khai báo đó có tác dụng.
Trong các ngôn ngữ hiện đại tầm vực phụ thuộc vào cấu trúc ngữ nghĩa
của chương trình, đặc biệt là trong khối mã.
 Khai báo
 Khai báo kiểu
 Khai báo hằng
 Khai báo biến
 Định nghĩa thủ tục
 Khai báo không thứ tự
 Khai báo tuần tự
 Khai báo đệ quy
 Khối mã
 Thủ tục trừu tượng
 Thủ tục hàm và thủ tục
 Tham số và đối số
 Cơ chế sao chép tham số
• vào
• ra
• vào và ra
 Cơ thế tham chiếu
 Dữ liệu trừu tượng
 Program units, packages, and encapsulation
 Unit : một thành phần độc lập trong chương trình.
 packages
 encapsulation
 Kiểu trừu tượng
 Đối tượng và lớp
 Lớp
 Lớp con và kế thừa

 Lớp trừu tượng
 Đơn kế thừa và đa kế thừa
 Giao diện – interface
 Trừu tượng hóa tổng quát
 Đơn vị xử lý tổng quát
 Tham số lớp và kiểu
12
 Kiểu hệ thống
 Luồng điều khiển
 Điều khiển tuần tự
 Lệnh nhảy
 Lệnh thoát
 Ngoại lệ ( exception)
 Xử lý truy xuất đồng thời
 Các vấn đề với xử lý đồng thời
 Tương tác các tiến trình
 Các xử lý đồng thời chính
 Điều khiển xử lý đồng thời trừu tượng
1.5. Ngôn ngữ scripting
(1.5.1. Khái niệm ngôn ngữ script
Ngôn ngữ lập trình script là một ngôn ngữ lập trình cấp cao được thông dịch bởi
một chương trình khác ( trình thông dịch) lúc thực thi hơn là lúc biên dịch bởi bộ
xử lý của máy tính như những ngôn ngữ lập trình khác( như C và C++).
Trong hầu hết các trường hợp, việc viết mã trong một ngôn ngữ script thì dễ
dàng hơn là viết mã của ngôn ngữ biên dịch. Tuy nhiên, ngôn ngữ script chậm
hơn bởi vì các lệnh cơ bản không được xử lý hoàn toàn bởi các câu lệnh của bộ
xử lý. Ngôn ngữ kịch bản cho phép phát triển nhanh chóng và có thể giao tiếp dễ
dàng với các chương trình được viết bằng ngôn ngữ khác.
Ngôn ngữ kịch bản có thể được sử dụng để tạo giao diện đặc thù.
Scripting là một mô hình đặc trưng bởi:

• Sử dụng các kịch bản để kết nối các hệ thống với nhau;
• Phát triển ứng dụng một cách nhanh chóng;
• Yêu cầu tính hiệu quả không cao;
• Chức năng rất cao cấp trong các lĩnh vực ứng dụng cụ thể.
Một hệ thống phần mềm thường gồm một tập các hệ thống con được điều khiển
hoặc kết nối bằng scripting. Trong trường hợp đó kịch bản được gọi là gắn các
hệ thống con lại với nhau.
Scripting tương tự với lập trình mệnh lệnh trong nhiều khía cạnh. Vì vậy tất cả
các ngôn ngữ scripting đều có hỗ trợ các biến, lệnh, và thủ tục, đó là các khái
niệm chính về lập trình điều khiển.
Ngôn ngữ scripting rất đa dạng vì vậy mà rất khó để xác định những khái niệm
mà chúng chia sẽ với nhau, nhưng không chia sẽ với ngôn ngữ lập trình điều
khiển.
Tuy nhiên, các khái niệm sau đây là đặc trưng của ngôn ngữ scripting:
• Xử lý chuỗi rất ở mức độ cao;
13
• Hỗ trợ đồ họa ở mức độ cao;
• Kiểu động.
Tất cả các ngôn ngữ scripting cung cấp hỗ trợ rất cao cấp về xử lý chuỗi. Bằng
chứng là có mặt khắp nơi của các dữ liệu văn bản, chẳng hạn như e-mail, truy
vấn cơ sở dữ liệu và kết quả, các tài liệu XML, và các văn bản HTML. Việc phát
sinh ra văn bản thì khá dễ dàng, ngay cả với chuỗi thao tác đơn giản, nhưng
phân tích cú pháp của văn bản (tức là khám phá cấu trúc bên trong của nó) thì
khá rắc rối.
(1.5.2. Ưu và khuyết điểm
Ưu điểm:
Dễ học và sử dụng
Yêu cầu kiến thức và kinh nghiệm về lập trình ít nhất
Cho phép các công việc phức tạp được thực hiện chỉ với một vài bước.
Cho phép tạo và chỉnh sửa nhiều kiểu biên soạn dữ liệu văn bản

Cho phép bổ sung động và tương tác các hành động vào trang web.
Chỉnh sửa và chạy code nhanh chóng.
Khuyết điểm:
Tốc độ thực thi chậm hơn so với các ngôn ngữ biên dịch
Độ bảo mật mà nguồn thấp (nhất là trong trường hợp sử dụng như các ngôn
ngữ javascript, vbscript trên web).
14
2. NGÔN NGỮ PYTHON
Python được thiết kế vào đầu những năm 1990 bởi Guido van Rossum.Nó đã
được sử dụng cài đặt trang web tìm kiếm GOOGLE thành công, và trong một
loạt các lĩnh vực ứng dụng khác nhau, từ khoa học viễn tưởng (hiệu ứng hình
ảnh cho chuỗi the Star Wars) đối với khoa học thực tế (máy tính hỗ trợ thiết kế
trong NASA).
Python vay mượn ý tưởng từ các ngôn ngữ như như PERL, Haskell, và các
ngôn ngữ hướng đối tượng, khéo léo tích hợp những ý tưởng này thành một bộ
mạch lạc. Script Python ngắn gọn nhưng có thể đọc được, và rất biểu cảm.
Python một ngôn ngữ nhỏ gọn, dựa trên thư viện của mình để cung cấp hầu hết
chức năng rất cao cấp như so khớp chuỗi (không giống như các ngôn ngữ kịch
bản cũ hơn như PERL, mà các tính năng này được tích hợp bện trong – build-
in). Python có kiểu tự động, do đó các script chứa rất ít hoặc không có thông tin
về kiểu dữ liệu.
Python là ngôn ngữ lập trình mạnh mẽ và rất dễ học. Nó có cấu trúc dữ liệu rất
đơn giản nhưng hiệu quả để lập trình hướng đối tượng. Cú pháp tao nhã , kiểu
dữ liệu động, cùng với tính thông dịch tự nhiên nó đã trở thành một ngôn
ngữ lý tưởng cho script và phát triển ứng dụng nhanh chóng trong nhiều lĩnh
vực trên hầu hết các flatforms.
Trình thông dịch Python có thể dễ dàng mở rộng với các chức năng và kiểu dự
liệu mới được cài đặt trong C hoặc C++ ( hoặc các ngôn ngữ gọi từ C). Python
cũng thích hợp như một ngôn ngữ mở rộng cho các ứng dụng tùy biến.
Python có thể được chạy ở chế độ thông dịch và chế độ thông dịch tương tác.

Chúng ta sẽ tìm hiểu các đoạn code nhỏ qua chế độ tương tác sử dụng IDLE
(Python GUI).
2.1. Các đặc điểm tiêu biểu của Python
Python là một ngôn ngữ scripting, với cơ chế dịch hyrid pha trộn giữa biên dịch
và thông dịch đã được đề cập trong phần đầu.
Sử dụng comment với kí tự # trên một dòng.
Sử dụng các khoảng trắng hay thụt vô ( thụt ra ) để phân biệt tầm vực code
(scope).
Dưới đây là các đặc điểm về khái niệm của python khác biệt so với các ngôn
ngữ lập trình khác.
(2.1.1. Giá trị và kiểu
 Kiểu nguyên thủy
Python có một danh mục giới hạn các kiểu dữ liệu nguyên thủy: số nguyên, số
thực sự, và số phức. Nó không chứa kiểu kí tự mà thay vào đó là kiểu chuỗi một
kí tự.
Giá trị boolean của nó (False và True) chỉ là số nguyên small. Tuy nhiên, bất cứ
giá trị nào có thể được kiểm tra: zero, bộ rỗng, chuỗi rỗng, danh sách rỗng sẽ
15
được xem như là False, các giá trị còn lại là True.
 Kiểu cấu trúc và kiểu đệ quy
Python có một danh mục các loại kiểu phức tạp như: bộ (tuples), chuỗi(strings),
danh sách(list),bảng tra(dictionary), và các đối tượng(objects).
- Danh sách trong python là một chuỗi gồm các giá trị không đồng
nhất(kiểu khác nhau).
- Một bảng tra là một bảng map không đồng nhất từ khóa (key) đến các
giá trị(value), trong đó khóa không thể thay đổi giá trị.
- Thành phần của bộ, chuỗi, danh sách, và bảng tra có thể được duyệt, và
các thành phần của danh sách và từ điển có thể được cập nhật. Ngoài ra,
các thành phần danh sách và từ điển có thể được chèn và xóa.
Python có kiểu động. Giá trị của bất kỳ biến, tham số, hoặc các thành phần có

thể là bất cứ kiểu dữ liệu nào. Tất cả các toán tử thực hiện được kiểm tra lúc
chạy runtime.
 Kiểu cấu trúc
Kiểu cấu trúc là kiểu tương tự như struct trong C hoặc record trong pascal. Trong
python kiểu cấu trúc được sử dụng như một lớp với khai báo rỗng. Các thành
phần được sử dụng lúc khởi tạo giá trị cho các thành phần của cấu trúc.
 Biểu thức
Danh mục các biểu thức bao gồm các cuộc gọi thủ tục, hàm khởi tạo (đối với
bộ, danh sách, từ điển, các đối tượng, và thủ tục), và biểu thức tương tác (danh
sách
comprehensions). Đáng ngạc nhiên hơn, nó không có biểu thức điều kiện.
Đoạn mã dưới đây minh họa hàm khởi tạo cho bộ:
date = 1998, "Nov", 19
sau khi khởi tạo giá trị date[0] là 1998, date[1] là “Nov”, và date[2] là 19.
Đoạn mã dưới đây minh họa tạo 2 list, một list có giá trị cùng kiểu dữ liệu và 1
list không đồng nhất giá trị.
primes = [2, 3, 5, 7, 11]
years = ["unknown", 1314, 1707, date[0]]
primes[0] = 2, years[1] = 1314, years[3] = 1998
thêm lệnh years[0] = 843 để cập nhật thành phần đầu tiên của years(“unknown”),
và tương tự years.append(1999( để bổ sung 1999 vào cuối years ( sau 1998)
(2.1.2. Biến, sự lưu trữ và điều khiển
Python hỗ trợ các kiểu biến local và global. Các biến không cần khai báo tường
minh, nó đơn giản được khai báo và khởi tạo cùng lúc trong lần gán đầu tiên.
16
Thậm chí sau khi khởi tạo, nó có thể được nó có thể được gán bất cứ giá trị nào
của kiểu dữ liệu nào. Đó cũng là đặc điểm của kiểu dữ liệu động.
Python sử dụng ngữ nghĩa tham chiếu. Điều này đặc biệt quan trọng đối với
thay đổi giá trị, mà có thể được cập nhật có chọn lọc.
 Giá trị nguyên thủy và chuỗi không thể thay đổi.

 Lists, dictionaries, và đối tượng có thể thay đổi được.
 Tuples có thể thay đổi nếu có của các thành phần của chúng thay đổi.
Trong thực tế ngữ nghĩa tham chiếu hoàn toàn tương tự như sao chép đối với
các giá trị không thể thay đổi. Vì vậy các thao tác tên số và chuỗi vẫn hoạt động
như chúng ta mong đợi.
Về phần lệnh, python bao gồm hầu như đầy đủ và rất mạnh các lệnh gán, gọi thủ
tục, điều kiện, tương tác và ngoại lệ.
Python cũng chứa các lệnh điều khiển như lệnh gán, các lời gọi thủ tục, điều
kiện ( if) , tương tác ( while, for), và lệnh bắt lỗi.
Lệnh gán tương tự như C, bao gồm kiểu gán như “V ⊗=E” (viết tắt của ‘‘ V = V
⊗ E ’’) trong đó ⊗ là toán tử thực hiện. Tuy nhiên Python khác với C là không
cho sử dụng lệnh gán như một biểu thức.
Python cũng hỗ trợ gán đồng thời ví dụ:
y, m, d = date
Sẽ gán 3 thành phần của bộ date (trong ví dụ ở trên) tới 3 biến riêng biệt.
Tương tự lệnh
m,n=n,m
Sẽ hoán vị giá trị vủa 2 biến m và n.
Python cũng hỗ break, continue, và lệnh return trong hàm. Nó cũng hỗ trợ cớ
chế bắt lỗi, đó là đối tượng của lớp con của Exception, và có thể mang giá trị.
(2.1.3. Liên kết và tầm vực
Tất cả các biến (định danh) được liên kết và khởi tạo trong lệnh gán đầu tiên khi
thực thi. Các biến này sẽ bị hủy khi thoát khỏi tầm vực của khối mã hiện hành.
Các khối mã (code block) được thể hiện trong mã bằng cách sử dụng các
khoảng trắng hay thụt vào (thụt ra).
Một chương trình Python bao gồm một số modules, có thể được nhóm lại thành
packages. Bên trong một module chúng ta có thể khởi tạo biến, định nghĩa thủ
tục và khai báo lớp. Bên trong thủ tục, chúng ta có thể khởi tạo các biến nội bộ
và định nghĩa các thủ tục nội bộ. Bên trong một lớp chúng ta có thể khởi tạo biến
thành phần, và định nghĩa các thủ tục (phương thức bên trong lớp).

Suốt một phiên làm việc của Python, chúng ta có thể tương tác khai báo, tạo
lệnh và biểu thức từ bàn phím. Tất cả các hành động này sẽ tác dụng ngay lập
tức.
17
Bất cứ khi nào chúng ta đưa ra một biểu thức, giá trị của nó được hiển thị trên
màn hình. Chúng ta có thể sử dụng module theo tên(hoặc các thành phần của
module) bất cứ lúc nào.
(2.1.4. Thủ tục trừu tượng
Python hỗ trợ cả hàm và thủ tục, chỉ có một sự khác nhau là hàm trả về giá trị
còn thủ tục trả về nothing.
Python có kiểu dữ liệu động,do đó định nghĩa thủ tục và các tham số chỉ là định
nghĩa tên chứ không định nghĩa kiểu dữ liệu. Các tham số có kiểu dữ liệu khác
nhau tùy thuộc vào lúc gọi thủ tục.
Python cũng hỗ trợ cơ chế tham chiếu đối số. Vì vậy, một đối số thay đổi có thể
được cập nhật có chọn lọc
(2.1.5. Dữ liệu trừu tượng
Python có ba cấu trúc khác nhau liên quan đến dữ liệu trừu tượng: packages,
module, và lớp. Module và lớp hỗ trợ tính đóng gói, sử dụng quy ước đặt tên
quy ước để phân biệt giữa các thành phần public và private.
Package chỉ đơn giản là một nhóm các module. Một module là một nhóm của
các thành phần có thể là biến, thủ tục, và lớp. Các thành phần này (hoặc 1 tập
con chỉ định của chúng) có thể được import để sử dụng bởi bất kỳ module nào
khác. Tất cả các thành phần của một module là public, trừ những thành phần có
định danh bắt đầu với "_" là private.
Một lớp là một nhóm của các thành phần có thể là các biến lớp, phương thức
lớp,
và phương thức thể hiện. Một thủ tục được định nghĩa trong lớp là một phương
thể hiện với tham số đầu tiên của nó được đặt tên là self để trỏ đến một đối
tượng của lớp đang khai báo. Nếu không, thủ tục hoạt động như một phương
thức lớp.

Để tạo phương thức khởi dựng cho lớp chúng ta thường khai báo phương thức
có tên "__init__", phương thức này được tự động gọi khi một đối tượng của lớp
học được tạo ra. Tất cả các thành phần của một lớp học mặc định đều là public,
ngoại trừ định danh bắt đầu với "__", đó là private.
Python hỡ trợ lập trình hướng đối tượng nhưng ở mức chưa hoàn hảo.
Python cũng hỗ trợ đa kế thừa.
(2.1.6. Trình biên dịch độc lập
Các module được biên dịch độc lập. Mỗi module phải import tường minh tất cả
các modules khác mà nó phụ thuộc.
Mã nguồn của mỗi module được chứa trong 1 file text. Ví dụ ,một module có tên
là widget được chứa trong một file có tên là widget.py. Khi module được import
lần đầu tiên nó sẽ được biên dịch và mã đối tượng của nó được chứa trong một
file tên là widget.pyc. Lần import sau đó nó sẽ không cần phải biên dịch mà lấy
trực tiếp từ file đã được biên dịch kia. Nó chỉ biên dịch lại khi mã nguồn có sự
thay đổi.
18
Trình biên dịch python không kiểm tra định danh chưa được khai báo, và cũng
không kiểm tra kiễu dữ liệu : bởi vì nó là ngôn ngữ có kiểu động.
(2.1.7. Thư viện module
Python được trang bị với một hệ thống thư viện module rất phong phú, hỗ trợ xử
lý chuỗi, đánh dấu, toán học, mã hóa, đa phương tiện, giao diện đồ họa , dịch vụ
hệ điều hành, dịch vụ Internet, trình biên dịch, và nhiều hơn nữa.
Không giống như các ngôn ngữ kịch bản trước đây, Python không có xây dựng
sẳn các xử lý chuỗi cấp cao hoặc hỗ trợ giao diện đồ họa. Thay vào đó, các thư
viện module sẽ cung cấp. Chẳng hạn chức năng. Ví dụ, các module thư viện re
cung cấp xử lý chuỗi mạnh mẽ bằng cách sử sụng regular expressions.
phù hợp với các cơ sở sử dụng các biểu thức thông thường.
2.2. Các kiểu dữ liệu cơ bản
(2.2.1. Biến số (numerics)
Các toán tử toán học trong python hoàn toàn tương tự như các ngôn ngư lập

trình cơ bản khác ( Pascal. C ) như +,-,* và / trong đó dấu ( ) sử dụng để nhóm.
>>> 2+2 # and a comment on the same line as code
4
>>> (50-5*6)/4
5
Có thể gán giá trị biến đồng thời
>>> x = y = z = 0 # Zero x, y and z
>>> x
0
>>> a,b = 10, 100
>>> a
10
>>> b
100
Số phức
Cấu tạo số phức bao gồm 2 phần : phần thực (real) và phần ảo (imag)
>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5
Phần ảo được thể hiện với hậu tố j hoặc J, với dạng như sau (real + imagj) hoặc
có thể được tạo với hàm complex(real,imag).
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3

19
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
ở mode tương tác, giá trị kết xuất cuối cùng được gán vào biến
(2.2.2. Biến chuỗi (Strings)
Chuỗi được bao quoanh bởi các dấu nháy đơn ‘ hoặc nháy kép “” như trong các
ngôn ngữ lập trình khác.
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
Khi thể hiện chuỗi dài trong code muốn xuống dòng thì sử dụng kí tự gạnh chéo
ngược \
hello = "This is a rather long string containing\n\
Note that whitespace at the beginning of the line is\
significant."
print hello
kết quả
This is a rather long string containing
Note that whitespace at the beginning of the line is significant.
Hoặc đặt chúng vào bộ 3 dấu nháy đơn hoặc kép
print """
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
"""
Sử dụng kí tự r trước chuỗi để biểu diễn dữ liệu nguyên thuỷ của chuỗi bao gồm

cái kí tự đặc biệt như /n xuống dòng sẽ được hiểu là \n chứ không phải xuống
dòng.
Các chuỗi có thể được nối với nhau bởi dấu + ( ghép với các chuỗi khác) và dấu
* (nhân chuỗi lên số lần)
>>> word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word*5 + '>'
'<HelpAHelpAHelpAHelpAHelpA>'
Một chuỗi có thể hiểu được cấu tạo như một danh sách do đó cách tuy xuất vào
các phần tử của nó cũng tương tự danh sách mà chúng ta sẽ tìm hiểu chi tiết ở
phần sau. Tuy nhiên nó khác với danh sách là các phần tử của chuỗi chỉ được
truy xuất chứ không thể thay đổi được.
20
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[0] = 'x'
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object does not support item assignment
(2.2.3. Chuỗi Unicode
Để có thể sử dụng định dạng kí tự trong mã nguồn , sử dụng định nghĩa sau
trong file
# -*- coding: encoding -*-
Ví dụ
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
Chuỗi Unicode được tạo bằng cách gắn thêm kí tự u ngay trước chuỗi

>>> u'Hello World !'
u'Hello World !'
(2.2.4. Lists (Danh sách)
Danh sách chứa tất cả các phần tử của nhiều kiểu dữ liệu khác nhau, được định
nghĩa bởi dấu bao [ ] và dấu , để phân chia các phần tử
>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]
Phần tử trong danh sách bắt đầu từ vị trí 0 , có thể được cắt lát, ghép nối …
Vị trí của nó sẽ đi từ 0 và đến kích thước danh sách, nó có thể được xem như
nối giữa vị trí đầu và ví trí cuối thành vòng để có thể sử dụng giá trị index âm
+ + + + + +
| H | e | l | p | A |
+ + + + + +
0 1 2 3 4 5
-5 -4 -3 -2 -1
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
Giá trị phần tử của danh sách có thể được thay đổi
>>> a[2] = a[2] + 23
>>> a
21
['spam', 'eggs', 123, 1234]
Bao gồm thao tác cho một danh sách con hoặc xóa hết danh sách

>>> # Replace some items:
a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Remove some:
a[0:2] = []
>>> a
[123, 1234]
>>> # Insert some:
a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Insert (a copy of) itself at the beginning
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # Clear the list: replace all items with an empty list
>>> a[:] = []
>>> a
[]
Ngoài ra danh sách còn chứa một số hàm xử lý bên trong , do danh sách được
hiểu như một lớp mà chúng ta sẽ tìm hiểu ở phần sau.
2.3. Các cấu trúc điều khiển
Các lệnh điều khiển thể hiện mã code bên trong bằng cách sử dụng kí tự : ngay
sau câu lệnh.
(2.3.1. Lệnh if
>>> x = int(raw_input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
x = 0

print 'Negative changed to zero'
elif x == 0:
print 'Zero'
else:
print 'More'
More
(2.3.2. Lệnh for
Lệnh for trong Python khác với Pascal hoặc C là sử dụng chỉ mục và số bước để
duyệt qua một tập. Python chỉ đơn thuần duyệt toàn bộ tập một cách tuần tự
>>> # Measure some strings:
a = ['cat', 'window', 'defenestrate']
>>> for x in a:
print x, len(x)

cat 3
window 6
22
defenestrate 12
Việc thay đổi phần tử trong tập là không an toàn, do đó để thay đổi chúng ta cần
phải làm một copy của chúng
>>> for x in a[:]: # make a slice copy of the entire list
if len(x) > 6: a.insert(0, x)

>>> a
['defenestrate', 'cat', 'window', 'defenestrate']
(2.3.3. Hàm range()
Hàm range sẽ tạo một tập theo định nghĩa cho trước
range (begin [,end] [,step] )
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(-10, -100, -30)
[-10, -40, -70]
Bạn có thể duyệt tập hợp theo chỉ mục bằng cách sử dụng for và range như sau
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
print i, a[i]
(2.3.4. Lệnh break, continue và else trong vòng lặp
Các lệnh break và continue tương tự các ngôn ngữ khác như C, chúng ta xét về
else trong vòng lặp
Else trong vòng lặp thể hiện lần xử lý khi tập đã được duyệt hết trong với for và
khi điều kiện false với while. Nó không thực hiện khi có lệnh break.
>>> for n in range(2, 10):
for x in range(2, n):
if n % x == 0:
print n, 'equals', x, '*', n/x
break
else:
# loop fell through without finding a factor
print n, 'is a prime number'

2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

23
(2.3.5. Lệnh pass
Lệnh này không làm gì cả, nó được yêu cầu để hiện cú pháp rõ ràng, vì trogn
Python không có từ khóa kết thúc phạm vi (scope).
>>> while True:
pass # Busy-wait for keyboard interrupt (Ctrl+C)

>>> class MyEmptyClass:
pass
Mặc khác nó nó phép định nghĩa trước khung sườn ở mức trừu tượng trước khi
thực sự bắt tay vào viết mã
>>> def initlog(*args):
pass # Remember to implement this!
(2.3.6. Định nghĩa hàm
(2.3.6.1. Cú pháp
def <funtionsname>(argument):
body
Gọi thực hiện hàm tương tự như các ngôn ngữ khác
>>> def fib(n): # write Fibonacci series up to n
"""Print a Fibonacci series up to n."""
a, b = 0, 1
while a < n:
print a,
a, b = b, a+b

>>> # Now call the function we just defined:
fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
Câu lệnh đầu tiên của hàm nằm bên trong 3 dấu ” là mô tả về hàm, mô tả này sẽ
được thể hiện khi sử dụng hàm (tooltip).

Các biến sử dụng trong phạm vi hàm được đặt trong một bảng nội bộ, việc truy
xuất ưu tiên từ các biến nội bộ trong phạm vi code, đến các biến nội bộ ngoài
phạm vi code, sau đó đến biến toàn cục. Đặc biệt bên trong hàm không thể thay
đổi biến toàn cục.
Các đối số của hàm được xư xử như các biến nội bộ hàm, do đó chỉ được sử
dụng trong hàm và không thể thay đổi ra bên ngoài.
Các hàm có thể được sử dụng như biến ( con trỏ hàm trong các ngôn ngữ khác)
do đó chúng ta có thể làm như sau
24
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
Một hàm luôn trả về một giá trị, nếu không có giá trị trả về nó sẽ trả về None
>>> print fib(0)
None
(2.3.6.2. Tham số mặc định của hàm
Giống như hầu hết các ngôn ngữ khác, định nghĩa hàm mặc định tham số bằng
cách gán trực tiếp chúng với một giá trị.
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
có thể gọi như sau
ask_ok('Do you really want to quit?')
ask_ok('OK to overwrite the file?', 2)
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
Chú ý:
Giá trị mặc định chỉ được ước lượng một lần duy nhất, bạn có thể kiểm tra bằng
cách sử dụng như một danh sách
def f(a, L=[]):
L.append(a)
return L
print f(1)

[1]
print f(2)
[1, 2]
Nếu không muốn mặc định tham số bị chia sẽ giữa những lần gọi bạn chỉ định
giá trị None thay cho danh sách rỗng.
Hàm có thể được gọi tham số theo từ khóa dạng key = value
ask_ok(prompt ='Do you really want to quit?') # 1 tham số key
ask_ok(retries=2, prompt ='Do you really want to quit?') # 2 tham số key
ask_ok('Do you really want to quit?', complaint ='Come on, only yes or no!') # 1
tham số theo vị trí, 1 tham số theo key
Các cách gọi sau đây không hợp lệ
ask_ok() # thiếu tham số
ask_ok('do you ',retries=2 ,'Come on, only yes or no!')# tham số có key phải nằm
theo sau bởi tham số có key
ask_ok('do you ', prompt ='other do you ')# trùng tham số
Trong lời gọi hàm tham số theo khóa phải theo sau tham số theo vị trí ( tức là ưu
tiên theo vị trí rồi mới theo khóa), tất cả các tham số theo khóa phải so khớp duy
nhất 1 lần, vị trí thì không quang trọng, bao gồm cả tham số không mặc định.
Tham số dạng danh sách được thể hiện bởi 1 dấu * : vd *param
25

×