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ácthao tác máy tính nào đó thông qua một chương trình.. Người ta còn phân việc biên dịch làm hai loại tùy theo
Trang 1NGHIÊ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
Trang 2GIỚ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ậptrì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ônngữ 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 naynhư 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ệctheo ý 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ộttrong 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
Trang 3GIỚ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
Trang 4(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
Trang 51 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ềukiệ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ácthao 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áiniệ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ệntoá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ã" (chochươ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ươngtrình, nhưng có thể được dùng để tạo nên các chương trình khác Một chươngtrì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 đượcthự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ínhtoá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áctí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ựchiệ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 thihà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
Trang 6tiế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ấphơ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ínhrồ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êndị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 tacũ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ácgiữ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ủangôn ngữ lập trình như là ngôn ngữ máy của nó Có thể hình dung, một trìnhthô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áclệ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ênmá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
Trang 7Hì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ộtchươ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 duynhấ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ênmáy mà nó biên dịch, trong khi đó chương trình thông dịch thì không phụ thuộcvà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 sangmột dạng mã đối tượng, còn được gọi là byte code sau đó được thực thi bởi mộttrì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
Trang 8thi 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ácphâ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êntrong 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ácnhau 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ươngtrì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ọichung 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ệndị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
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
Trang 9o 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
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ảnhCFG( Context Free Grammar) hay còn gọi là văn phạm BNF (Brackers NaurForm)
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
Trang 10- 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
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)
Trang 111.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
Trang 12 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 không thứ tự
Khai báo tuần tự
Khai báo đệ quy
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
Đơ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
Trang 13 Kiểu hệ thống
Luồng điều khiển
Điều khiển tuần tự
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ởimộ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ậmhơ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;
Trang 14• 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ằngchứ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ưngphâ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
Ư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)
Trang 152 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ácngô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ịchbả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
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ẽ
Trang 16đượ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 đồngnhấ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ácgiá 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
Trang 17Thậ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
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áckhoả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ạolệ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
Trang 18Bấ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ả
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ự
Trang 19Trình biên dịch python không kiểm tra định danh chưa được khai báo, và cũngkhô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ựngsẳ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
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
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)
Trang 20>>> ( + j) / 1 1 j)
(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
Chuỗi được bao quoanh bởi các dấu nháy đơn ‘ hoặc nháy kép “” như trong các
>>> '"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
'HelpA'
'<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
Trang 21Traceback (most recent call last):
File "<stdin>" , line 1 , in ?
TypeError: object does not support item assignment
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
['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
Trang 22['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
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> 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
Please enter an integer: 42
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ự
a = [ 'cat' , 'window' , 'defenestrate' ]
Trang 23defenestrate 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
Hàm range sẽ tạo một tập theo định nghĩa cho trước
range (begin [,end] [,step] )
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
print i, a[i]
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
# loop fell through without finding a factor
print n, 'is a prime number'
Trang 24(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)
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ã
pass # Remember to implement this!
(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
"""Print a Fibonacci series up to n."""
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
Trang 25Giố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 = , 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!')
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à ưutiê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
Trang 26Tham số dạng bảng tra key-value được thể hiện bởi 2 dấu * : vd **dict
Và tham số dạng danh sách phải nằm trước dạng bảng tra
def cheeseshop(kind, * arguments, ** keywords):
print " Do you have any" , kind, "?"
print " I'm sorry, we're all out of" , kind
for arg in arguments:
cheeseshop( "Limburger" , "It's very runny, sir." ,
"It's really very, VERY runny, sir." ,
shopkeeper = 'Michael Palin' ,
client = "John Cleese" ,
sketch = "Cheese Shop Sketch" )
kết quả:
Do you have any Limburger ?
I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
-client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch
Các tham số có thể được gọi một cách rời rạc hoặc gọi trực tiếp từ một danh
Một dạng ngắn gọn của hàm được sử dụng rất phổ biến, chúng được hiểu
tương tự như con trỏ hàm
Trang 272.4 Cấu trúc dữ liệu
Tất cả các cấu trúc mà chúng ta tìm hiểu ở đây, đều thuộc về từng lớp riêng của
nó, do đó chúng có tất cả đầy đủ những hàm xử lý riêng mà chúng ta không đểcập ở đây Khi code chỉ cần gõ là nó sẽ hiển thị ra để chọn Phần này chúng ta
chỉ đề cập đến một số tính năng và cách sử dụng bằng ví dụ
List trong Python không những là một danh sách mà còn hội tụ tất cả các tính
năng khác của các dạng danh sách khác nhau như Stack, Queue… tất cả cáctính năng này được thể hiện trong danh sách các hàm của chúng
>>> queue = deque([ "Eric" , "John" , "Michael" ])
'Eric'
Có 3 hàm xây dựng sẳn rất thường sử dụng là với List là filter(), map() và
reduce()
Filter(function, sequence) trả về tập các phần tử trong sequence thõa mãn với
function(item) = true, nếu sequence là string hay tuble thì nó trả về cùng kiểu,ngoài ra nó sẽ trả về list
Trang 28Nếu như hàm có hơn một tham số thì , sequence cũng phải tương ứng
Reduce (function, sequence) trả về một giá trị bằng cách gọi hàm function trên
hai tham số đầu tiên, sau đó trên kết quả và tham số tiếp theo cho đến khi hếtdanh sách
55
Nếu danh sách chỉ chứa một tham số,giá trị đó sẽ được trả về, nếu danh sách
rỗng ngoại lệ sẽ quăng ra
Tham số thứ 3 sẽ là giá trị khởi tạo,trong trường hợp danh sách rỗng thì giá trị
trả về sẽ là giá trị tham số này
def add(x,y): return x +
return reduce (add, seq, 0
squares = [x ** 2 for x in range ( 10 )]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Một List Comprehensions bao gồm đóng mở 2 dấu ngoặc vuông, bên trong là
biểu thức khởi tạo, các mệnh for và if Ví dụ dưới tạo danh sách tuple bằng cách
sử dụng dấu ngoặc trong biểu thức khởi tạo
List Comprehensions lồng nhau
Biểu thức khởi tạo có thể là bất cứ một biểu thức tùy ý nào, bao gồm một list
comprehension khác
Trang 29[ 1 , 2 , 3 , 4 ],
[ 5 , 6 , 7 , 8 ],
[ 9 , 10 , 11 , 12 ],
Kết quả dưới đây hoàn vị dòng và cột của matrix trên
Del cũng có thể xóa luôn giá trị biến, có nghĩa là sau khi del xong thì biến đó
không còn tồn tại nữa
Trang 30Đối với việc khởi tạo một tuple chưa 0 hoặc 1 phần tử, cú pháp có một số mởrộng để tiện lợi, tuple rỗng được tạo bởi cặp ngoặc đơn rỗng, tuple chứa mộtphần tử được tạo bằng cách gán trực tiếp tới giá trị chỉ định theo sau bởi mộtdấu phẩy.
Python cũng chứa kiểu dữ liệu tập hợp gọi là Sets
Sets là một tập hợp các phần tử không thứ tự và duy nhất ( không bị trùng lắp)
>>> fruit
set(['orange', 'pear', 'apple', 'banana'])
key/value Trong đó key có thể là tuple,list đồng nhất về kiểu dữ liệu và duy nhất
Dictionary được khởi tạo bằng 2 dấu ngoặc { }, các cặp key/value được phâncách nhau bởi dấu 2 chấm “:” , các phần tử cách nhau bởi dấu phẩy