Hướng dẫn python implementations without gil - triển khai python không có gil

Hi,

Show

Tôi đã làm việc trên các thay đổi đối với CPython để cho phép nó chạy mà không cần khóa phiên dịch toàn cầu. Tôi muốn chia sẻ một bằng chứng làm việc có thể chạy mà không cần Gil. Bằng chứng về khái niệm liên quan đến những thay đổi đáng kể đối với nội bộ Cpython, nhưng tương đối ít thay đổi đối với C-API. Nó tương thích với nhiều tiện ích mở rộng C: các tiện ích mở rộng phải được xây dựng lại, nhưng thường yêu cầu nhỏ hoặc không sửa đổi mã nguồn. Tôi đã xây dựng các phiên bản tương thích của các gói từ hệ sinh thái Python khoa học và chúng có thể cài đặt được thông qua "PIP".

Mã nguồn: https://github.com/colesbury/nogil

Tổng quan thiết kế: https: //docs.google.com/document/d/18cxhdb1ygxg-yxnbjnzfzzsdfosb5e6bfnxllejd ...

Mục tiêu của tôi với bằng chứng về khái niệm là chứng minh rằng việc loại bỏ GIL là khả thi và đáng giá, và các ý tưởng kỹ thuật của dự án có thể đóng vai trò là cơ sở của một nỗ lực như vậy.

Tôi muốn bắt đầu một cuộc thảo luận về những ý tưởng này và đánh giá sự quan tâm của cộng đồng đối với phương pháp này để loại bỏ Gil.

Trân trọng, Sam Gross /

Cuốn sách Lập trình Python này được O2 Education sưu tầm và chia sẻ lại, chứ không phải tài liệu do chúng tôi viết. Lưu ý rằng phiên bản của cuốn sách này khá cũ, sử dụng Python 2.x nên có đôi chút khác biệt so với các phiên bản Python 3.x hiện nay.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

0. Thông tin về bản quyền

Bản quyền © 2001-2006 Python Software Foundation. Giữ toàn quyền.

Bản quyền © 2000 BeOpen.com. Giữ toàn quyền.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Bản quyền © 1995-2000 Corporation for National Research Initiatives. Giữ toàn quyền.

Bản quyền © 1991-1995 Stichting Mathematisch Centrum. Giữ toàn quyền.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Xem phần cuối của tài liệu này về toàn bộ thông tin quyền hạn và giấy phép.

Tóm tắt:

Python là một ngôn ngữ dễ học, và mạnh mẽ. Nó có những cấu trúc dữ liệu cấp cao hiệu quả và hướng lập trình đối tượng đơn giản. Cú pháp tao nhã và kiểu dữ liệu động của Python, cùng với bản chất thông dịch biến nó thành một ngôn ngữ bậc nhất để viết kịch bản (scripting) và phát triển ứng dụng nhanh trong nhiều lĩnh vực và trên hầu hết mọi hệ thống.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Trình thông dịch Python và bộ thư viện chuẩn đầy đủ được cung cấp miễn phí ở dạng nguồn hoặc nhị phân cho mọi hệ thống chính từ trang chủ Python, http://www.python.org/, và có thể được phát tán tùy thích. Trang chủ đó cũng phân phối và liên kết nhiều mô-đun Python khác, các chương trình và công cụ, cũng như các tài liệu thêm.

Trình thông dịch Python có thể được mở rộng dễ dàng với những chức năng và kiểu dữ liệu được viết trong C hoặc C++ (hoặc ngôn ngữ nào đó có thể gọi được từ C). Python cũng phù hợp dùng làm ngôn ngữ mở rộng cho các ứng dụng mà người dùng có thể cải biến.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Bài chỉ dẫn này giới thiệu với người đọc bằng một cách dễ hiểu những khái niệm cơ bản và các tính năng của ngôn ngữ và hệ thống Python. Để tận dụng tốt nhất chỉ dẫn này, bạn nên có trình thông dịch Python sẵn sàng để thực tập. Nhưng bạn cũng không nhất thiết cần đến nó để đọc tài liệu này vì mọi ví dụ đều ngắn và dễ hiểu cả.

Để tìm hiểu thêm về các mô-đun và đối tượng chuẩn, xem qua tài liệu Tham khảo thư viện Python. Sổ tay tham khảo Python chứa định nghĩa ngôn ngữ chính quy hơn. Để viết các phần mở rộng bằng C hoặc C++, bạn nên đọc Mở rộng và Nhúng trình thông dịch Python và Tham khảo API cho Python/C. Và cũng có nhiều sách khác nói sâu hơn về Python.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Bài chỉ dẫn này không nhằm vào việc nói về mọi tính năng, hoặc thậm chí là mọi tính năng hay dùng. Thay vào đó, nó giới thiệu nhiều chức năng đáng lưu ý của Python và đem lại cho bạn một cách nhìn về kiểu cách và hương vị của ngôn ngữ này. Sau khi đọc xong, bạn sẽ có thể đọc và viết các mô-đun và chương trình Python, và bạn sẽ sẵn sàng tìm hiểu tiếp về những mô-đun Python khác được nhắc đến trong Tham khảo thư viện Python.

Phiên bản 2.5, tài liệu được cập nhật ngày 19, tháng 09, năm 2006.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

1. Khai vị

Nếu bạn làm việc nhiều với máy vi tính, một lúc nào đó bạn sẽ nhận thấy bạn muốn tự động hóa một số việc. Ví dụ, bạn muốn thực hiện một phép tìm kiếm và thay thế với nhiều tập tin văn bản, hoặc đổi tên và sắp xếp một loạt các tập tin ảnh theo một cách phức tạp. Có thể bạn muốn viết cơ sở dữ liệu tùy biến nho nhỏ, hoặc một ứng dụng với giao diện đồ họa đặc biệt, hay một trò chơi đơn giản.

Nếu bạn là một người chuyên viết phần mềm, bạn có thể làm việc với nhiều thư viện C/C++/Java nhưng bạn nhận thấy thường lặp đi lặp lại việc viết/biên dịch/thử/biên dịch là quá tốn thời gian. Có thể bạn viết một bộ các thử nghiệm cho các thư viện ấy và nhận ra rằng viết mã lệnh để thử nghiệm là một việc chán ngấy. Hoặc có thể bạn viết một chương trình cần sử dụng một ngôn ngữ mở rộng, và bạn không muốn thiết kế, xây dựng cả một ngôn ngữ mới cho ứng dụng của mình.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Python chính là ngôn ngữ lập trình bạn cần.

Bạn có thể viết một kịch bản Unix hoặc một bó lệnh (batch file) Windows cho công việc kiểu này thế nhưng, ngôn ngữ kịch bản chỉ tốt cho việc chuyển các tập tin lòng vòng và sửa đổi các dữ liệu văn bản, nó không thích hợp cho một ứng dụng với giao diện đồ họa hoặc một trò chơi. Bạn cần viết một chương trình bằng C/C++/Java, nhưng nó có thể tiêu tốn nhiều thời gian cho việc phát triển thậm chí từ bản nháp đầu tiên của chương trình. Sử dụng Python đơn giản hơn, chạy được cả trên Windows, MacOS X, và các hệ điều hành Unix, và nó cũng giúp bạnh hoàn thành công việc nhanh hơn.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Sử dụng ngôn ngữ lập trình Python thì đơn giản, nhưng nó là một ngôn ngữ lập trình thực thụ, cung cấp nhiều cấu trúc hơn và hỗ trợ các chương trình lớn hơn so với các ngôn ngữ kịch bản hoặc bó lệnh Windows. Mặt khác, Python cũng hỗ trợ nhiều phép kiểm tra lỗi hơn C, và, là một ngôn ngữ bậc-rất-cao, nó có sẵn các kiểu dữ liệu cấp cao, như các mảng và các từ điển linh hoạt. Chính vì nhiều kiểu dữ liệu tổng quát của nó Python được ứng dụng rộng rãi hơn Awk hoặc thậm chí là Perl trong nhiều loại công việc khác nhau, do đó có nhiều việc làm bằng Python cũng dễ dàng như làm bằng các ngôn ngữ khác.

Ngôn ngữ lập trình Python cho phép bạn chia nhỏ chương trình của mình ra thành các mô-đun để có thể sử dụng lại trong các chương trình Python khác. Nó có sẵn rất nhiều các mô-đun chuẩn để bạn có thể sử dụng làm cơ sở cho chương trình của mình — hoặc như các ví dụ để bắt đầu học lập trình bằng Python. Một vài mô-đun trong số chúng cung cấp các chức năng như tập tin I/O (vào/ra), các lệnh gọi hàm hệ thống, các socket, và thậm chí các giao tiếp với các công cụ giao diện đồ họa như Tk.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Python là một ngôn ngữ thông dịch, điều đó giúp bạn tiết kiệm thời gian trong quá trình phát triển chương trình vì việc biên dịch hay liên kết là không cần thiết. Bộ thông dịch có thể được dùng một cách tương tác, làm cho việc thử nghiệm các tính năng của ngôn ngữ trở nên dễ dàng, viết các chương trình bỏ đi, hoặc thử các chức năng trong việc phát triển chương trình từ dưới lên. Nó cũng là một máy tính cầm tay tiện lợi.

Python cho phép viết các chương trình nhỏ gọn và dễ hiểu. Các chương trình viết bằng Python thường ngắn hơn so với các chương trình viết bằng C, C++ hoặc Java, vì nhiều lý do:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • các kiểu dữ liệu cao cấp cho phép bạn thực hiện nhanh các thao tác phức tạp chỉ với một lệnh đơn giản;
  • phát biểu lệnh được nhóm lại bằng khoảng cách thụt đầu dòng thay vì đóng mở với các dấu ngoặc;
  • không cần khai báo biến hoặc tham số trước khi sử dụng.

Python có tính mở rộng: nếu bạn biết lập trình C thì rất dễ để bổ sung các hàm có sẵn hoặc mô-đun vào bộ thông dịch, cũng như việc thực hiện các thao tác quan trọng ở tốc độ tối đa, hoặc liên kết các chương trình Python với các thư viện chỉ được cung cấp dưới dạng nhị phân (ví dụ như các thư viện đồ họa của một vài nhà sản xuất). Một khi bạn đã thực sự móc nối, bạn có thể liên kết bộ thông dịch Python vào trong các ứng dụng viết bằng C và sử dụng nó như một tính năng mở rộng hoặc một ngôn ngữ lệnh cho ứng dụng đó.

Cũng xin nói luôn, tên của ngôn ngữ này được đặt sau khi BBC phát chương trình “Monty Python’s Flying Circus” và nó không có liên quan gì với những loài bò sát bẩn thỉu. Những tham khảo mang tính trào phùng tới Monty Python trong tài liệu không chỉ được cho phép, mà còn được cổ vũ.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Bây giờ khi tất cả các bạn đã bị kích thích về Python, bạn sẽ muốn khám phá nó kỹ hơn. Cách học một ngôn ngữ tốt nhất là hãy sử dụng nó, bài chỉ dẫn này mời gọi bạn hãy vừa thử trình thông dịch Python khi bạn vừa đọc.

Trong chương tiếp theo, các phương thức sử dụng bộ thông dịch sẽ được giải thích. Điều này không đơn thuần là thông tin, nhưng còn là cơ bản cho việc thử các ví dụ được trình bày về sau.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Phần tự học còn lại sẽ giới thiệu các tính năng khác nhau của ngôn ngữ Python và hệ thống thông qua các ví dụ, bắt đầu với các biểu thức đơn giản, các câu lệnh và các kiểu dữ liệu, đi qua các hàm và các mô-đun, và kết thúc là tiếp cận với các khái niệm cao cấp như biệt lệ và các lớp do người dùng tự định nghĩa.

2. Sử dụng trình thông dịch Python

2.1 Chạy trình thông dịch

Bộ thông dịch Python thường được cài đặt là /usr/local/bin/python trên các máy tính đã cài đặt sẵn; bổ sung /usr/local/bin vào đường dẫn tìm kiếm của vỏ (shell) Unix sẽ giúp khởi động nó từ mọi nơi bằng một lệnh đơn giản

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
14

trong shell. Vì nơi mà trình thông dịch được cài đặt là một tùy chọn nên khi cài đặt trình thông dịch có thể sẽ được đặt ở một nơi khác; hãy hỏi quản trị hệ thống của bạn. (ví dụ /usr/local/python cũng là một vị trí hay được dùng để cài.)shell. Vì nơi mà trình thông dịch được cài đặt là một tùy chọn nên khi cài đặt trình thông dịch có thể sẽ được đặt ở một nơi khác; hãy hỏi quản trị hệ thống của bạn. (ví dụ /usr/local/python cũng là một vị trí hay được dùng để cài.)

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Trên các máy tính dùng Windows, Python thường được cài đặt vào

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
15, dù vậy bạn vẫn có thể thay đổi vị trí cài đặt khi chạy chương trình cài đặt. Để bổ sung thư mục này vào đường dẫn, bạn có thể gõ lệnh sau lên dấu nhắc lệnh trong cửa sổ DOS:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
16

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Gõ một ký tự kết thúc tập tin (end-of-file character) (Control-D trên Unix, Control-Z trên Windows) tại dấu nhắc của bộ thông dịch sẽ thoát khỏi bộ thông dịch và trả về trạng thái kết thúc chương trình là

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17 (không) cho hệ điều hành, bạn cũng có thể thoát khỏi bộ thông dịch bằng các lệnh sau: “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
18“.

Tính năng soạn thảo theo dòng của bộ thông dịch thường không phức tạp lắm. Trên Unix, bất cứ ai đã cài đặt bộ thông dịch đều có thể bật chế độ hỗ trợ cho thư viện GNU readline, điều này sẽ bổ sung tính năng soạn thảo tương tác tốt hơn cũng như các tính năng lịch sử lệnh. Có thể kiểm tra việc hỗ trợ tính năng soạn thảo dòng bằng cách nhấn Control-P tại dấu nhắc đầu tiên của Python. Nếu có tiếng bíp, bộ thông dịch của bạn có hỗ trợ soạn thảo dòng; xem phụ lục A để biết về các phím. Nếu không có gì xảy ra, hoặc kí tự P hiện lên, thì tính năng soạn thảo dòng không được hỗ trợ; bạn chỉ việc dùng phím lùi (backspace) để xóa kí tự hiện ra.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Gõ một ký tự kết thúc tập tin (end-of-file character) (Control-D trên Unix, Control-Z trên Windows) tại dấu nhắc của bộ thông dịch sẽ thoát khỏi bộ thông dịch và trả về trạng thái kết thúc chương trình là

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17 (không) cho hệ điều hành, bạn cũng có thể thoát khỏi bộ thông dịch bằng các lệnh sau: “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
18“.

Tính năng soạn thảo theo dòng của bộ thông dịch thường không phức tạp lắm. Trên Unix, bất cứ ai đã cài đặt bộ thông dịch đều có thể bật chế độ hỗ trợ cho thư viện GNU readline, điều này sẽ bổ sung tính năng soạn thảo tương tác tốt hơn cũng như các tính năng lịch sử lệnh. Có thể kiểm tra việc hỗ trợ tính năng soạn thảo dòng bằng cách nhấn Control-P tại dấu nhắc đầu tiên của Python. Nếu có tiếng bíp, bộ thông dịch của bạn có hỗ trợ soạn thảo dòng; xem phụ lục A để biết về các phím. Nếu không có gì xảy ra, hoặc kí tự P hiện lên, thì tính năng soạn thảo dòng không được hỗ trợ; bạn chỉ việc dùng phím lùi (backspace) để xóa kí tự hiện ra.

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
14
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
20
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
21“, sẽ thực thi một hoặc nhiều câu lệnh trong command, giống như tùy chọn
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
20
của shell. Vì các câu lệnh của Python thường chứa các khoảng trống hoặc các kí tự đặc biệt, chọn lựa an toàn nhất là bao command bằng dấu nháy kép (“).

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Gõ một ký tự kết thúc tập tin (end-of-file character) (Control-D trên Unix, Control-Z trên Windows) tại dấu nhắc của bộ thông dịch sẽ thoát khỏi bộ thông dịch và trả về trạng thái kết thúc chương trình là

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17 (không) cho hệ điều hành, bạn cũng có thể thoát khỏi bộ thông dịch bằng các lệnh sau: “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
18“.
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
14
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
24
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
25“, lệnh này sẽ thực hiện tập tin nguồn module như khi bạn chỉ ra tên tập tin và đường dẫn đầy đủ trên dòng lệnh.

Tính năng soạn thảo theo dòng của bộ thông dịch thường không phức tạp lắm. Trên Unix, bất cứ ai đã cài đặt bộ thông dịch đều có thể bật chế độ hỗ trợ cho thư viện GNU readline, điều này sẽ bổ sung tính năng soạn thảo tương tác tốt hơn cũng như các tính năng lịch sử lệnh. Có thể kiểm tra việc hỗ trợ tính năng soạn thảo dòng bằng cách nhấn Control-P tại dấu nhắc đầu tiên của Python. Nếu có tiếng bíp, bộ thông dịch của bạn có hỗ trợ soạn thảo dòng; xem phụ lục A để biết về các phím. Nếu không có gì xảy ra, hoặc kí tự P hiện lên, thì tính năng soạn thảo dòng không được hỗ trợ; bạn chỉ việc dùng phím lùi (backspace) để xóa kí tự hiện ra.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Gõ một ký tự kết thúc tập tin (end-of-file character) (Control-D trên Unix, Control-Z trên Windows) tại dấu nhắc của bộ thông dịch sẽ thoát khỏi bộ thông dịch và trả về trạng thái kết thúc chương trình là

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17 (không) cho hệ điều hành, bạn cũng có thể thoát khỏi bộ thông dịch bằng các lệnh sau: “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
18“.
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
30
trước script (python -i script). (Phương pháp này không hoạt động nếu chương trình được đọc từ đầu vào chuẩn, lí do của chuyện này đã được giải thích trong đoạn trước.)

Tính năng soạn thảo theo dòng của bộ thông dịch thường không phức tạp lắm. Trên Unix, bất cứ ai đã cài đặt bộ thông dịch đều có thể bật chế độ hỗ trợ cho thư viện GNU readline, điều này sẽ bổ sung tính năng soạn thảo tương tác tốt hơn cũng như các tính năng lịch sử lệnh. Có thể kiểm tra việc hỗ trợ tính năng soạn thảo dòng bằng cách nhấn Control-P tại dấu nhắc đầu tiên của Python. Nếu có tiếng bíp, bộ thông dịch của bạn có hỗ trợ soạn thảo dòng; xem phụ lục A để biết về các phím. Nếu không có gì xảy ra, hoặc kí tự P hiện lên, thì tính năng soạn thảo dòng không được hỗ trợ; bạn chỉ việc dùng phím lùi (backspace) để xóa kí tự hiện ra.

Bộ thông dịch Python hoạt động khá giống với vỏ Unix: khi được gọi với một đầu nhập chuẩn đã kết nối với một thiết bị đầu cuối (tty device), nó đọc và thực hiện các lệnh một cách tương tác; khi được gọi với tham số là một tên tập tin hoặc với đầu vào chuẩn là một tập tin, nó đọc và thực hiện kịch bản chứa trong tập đó.

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
20 command được sử dụng,
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
32 được gán thành ‘
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
20‘. Khi
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
24
module được sử dụng,
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
32 được gán là tên đầy đủ của mô-đun đã nạp. Các tùy chọn sau
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
20
command hoặc
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
24
module không được sử dụng bởi trình thông dịch Python mà truyền vào
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
31 để cho command hay module xử lý.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Một cách nữa để khởi động bộ thông dịch là lệnh “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
14
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
20
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
21“, sẽ thực thi một hoặc nhiều câu lệnh trong command, giống như tùy chọn
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
20 của shell. Vì các câu lệnh của Python thường chứa các khoảng trống hoặc các kí tự đặc biệt, chọn lựa an toàn nhất là bao command bằng dấu nháy kép (“).

Một số mô-đun cũng có thể được dùng như kịch bản. Chúng có thể được gọi bằng cách sử dụng cú pháp “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
14
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
24
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
25“, lệnh này sẽ thực hiện tập tin nguồn module như khi bạn chỉ ra tên tập tin và đường dẫn đầy đủ trên dòng lệnh.

python
Python 1.5.2b2 (#1, Feb 28 1999, 00:02:06)  [GCC 2.8.1] on sunos5
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>>

Các dòng nối tiếp được dùng khi nhập vào các cấu trúc nhiều dòng. Hãy xem ví dụ dưới, chú ý câu lệnh if :

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!

2.2 Trình thông dịch và môi trường của nó

2.2.1 Xử lý lỗi

Khi xảy ra một lỗi, bộ dịch in ra thông báo lỗi và lần ngược ngăn xếp (stack trace). Trong chế độ tương tác, nó sẽ trả lại dấu nhắc chính; khi đầu vào là một tập tin, nó sẽ thoát với mã lỗi khác 0 sau khi in ra lần ngược ngăn xếp. (Các biệt lệ được xử lý bởi vế except trong một câu lệnh try không phải là các lỗi chúng ta nói đến ở đây.) Một số lỗi là nghiêm trọng không điều kiện và gây ra lỗi thoát với giá trị lỗi khác 0; điều này áp dụng cho các trường hợp mâu thuẫn nội tại và một vài trường hợp tràn bộ nhớ. Tất cả các thông báo lỗi đều được xuất ra dòng xuất lỗi chuẩn (standard error stream); kết xuất bình thường sẽ được xuất ra dòng xuất chuẩn (standard output – xin được hiểu là màn hình, tập tin…).

Gõ kí tự ngắt (thường là Control-C hoặc DEL) vào dấu nhắc chính hoặc dấu nhắc thứ sẽ bỏ những gì đã nhập vào và trở về dấu nhắc chính[1].Gõ kí tự ngắt trong khi một lệnh đang được thực thi sẽ gây ra biệt lệ KeyboardInterrupt, trường hợp này có thể được xử lý bằng câu lệnh try.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

2.2.2 Các kịch bản Python khả thi

Trên các hệ thống Unix họ BSD, các kịch bản Python có thể được thực thi trực tiếp, như các kịch bản vỏ (shell script), bằng cách thêm dòng

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
45

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

2.2.2 Các kịch bản Python khả thi

Trên các hệ thống Unix họ BSD, các kịch bản Python có thể được thực thi trực tiếp, như các kịch bản vỏ (shell script), bằng cách thêm dòngchmod :

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
51

2.2.2 Các kịch bản Python khả thi

Trên các hệ thống Unix họ BSD, các kịch bản Python có thể được thực thi trực tiếp, như các kịch bản vỏ (shell script), bằng cách thêm dòng

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
52

2.2.2 Các kịch bản Python khả thi

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

2.2.2 Các kịch bản Python khả thi

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)

Trên các hệ thống Unix họ BSD, các kịch bản Python có thể được thực thi trực tiếp, như các kịch bản vỏ (shell script), bằng cách thêm dòng

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

2.2.2 Các kịch bản Python khả thi

Trên các hệ thống Unix họ BSD, các kịch bản Python có thể được thực thi trực tiếp, như các kịch bản vỏ (shell script), bằng cách thêm dòng

(giả sử rằng bộ thông dịch đã có trong PATH của người dùng) ở đầu kịch bản và đặc thuộc tính thực thi (executable mode) cho tập tin đó. Ký hiệu “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
46” phải là hai ký tự đầu tiên của tập tin. Trên các nền khác, dòng đầu tiên này phải kết thúc bằng một ký tự xuống dòng kiểu Unix (“
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
47“), không phải Mac OS (“
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
48“) hay Windows (“
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
49“). Lưu ý rằng dấu thăng “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
50“, được dùng để bắt đầu một chú thích trong Python.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

2.2.2 Các kịch bản Python khả thi

Nếu bạn muốn đọc các tập khởi động bổ sung từ thư mục hiện tại, bạn có thể lập trình điều này trong tập tin khởi động với mã như “if os.path.isfile(‘.pythonrc.py’): execfile(‘.pythonrc.py’)”. Nếu bạn muốn dùng tập tin khởi động trong một kịch bản, bạn phải chỉ rõ điều này trong kịch bản:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)

3. Giới thiệu sơ lược về ngôn ngữ lập trình Python

Trong ví dụ say, đầu vào và đầu ra được phân biệt bằng sự hiện diện của dấu nhắc (“

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
43 ” và “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
44 “): để lặp lại ví tụ, bạn cần nhập vào mọi thứ sau dấu nhắc, khi dấu nhắc xuất hiện; các dòng không bắt đầu bằng một dấu nhắc là kết quả xuất từ trình thông dịch. Lưu ý rằng dấu nhắc thứ (secondary prompt) trên một dòng riêng nó có nghĩa là bạn phải nhận một dòng trống; dòng này dùng để kết thúc một lệnh nhiều dòng.

Nhiều ví dụ trong tài liệu này, ngay cả những ví dụ nhập từ dòng lệnh tương tác, có cả chú thích. Các chú thích trong Python bắt đầu bằng một dấu thăng, “#”, và kéo dài tới hết dòng. Một chú thích có thể xuất hiện ở đầu dòng, hoặc theo sau khoảng trắng hoặc mã, nhưng không phải trong một chuỗi. Một dấu thăng trong một chuỗi chỉ là một dấu thăng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Một vài ví dụ:

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."

3.1 Dùng Python như là máy tính

Hãy thử một vài lệnh Python đơn giản. Khởi động trình thông dịch và chờ dấu nhắc chính, “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
43 “. (Không lâu đâu.)

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Một vài ví dụ:

3.1 Dùng Python như là máy tính

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3

Hãy thử một vài lệnh Python đơn giản. Khởi động trình thông dịch và chờ dấu nhắc chính, “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
43 “. (Không lâu đâu.)

3.1.1 Kiểu số trong ngôn ngữ lập trình Python

Trình thông dịch đóng vài trò là một máy tính đơn giản: bạn nhập một biểu thức và nó sẽ trả về giá trị. Cú pháp biểu thức rất dễ hiểu: các toán tử

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
56 và
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
57 hoạt động như trong hầu hết các ngôn ngữ khác (ví dụ Pascal hay C); dấu ngoặc tròn dùng để gộp nhóm. Ví dụ:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0

Dấu bằng (“

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
58“) được dùng để gán một giá trị vào một biến. Sau đó, không có giá trị nào được hiện ra trước dấu nhắc tương tác kế:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> width = 20
>>> height = 5*9
>>> width * height
900

Một giá trị có thể được gán vào nhiều biến cùng một lúc:

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)

Python hoàn toàn hỗ trợ dấu chấm động; các toán tử với các toán hạng khác kiểu chuyển toán hạng số nguyên thành dấu chấm động:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5

Số phức cũng được hỗ trợ; số ảo được viết với hậu tố “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
59” hoặc “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
60“. Các số phức với phần thực khác không được viết “(real+imagj)”, hoặc có thể được tạo ra với hàm “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
61“.

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
1

Các số phức luôn được thể hiện bởi hai số chấm động, phần thực và phần ảo. Để lấy các phần từ một số phức

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
62, dùng
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
63 và
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
64.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
0

Các hàm chuyển đổi từ chấm động sang số nguyên (

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
65,
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
66 và
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
67) không dùng được với số phức — không có một cách chính xác nào để chuyển đổi một số phức thành một số thực. Dùng
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
68 để lấy độ lớn (magnitude) (như là một số chấm động) hoặc
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
63 để lấy phần thực.

Trong chế độ tương tác, biểu thức được in ra cuối cùng được gán vào biến
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
70. Khi bạn dùng Python như là máy tính, nó sẽ giúp bạn tiếp tục các phép tính dễ hơn, ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
2

Biến này nên được coi là chỉ đọc từ phía người dùng. Không nên gán một giá trị vào biến này trực tiếp — bạn sẽ tạo một biến cục bộ riêng với cùng tên, che đi biến có sẵn với cách thức (behavior) diệu kỳ của nó.

3.1.2 Chuỗi

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
4

Ngoài số, Python còn làm việc được với chuỗi, có thể được biểu hiện theo nhiều cách. Chúng có thể được kẹp trong dấu nháy đơn, đôi:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
3

Các chuỗi có thể phủ nhiều dòng theo nhiều cách. Các dòng tiếp tục (continuation line) có thể được dùng, với một dấu suỵt huyền là ký tự cuối cùng trên một dòng cho biết rằng dòng kế là sự nối tiếp của dòng này:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
6

Lưu ý rằng các dòng mới vẫn cần được chèn trong chuỗi với

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
47; ký tự dòng mới theo sau dấu suỵt huyền sẽ bị bỏ qua. Ví dụ này sẽ in ra:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
5

Tuy nhiên, nếu ta làm cho chuỗi trực tiếp thành chuỗi “thô”, các dãy

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
47 sẽ không được chuyển thành các dòng mới, nhưng dấu suỵt huyền ở cuối dòng, và ký tự dòng mới trong nguồn, sẽ đều được thêm vào trong chuỗi như dữ liệu. Cho nên, ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
8

sẽ in:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
7

Hoặc, các chuỗi có thể được vây quanh trong một cặp nháy ba:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
73 hoặc
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
74. Cuỗi mỗi dòng không cần thêm dấu suỵt huyền khi dùng nháy ba, và chúng sẽ có mặt trong chuỗi.
Các chuỗi có thể được nối với nhau với toán tử
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
75, và được lặp lại với toán tử
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
76:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
0

Hai chuỗi trực tiếp kế nhau được tự động nối với nhau; dòng đầu tiên bên trên có thể được biết “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
77‘”; việc này chỉ có tác dụng với hai chuỗi trực tiếp (string literal), không có tác dụng với các biểu thức chuỗi bất kỳ khác:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
1

Các chuỗi có thể được chỉ mục (subscript hoặc index); như trong C, ký tự đầu tiên của một chuỗi có chỉ mục

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17. Không có kiểu ký tự riêng; một ký tự chỉ đơn giản là một chuỗi có độ dài là một. Như trong Icon, chuỗi con có thể được chỉ định theo cách viết cắt lát (slice notation): hai chỉ mục phân cách bởi một dấu hai chấm.

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
2

Các chỉ mục cắt lát có giá trị mặc định hữu dụng; chỉ mục đầu tiên có giá trị mặc định là không, chỉ mục thứ hai mặc định là kích thước của chuỗi đang bị cắt.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
3

Không như C, các chuỗi Python không thể bị thay đổi. Phép gán vào một vị trí chỉ mục trong một chuỗi sẽ gây ra lỗi:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
4

Tuy nhiên, việc tạo một chuỗi với nội dung gộp chung cũng dễ và hiệu quả:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
5

Đây là một tính chất bất biến hữu dụng khác của tác vụ cắt lát:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
79 bằng
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
80.

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
6

Các chỉ mục cắt lát giảm sinh (degenerate) được xử lý rất khéo: một chỉ mục quá lớn sẽ được thay bằng kích thước chuỗi, một giới hạn trên nhỏ hơn giới hạn dưới trả về một chuỗi rỗng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
7

Các chỉ mục có thể là số âm, để bắt đầu đếm từ bên phải. Ví dụ:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
8

Nhưng lưu ý rằng

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
81 thật ra cũng là
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17, cho nên nó không bắt đầu đếm từ bên phải!

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
9

Các chỉ mục cắt lát âm ngoài phạm vi thì bị thu ngắn, nhưng đừng thử kiểu này với các chỉ mục một phần từ (không phải cắt lát):

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
0

Cách tốt nhất để nhớ hoạt động của cắt lát là nghĩ về các chỉ mục như đang trỏ vào giữa các ký tự, với cạnh trái của ký tự đầu tiên là 0. Sau đó cạnh phải của ký tự cuối cùng của một chuỗi của n ký tự có chỉ mục n, ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
1

Các số hàng đầu cho biết vị trí của các chỉ mục

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
83 trong chuỗi; dòng thứ hai cho biết các chỉ mục âm tương ứng. Một lát từ
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
84 tới
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
59 chứa toàn bộ các ký tự giữa các cạnh đánh số
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
84 và
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
59 tương ứng. Với các chỉ mục không âm, chiều dài của lát là hiệu của các chỉ mục, nếu cả hai đều trong giới hạn. Ví dụ, độ dài của
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
88 là
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
89. Hàm có sẵn
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
90 trả về độ dài của một chuỗi:
Với các chỉ mục không âm, chiều dài của lát là hiệu của các chỉ mục, nếu cả hai đều trong giới hạn. Ví dụ, độ dài của
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
88 là
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
89.
Hàm có sẵn
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
90 trả về độ dài của một chuỗi:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
2

Xem thêm:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • Các kiểu dãy Chuỗi, và các chuỗi Unicode được nhắc đến trong mục kế, là ví dụ của các kiểu dãy, và hỗ trợ các tác vụ chung được hỗ trợ bởi các kiểu đó.
  • Các phương thức chuỗi Cả chuỗi và chuỗi Unicode hỗ trợ một số lớn các phương thức nhằm vào chuyển đổi (transform) và tìm kiếm.
  • Các tác vụ định dạng chuỗi Các tác vụ định dạng chuỗi được gọi khi các chuỗi và chuỗi Unicode là toán hạng bên trái của toán tử % được bàn đến chi tiết hơn ở đây.

3.1.3 Chuỗi Unicode

Bắt đầu với Python 2.0, một kiểu dữ liệu mới để chứa dữ liệu văn bản được cung cấp cho nhà lập trình: đối tượng Unicode. Nó có thể được dùng để chứa và thay đổi dữ liệu Unicode (xem http://www.unicode.org/) và tích hợp tốt với các đối tượng chuỗi đã có, bằng việc tự chuyển đổi khi cần. Unicode có lợi điểm là cung cấp một số thứ tự (ordinal) cho mọi ký tự trong các bản thảo dùng trong các văn bản xưa và nay. Trước kia, chỉ có 256 số thứ tự cho các ký tự bản thảo. Các văn bản xưa bị giới hạn vào một trang mã (code page) dùng để ánh xạ các số vào các ký tự bản thảo. Điều này dẫn đến nhiều lẫn lộn đặc biệt là trong ngữ cảnh quốc tế hóa (internationalization, hay được viết tắt là “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
91” — “i” + 18 ký tự + “n”) phần mềm. Unicode giải quyết các vấn đề này bằng các định nghĩa một trang mã cho mọi bản thảo. Tạo một chuỗi Unicode trong Python dễ như tạo một chuỗi thường:
Unicode có lợi điểm là cung cấp một số thứ tự (ordinal) cho mọi ký tự trong các bản thảo dùng trong các văn bản xưa và nay. Trước kia, chỉ có 256 số thứ tự cho các ký tự bản thảo. Các văn bản xưa bị giới hạn vào một trang mã (code page) dùng để ánh xạ các số vào các ký tự bản thảo. Điều này dẫn đến nhiều lẫn lộn đặc biệt là trong ngữ cảnh quốc tế hóa (internationalization, hay được viết tắt là “
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
91” — “i” + 18 ký tự + “n”) phần mềm. Unicode giải quyết các vấn đề này bằng các định nghĩa một trang mã cho mọi bản thảo.
Tạo một chuỗi Unicode trong Python dễ như tạo một chuỗi thường:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
3

Ký tự “

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
92” đằng trước dấu nháy cho biết đây là một chuỗi Unicode cần được tạo. Nếu bạn muốn thêm các ký tự đặc biệt trong chuỗi, bạn có thể làm vậy bằng cách viết thoát nghĩa Unicode-Escape của Python. Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
4

Dãy thoát nghĩa

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
93 cho biết chèn một ký tự Unicode với thứ tự
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
94 (ký tự khoảng trắng) vào một vị trí đã định. Các ký tự khác được thông dịch theo thứ tự tương ứng của chúng như là thứ tự Unicode. Nếu bạn có các chuỗi trực tiếp trong bảng mã Latin-1 chuẩn được dùng ở nhiều nước phương Tây, bạn sẽ thấy rằng 256 ký tự đầu của bảng mã Unicode giống như 256 ký tự của Latin-1. Cho các chuyên gia, Python cũng hỗ trợ các chuỗi Unicode thô. Bạn phải dùng tiền tố ‘ur’ để bảo Python dùng bảng mã thoát-nghĩa-Unicode-thô (Raw-Unicode-Escape). Nó sẽ chỉ áp dụng phép chuyển đổi
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
95 bên trên nếu có một số lẻ các dấu suỵt huyền phía trước ký tự ‘u’ nhỏ.
Các ký tự khác được thông dịch theo thứ tự tương ứng của chúng như là thứ tự Unicode. Nếu bạn có các chuỗi trực tiếp trong bảng mã Latin-1 chuẩn được dùng ở nhiều nước phương Tây, bạn sẽ thấy rằng 256 ký tự đầu của bảng mã Unicode giống như 256 ký tự của Latin-1.
Cho các chuyên gia, Python cũng hỗ trợ các chuỗi Unicode thô. Bạn phải dùng tiền tố ‘ur’ để bảo Python dùng bảng mã thoát-nghĩa-Unicode-thô (Raw-Unicode-Escape). Nó sẽ chỉ áp dụng phép chuyển đổi
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
95 bên trên nếu có một số lẻ các dấu suỵt huyền phía trước ký tự ‘u’ nhỏ.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
5

Chế độ thô sẽ hữu dụng trong trường hợp bạn phải nhập thật nhiều dấu suỵt huyền, như khi bạn dùng trong các biểu thức chính quy (regular expression). Ngoài những bảng mã chuẩn này, Python cung cấp một tập hợp các cách khác để tạo các chuỗi Unicode từ một bảng mã đã biết. Hàm có sẵn unicode() cung cấp truy cập vào tất cả bộ mã/giải mã (codec – COder and DECoder) Unicode đã đăng ký. Một vài bảng mã phổ thông mà các bộ chuyển mã này có thể chuyển gồm Latin-1, ASCII, UTF-8, và UTF-16. Hai bảng mã sau cùng là các bảng mã có kích thước thay đổi và chứa mỗi ký tự Unicode trong một hoặc nhiều byte. Bảng mã mặc định thường được thiết lập là ASCII, nó cho phép các ký tự từ 0 tới 127 và cấm các ký tự khác. Khi một chuỗi Unicode được in, viết vào tập tin, hoặc chuyển với

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96, sự chuyển đổi diễn ra với bảng mã mặc định này.
Ngoài những bảng mã chuẩn này, Python cung cấp một tập hợp các cách khác để tạo các chuỗi Unicode từ một bảng mã đã biết.
Hàm có sẵn unicode() cung cấp truy cập vào tất cả bộ mã/giải mã (codec – COder and DECoder) Unicode đã đăng ký. Một vài bảng mã phổ thông mà các bộ chuyển mã này có thể chuyển gồm Latin-1, ASCII, UTF-8, và UTF-16. Hai bảng mã sau cùng là các bảng mã có kích thước thay đổi và chứa mỗi ký tự Unicode trong một hoặc nhiều byte. Bảng mã mặc định thường được thiết lập là ASCII, nó cho phép các ký tự từ 0 tới 127 và cấm các ký tự khác. Khi một chuỗi Unicode được in, viết vào tập tin, hoặc chuyển với
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96, sự chuyển đổi diễn ra với bảng mã mặc định này.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
6

Để chuyển một chuỗi Unicode thành một chuỗi 8-bit bằng một bảng mã nào đó, các đối tượng Unicode cung cấp một phương thức

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
97 nhận một thông số, tên của bảng mã. Bạn nên dùng tên bảng mã viết thường.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
7

Nếu bạn có dữ liệu trong một bảng mã nào đó và muốn tạo ra một chuỗi Unicode tương ứng từ nó, bạn có thể dùng hàm

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
98 với tên bảng mã là thông số thứ hai.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
8

3.1.4 Danh sách

Python biết một số kiểu dữ liệu gộp (compound), dùng để nhóm các giá trị với nhau. Kiểu linh hoạt nhất là danh sách (list), có thể được viết như là một danh sách các giá trị phân cách bởi dấu phẩy ở giữa ngoặc vuông.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
9

Cũng như các chỉ mục chuỗi, chỉ mục danh sách bắt đầu từ

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17, và danh sách có thể được cắt lát, gộm và vân vân:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
0

Không như chuỗi, là những đối tượng immutable (bất biến, không thể thay đổi), ta có thể thay đổi các phần tử của một danh sách:

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
1

Gán vào các cắt lát cũng có thể làm được, và nó có thể thay đổi kích thước của danh sách hoặc xóa sách nó.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
2

Hàm có sẵn

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
90 cũng áp dụng vào danh sách:

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
3

Có thể lồng các danh sách (tạo danh sách chứa các danh sách khác), ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
4

Lưu ý trong ví dụ, p[1] và q thật ra chỉ tới cùng đối tượng! Chúng ta sẽ nói về nghĩa của đối tượng (object semantics) trong các chương sau.

3.2 Những bước đầu lập trình

Dĩ nhiên, chúng ta có dùng Python cho các tác vụ phức tạp khác. Ví dụ ta có thể viết một dãy con ban đầu của dãy Fibonacci như sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
5

Ví dụ này giới thiệu một vài tính năng mới.

  • Dòng đầu tiên chứa một phép gán đa biến (multiple assignment): các biến
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    01 và
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    02 đồng loạt nhận giá trị mới
     # -*- coding: iso-8859-15 -*-
    
     currency = u"€"
    
     print ord(currency)
    17 và
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    04. Trong dòng cuối nó được dùng một lần nữa, cho thấy rằng các biểu thức ở phía phải được xác định trước khi bất kỳ phép gán nào được thực hiện. Các biểu thức phía phải được định giá từ trái qua phải.
  • Vòng lặp while thực thi miễn là điều kiện (ở đây:
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    05) vẫn là đúng (true). Trong Python, như C, mọi giá trị số nguyên khác không là đúng; không là sai (false). Điều kiện cũng có thể là danh sách, chuỗi, hoặc bất kỳ kiểu dãy nào; chiều dài khác không là đúng, dãy rỗng là sai. Phép so sánh dùng trong ví dụ là một phép so sánh đơn giản. Các toán tử so sánh chuẩn được viết như trong C:
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    06 (nhỏ hơn),
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    07 (lớn hơn),
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    08 (bằng),
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    09 (nhỏ hơn hoặc bằng),
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    10 (lớn hơn hoặc bằng) và
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    11 (không bằng).
  • Vòng lặp Thân vòng lặp được thụt vào: các thụt vào là cách của Python để nhóm các câu lệnh. Python không (chưa) cung cấp một công cụ soạn thảo dòng nhập thông minh, cho nên bạn phải nhập vào một tab hoặc khoảng trắng cho mỗi dòng thụt vào. Trong thực tế, bạn sẽ chuẩn bị đầu vào phức tạp hơn cho Python với một trình soạn thảo; đa số chúng đều có chức năng tự động thụt vào. Khi một câu lệnh ghép (compound statement) được nhập vào một cách tương tác, nó phải được theo sau bởi một dòng trống để chỉ ra sự kết thúc (vì bộ phân tích không thể khi nào bạn nhập dòng cuối). Lưu ý rằng mỗi dòng của một khối phải được thụt vào như nhau.
  • Vòng lặp
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    12 (câu lệnh) viết ra giá trị của biểu thức nó được cung cấp. Nó khác với việc chỉ viết các biểu thức bạn muốn viết (như chúng ta đã làm trong các ví dụ máy tính trước) trong việc xử lý nhiều biểu thức và chuỗi. Các chuỗi được in ra không có dấu nháy, và một khoảng trắng được chèn vào giữa các phần tử, để bạn có thể định dạng chúng đẹp hơn, ví dụ:
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
6

Dấu phẩy sau cùng tránh dòng mới sau khi xuất:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
7

Lưu ý rằng trình thông dịch chèn một dòng mới trước khi nó in ra dấu nhắc kế nếu dòng trước chưa xong.

4. Bàn thêm về luồng điều khiển

Ngoài câu lệnh while vừa giới thiệu, Python có các câu lệnh điều khiển luồng từ các ngôn ngữ khác, với chút sửa đổi.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

4.1 Câu lệnh điều kiện if trong ngôn ngữ lập trình Python

Có lẽ loại câu lệnh biết đến nhiều nhất là câu lệnh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
13. Ví dụ:

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
8

Có thể không có hoặc có nhiều phần

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
14, và phần
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
15 là không bắt buộc. Từ khóa `
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
14‘ là viết tắt của `
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
17‘, và dùng để tránh thụt vào quá nhiều. Dãy
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
18 dùng thay cho câu lệnh switch hay case tìm thấy trong các ngôn ngữ khác.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

4.2 Câu lệnh vòng lặp for trong lập trình Python

Vòng lặp

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
19 trong Python khác một chút với C hoặc Pascal. Thay vì lặp qua một dãy số (như trong Pascal), hoặc cho phép người dùng tự định nghĩa bước lặp và điều kiện dừng (như C), câu lệnh
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
19 của Python lặp qua các phần tử của một dãy bất kỳ (một danh sách, hoặc một chuỗi), theo thứ tự mà chúng xuất hiện trong dãy. Ví dụ:

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
9

Rất nguy hiểm nếu bạn sửa đổi dãy trong khi bạn đang lặp qua nó. Nếu bạn cần sửa đổi một danh sách khi đang lặp (ví dụ như để nhân đôi các phần tử nào đó) bạn sẽ cần phải lặp qua một bản sao của nó. Cách viết cắt miếng làm cho việc này đơn giản:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
0

4.3 Hàm import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename):     execfile(filename)21 trong lập trình Python

Nếu bạn cần lặp qua một dãy số, hàm có sẵn

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
21 trở nên tiện dụng. Nó tạo ra danh sách chứa các dãy số học:

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
1

Điểm dừng được chỉ định không bao giờ là một phần của danh sách tạo ra;

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
23 tạo danh sách 10 giá trị, là những chỉ mục hợp lệ cho các phần tử của một dãy có độ dài 10. Bạn cũng có thể tạo dãy bắt đầu từ một số khác, hoặc chỉ rõ mức tiến khác (ngay cả mức lùi; đôi khi nó còn được gọi là `bước’, `step’):

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
2

Để lặp qua các chỉ mục của một dãy, gộp

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
21 và l
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
25 như sau:

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
3

4.4 Câu lệnh import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename):     execfile(filename)26 và import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename):     execfile(filename)27, mệnh đề import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename):     execfile(filename)15 cho vòng lặp

Câu lệnh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
26, như trong C, nhảy ra khỏi phạm vi vòng lặp
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
19 hay
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
31 nhỏ nhất chứa nó.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

4.1 Câu lệnh điều kiện if trong ngôn ngữ lập trình Python

Có lẽ loại câu lệnh biết đến nhiều nhất là câu lệnh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
13. Ví dụ:

Có thể không có hoặc có nhiều phần
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
14, và phần
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
15 là không bắt buộc. Từ khóa `
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
14‘ là viết tắt của `
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
17‘, và dùng để tránh thụt vào quá nhiều. Dãy
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
18 dùng thay cho câu lệnh switch hay case tìm thấy trong các ngôn ngữ khác.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

4.2 Câu lệnh vòng lặp for trong lập trình Python

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
5

Vòng lặp import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename):     execfile(filename)19 trong Python khác một chút với C hoặc Pascal. Thay vì lặp qua một dãy số (như trong Pascal), hoặc cho phép người dùng tự định nghĩa bước lặp và điều kiện dừng (như C), câu lệnh import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename):     execfile(filename)19 của Python lặp qua các phần tử của một dãy bất kỳ (một danh sách, hoặc một chuỗi), theo thứ tự mà chúng xuất hiện trong dãy. Ví dụ:

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
9

Rất nguy hiểm nếu bạn sửa đổi dãy trong khi bạn đang lặp qua nó. Nếu bạn cần sửa đổi một danh sách khi đang lặp (ví dụ như để nhân đôi các phần tử nào đó) bạn sẽ cần phải lặp qua một bản sao của nó. Cách viết cắt miếng làm cho việc này đơn giản:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
0

Có những công cụ sử dụng docstrings để tự động sinh tài liệu trực tuyến hoặc để in, hoặc cho phép người dùng duyệt mã một cách tương tác; việc thêm docstrings vào mã rất được khuyến khích, cho nên bạn hãy tạo thói quen tốt đó cho mình.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Việc thực thi một hàm tạo ra một bảng ký hiệu mới dùng cho các biến cục bộ của hàm. Chính xác hơn, mọi phép gán biến trong một hàm chứa giá trị vào bảng ký hiệu cục bộ; và các tham chiếu biến sẽ trước hết tìm trong bảng ký hiệu cục bộ rồi trong bảng ký hiệu toàn cục, và trong bảng các tên có sẵn. Do đó, các biến toàn cục không thể được gán giá trị trực tiếp trong một hàm (trừ khi được đặt trong câu lệnh global ), mặc dù chúng có thể dược tham chiếu tới.

Thông số thật sự của một lệnh gọi hàm được tạo ra trong bảng ký hiệu cục bộ của hàm được gọi khi nó được gọi; do đó các thông số được truyền theo truyền theo giá trị (call by value) (mà giá trị luôn là một tham chiếu đối tượng, không phải là giá trị của đối tượng[2]). Khi một hàm gọi một hàm khác, một bảng ký hiệu cục bộ được tạo ra cho lệnh gọi đó.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Việc thực thi một hàm tạo ra một bảng ký hiệu mới dùng cho các biến cục bộ của hàm. Chính xác hơn, mọi phép gán biến trong một hàm chứa giá trị vào bảng ký hiệu cục bộ; và các tham chiếu biến sẽ trước hết tìm trong bảng ký hiệu cục bộ rồi trong bảng ký hiệu toàn cục, và trong bảng các tên có sẵn. Do đó, các biến toàn cục không thể được gán giá trị trực tiếp trong một hàm (trừ khi được đặt trong câu lệnh global ), mặc dù chúng có thể dược tham chiếu tới.

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
7

Thông số thật sự của một lệnh gọi hàm được tạo ra trong bảng ký hiệu cục bộ của hàm được gọi khi nó được gọi; do đó các thông số được truyền theo truyền theo giá trị (call by value) (mà giá trị luôn là một tham chiếu đối tượng, không phải là giá trị của đối tượng[2]). Khi một hàm gọi một hàm khác, một bảng ký hiệu cục bộ được tạo ra cho lệnh gọi đó.

Một định nghĩa hàm tạo tên hàm trong bảng ký hiệu hiện tại. Giá trị của tên hàm có một kiểu được nhận ra bởi trình thông dịch là hàm do người dùng định nghĩa. Giá trị này có thể được gán vào một tên khác và sau đó có thể được sử dụng như một hàm. Đây là một cách đổi tên tổng quát:

Bạn có thể nói rằng fib không phải là một hàm (function) mà là một thủ tục (procedure). Trong Python, cũng như C, thủ tục chẳng qua là hàm không có giá trị trả về. Thật sự, nói rõ hơn một chút, thủ tục cũng trả về giá trị mặc dù là một giá trị vô nghĩa. Giá trị này được gọi là None (nó là một tên có sẵn). In ra giá trị None thường bị trình thông dịch bỏ qua nếu nó là giá trị duy nhất được in ra. Bạn có thể thấy nó nếu bạn muốn:

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
9

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
8

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • Việc thực thi một hàm tạo ra một bảng ký hiệu mới dùng cho các biến cục bộ của hàm. Chính xác hơn, mọi phép gán biến trong một hàm chứa giá trị vào bảng ký hiệu cục bộ; và các tham chiếu biến sẽ trước hết tìm trong bảng ký hiệu cục bộ rồi trong bảng ký hiệu toàn cục, và trong bảng các tên có sẵn. Do đó, các biến toàn cục không thể được gán giá trị trực tiếp trong một hàm (trừ khi được đặt trong câu lệnh global ), mặc dù chúng có thể dược tham chiếu tới.
  • Thông số thật sự của một lệnh gọi hàm được tạo ra trong bảng ký hiệu cục bộ của hàm được gọi khi nó được gọi; do đó các thông số được truyền theo truyền theo giá trị (call by value) (mà giá trị luôn là một tham chiếu đối tượng, không phải là giá trị của đối tượng[2]). Khi một hàm gọi một hàm khác, một bảng ký hiệu cục bộ được tạo ra cho lệnh gọi đó.

Một định nghĩa hàm tạo tên hàm trong bảng ký hiệu hiện tại. Giá trị của tên hàm có một kiểu được nhận ra bởi trình thông dịch là hàm do người dùng định nghĩa. Giá trị này có thể được gán vào một tên khác và sau đó có thể được sử dụng như một hàm. Đây là một cách đổi tên tổng quát:

Bạn có thể nói rằng fib không phải là một hàm (function) mà là một thủ tục (procedure). Trong Python, cũng như C, thủ tục chẳng qua là hàm không có giá trị trả về. Thật sự, nói rõ hơn một chút, thủ tục cũng trả về giá trị mặc dù là một giá trị vô nghĩa. Giá trị này được gọi là None (nó là một tên có sẵn). In ra giá trị None thường bị trình thông dịch bỏ qua nếu nó là giá trị duy nhất được in ra. Bạn có thể thấy nó nếu bạn muốn:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
8

Bạn cũng có thể dễ dàng viết một hàm trả về một danh sách các số của dãy Fibonacci thay vì in nó ra:

Ví dụ này cho thấy một vài tính năng mới của ngôn ngữ lập trình Python:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
37 trả về với một giá trị từ một hàm.
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
37 không có thông số biểu thức đi kèm trả về
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
39. Rớt ra khỏi một thủ tục cũng trả về
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
39 của hàm.

Câu lệnh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
41 gọi một phương thức của đối tượng danh sách.
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
42. Một phương thức là một hàm `thuộc về’ một đối tượng và có tên
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
43, với
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
44 là một đối tượng nào đó (có thể là một biểu thức), và
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
45 là tên của một phương thức được định nghĩa bởi kiểu của đối tượng. Các kiểu khác nhau định nghĩa các phương thức khác nhau. Phương thức của các kiểu khác nhau có thể có cùng tên mà không dẫn đến sự khó hiểu. (Bạn có thể định nghĩa kiểu đối tượng và phương thức cho riêng bạn, dùng lớp, như sẽ được bàn đến ở các chương sau.) Phương thức
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
46 dùng trong ví dụ này được định nghĩa cho các đối tượng danh sách; nó thêm một phần tử mới vào cuối danh sách. Trong ví dụ này, nó tương đương với “
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
47“, nhưng hiệu quả hơn.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

4.7 Bàn thêm về định nghĩa hàm

>>> width = 20
>>> height = 5*9
>>> width * height
900
1

Bạn cũng có thể định nghĩa các hàm với số lượng thông số thay đổi. Có ba dạng, và chúng có thể được dùng chung với nhau.
Cảnh báo quan trọng: Giá trị mặc định chỉ được định giá một lần. Điểm này quan trọng khi mặc định là một giá trị khả biến như danh sách, từ điển hoặc các đối tượng của hầu hết mọi lớp. Ví dụ, hàm sau gộp các thông số truyền vào nó từ các lời gọi sau đó:

4.7.1 Giá trị thông số mặc định

Dạng hữu dụng nhất là để chỉ định một giá trị mặc định cho một hoặc nhiều thông số. Dạng này tạo một hàm có thể được gọi với ít thông số hơn là nó được định nghĩa để nhận. Ví dụ:

>>> width = 20
>>> height = 5*9
>>> width * height
900
3

4.7.2 Thông số từ khóa

Các hàm cũng có thể được gọi theo thông số từ khóa (keyword argument) theo dạng “

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
51“. Ví dụ, hàm sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> width = 20
>>> height = 5*9
>>> width * height
900
4

có thể được gọi theo bất kỳ cách nào:

>>> width = 20
>>> height = 5*9
>>> width * height
900
5

nhưng những lời gọi sau đều không hợp lệ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> width = 20
>>> height = 5*9
>>> width * height
900
6

Nói chung, một danh sách thông số phải có bất kỳ thông số vị trí (positional argument) theo sau bởi bất kỳ thông số từ khóa, các từ khóa phải được chọn từ tên thông số chính quy. Các thông số chính quy không nhất thiết phải có giá trị mặc định. Không thông số nào có thể nhận một giá trị nhiều hơn một lần — tên thông số chính quy tương ứng với thông số vị trí không thể được dùng làm từ khóa trong cùng một lời gọi. Sau đây là một ví dụ sai vì giới hạn này:

>>> width = 20
>>> height = 5*9
>>> width * height
900
7

Khi thông số chính quy cuối có dạng

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
52, nó nhận một từ điển (dictionary) chứa tất cả các thông số từ khóa trừ những từ khóa tương ứng với thông số chính quy. Điểm này có thể được dùng chung với một thông số chính quy ở dạng
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
53 (bàn đến trong mục con sau) và nhận một bộ (tuple) chứa các thông số vị trí sau danh sách thông số chính quy. (
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
53 bắt buộc phải xuất hiện trước
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
52.) Ví dụ, nếu ta định nghĩa một hàm như sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> width = 20
>>> height = 5*9
>>> width * height
900
8

Nó có thể được gọi như vậy:

>>> width = 20
>>> height = 5*9
>>> width * height
900
9

và dĩ nhiên nó sẽ in ra:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
0

Lưu ý rằng phương thức

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
56 của danh sách các tên thông số từ khóa được gọi trước khi in nội dung của từ điển
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
57; nếu điều này không được thực hiện, thứ tự các thông số được in ra không xác định.

4.7.3 Danh sách thông số bất kỳ

Cuối cùng, một lựa chọn ít dùng nhất để chỉ định rằng một hàm có thể được gọi với bất kỳ số thông số. Các thông số này sẽ được gói và trong một bộ. Trước các thông số không xác định, không hoặc nhiều hơn các thông số chính quy có thể có mặt.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
1

4.7.4 Tháo danh sách thông số

Trường hợp ngược xảy ra khi các thông số đã nằm trong một danh sách hoặc một bộ nhưng cần được tháo ra cho lời gọi hàm cần những thông số vị trí riêng. Ví dụ, hàm có sẵn

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
21 cần nhận các thông số riêng
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
59 và
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
60. Nếu chúng không được cung cấp riêng lẻ, viết lệnh gọi hàm với toán tử *để tháo các thông số này ra khỏi một danh sách hoặc bộ:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
2

Theo cùng một kiểu, từ điển có thể cung cấp các thông số từ khóa với toán tử

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
61:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
3

4.7.5 Hàm nặc danh dạng lambda

Theo yêu cầu chung, một vài tính năng thường thấy trong các ngôn ngữ lập trình hàm như Lisp đã được thêm vào Python. Với từ khóa lambda, các hàm vô danh (anonymous function) có thể được tạo ra. Đây là một hàm trả vè tổng của hai thông số: “

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
62“. Dạng
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
63 có thể được dùng ở bất kỳ nơi nào cần đối tượng hàm. Cú pháp của chúng giới hạn ở một biểu duy nhất. Về ý nghĩa, chúng chỉ là một cách viết gọn của một định nghĩa hàm bình thường. Giống như các định nghĩa hàm lồng nhau, dạng lambda có thể tham chiếu các biến từ phạm vi chứa nó:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
4

4.7.6 Chuỗi tài liệu

Có những quy luật đang hình thành về nội dung và định dạng của các chuỗi tài liệu.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Dòng đầu tiên cần phải luôn luôn là một tóm tắt ngắn, xúc tích về mục đích của đối tượng. Để dễ hiểu, nó không nên chỉ ra cụ thể tên hoặc kiểu của đối tượng vì chúng có thể có ở hình thức khác (từ khi tên là một động từ diễn tả hoạt động của hàm). Dòng này cần bắt đầu bằng một chữ hoa và kết thúc bằng một dấu chấm.

Nếu có nhiều dòng trong chuỗi tài liệu, dòng thứ hai nên là một dòng trống, rõ ràng phân biệt tóm tắt và phần còn lại. Các dòng sau nên là một hoặc nhiều đoạn hướng dẫn về cách gọi, các hiệu ứng phụ, v.v…

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Dòng đầu tiên cần phải luôn luôn là một tóm tắt ngắn, xúc tích về mục đích của đối tượng. Để dễ hiểu, nó không nên chỉ ra cụ thể tên hoặc kiểu của đối tượng vì chúng có thể có ở hình thức khác (từ khi tên là một động từ diễn tả hoạt động của hàm). Dòng này cần bắt đầu bằng một chữ hoa và kết thúc bằng một dấu chấm.

Đâu là ví dụ của một docstring đa dòng:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
5

5. Cấu trúc dữ liệu trong ngôn ngữ lập trình Python

Chương này diễn giải kỹ hơn một vài điều bạn đã học được, và cũng nói thêm về một số điều mới.

5.1 Bàn thêm về danh sách

Kiểu dữ liệu danh sách (kiểu

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
64) có một số phương thức khác. Đây là toàn bộ các phương thức của đối tượng danh sách:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    65 Thêm một phần tử vào cuối danh sách; tương đương với
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    66.
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    67Nới rộng danh sách bằng cách chèn vào tất cả các phần tử của danh sách chỉ định; tương đương với
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    68.
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    69 Chèn một phần tử vào vị trí chỉ định. Thông số đầu là chỉ mục của phần tử sẽ bị đẩy lùi, cho nên
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    70 chèn vào đầu danh sách, và
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    71 tương đương với
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    72.
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    73Bỏ ra khỏi danh sách phần tử đầu tiên có giá trị là
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    74. Sẽ có lỗi nếu không có phần tử như vậy.
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    75 Bỏ khỏi danh sách phần tử ở vị trí chỉ định, và trả về chính nó. Nếu không chỉ định vị trí,
    import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    76 bỏ và trả về phần tử cuối trong danh sách. (Ngoặc vuông xung quanh
     # -*- coding: iso-8859-15 -*-
    
     currency = u"€"
    
     print ord(currency)
    84 trong khai báo hàm cho biết thông số đó là không bắt buộc, không có nghĩa là bạn cần gõ dấu ngoặc vuông ở vị trí đó. Bạn sẽ thấy cách viết này thường xuyên trong Tham khảo thư viện Python.)
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    78Trả về chỉ mục của phần tử trong danh sách mà có giá trị là x. Sẽ có lỗi nếu không có phần tử như vậy.
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    79 Trả về số lần x xuất hiện trong danh sách.
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    56 Sắp xếp các phần tử trong danh sách, ngay tại chỗ.
  • import os
    filename = os.environ.get('PYTHONSTARTUP')
    if filename and os.path.isfile(filename):
        execfile(filename)
    81Đảo ngược thứ tự các phần tử trong danh sách, ngay tại chỗ.

Một ví dụ có sử dụng hầu hết các phương thức của danh sách:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
6

5.1.1 Dùng danh sách như ngăn xếp

Các phương thức của danh sách làm cho nó rất dễ sử dụng như là ngăn xếp (stack), là nơi mà phần tử cuối được thêm vào là phần tử đầu được lấy ra (“vào sau, ra trước” hay “last-in, first-out”). Để thêm phần tử vào đỉnh của ngăn xếp, dùng

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
46. Để lấy một phần tử từ đỉnh của ngăn xếp, dùng
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
83 mà không chỉ định chỉ mục. Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
7

5.1.2 Dùng danh sách như hàng đợi

Bạn cũng có thể thuận tiện dùng danh sách như là hàng đợi (queue), nơi mà phần tử được thêm vào đầu tiên là phần tử được lấy ra đầu tiên (“vào trước, ra trước” hay “first-in, first-out”). Để thêm một phần tử vào cuối hàng đợi, dùng

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
46. Để lấy một phần tử từ đầu hàng đợi, dùng
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
83 với
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17 là chỉ mục. Ví dụ:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
8

5.1.3 Công cụ lập trình hướng hàm

Có sẵn ba hàm rất hữu dụng khi dùng với danh sách:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
87,
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
88, và
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
89.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
65 Thêm một phần tử vào cuối danh sách; tương đương với
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
66.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
67Nới rộng danh sách bằng cách chèn vào tất cả các phần tử của danh sách chỉ định; tương đương với
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
68.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
69 Chèn một phần tử vào vị trí chỉ định. Thông số đầu là chỉ mục của phần tử sẽ bị đẩy lùi, cho nên
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
70 chèn vào đầu danh sách, và
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
71 tương đương với
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
72.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
73Bỏ ra khỏi danh sách phần tử đầu tiên có giá trị là
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
74. Sẽ có lỗi nếu không có phần tử như vậy.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
75 Bỏ khỏi danh sách phần tử ở vị trí chỉ định, và trả về chính nó. Nếu không chỉ định vị trí,
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
76 bỏ và trả về phần tử cuối trong danh sách. (Ngoặc vuông xung quanh
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
84 trong khai báo hàm cho biết thông số đó là không bắt buộc, không có nghĩa là bạn cần gõ dấu ngoặc vuông ở vị trí đó. Bạn sẽ thấy cách viết này thường xuyên trong Tham khảo thư viện Python.)

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
1

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
78Trả về chỉ mục của phần tử trong danh sách mà có giá trị là x. Sẽ có lỗi nếu không có phần tử như vậy.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
79 Trả về số lần x xuất hiện trong danh sách.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
56 Sắp xếp các phần tử trong danh sách, ngay tại chỗ.

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
81Đảo ngược thứ tự các phần tử trong danh sách, ngay tại chỗ.

Một ví dụ có sử dụng hầu hết các phương thức của danh sách:

5.1.1 Dùng danh sách như ngăn xếp

Các phương thức của danh sách làm cho nó rất dễ sử dụng như là ngăn xếp (stack), là nơi mà phần tử cuối được thêm vào là phần tử đầu được lấy ra (“vào sau, ra trước” hay “last-in, first-out”). Để thêm phần tử vào đỉnh của ngăn xếp, dùng
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
46. Để lấy một phần tử từ đỉnh của ngăn xếp, dùng
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
83 mà không chỉ định chỉ mục. Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
7

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
4

Cách gộp danh sách uyển chuyển hơn nhiều so với

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
88 và có thể được áp dụng cho các biểu thức phức tạp và các hàm lồng nhau:

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
5

5.2 Câu lệnh del

Có một cách để bỏ một phần tử ra khỏi danh sách dựa trên chỉ mục của nó, thay vì giá trị: câu lệnh

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05. Cách này khác với phương thức
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
83 trả về một giá trị. Câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05 cũng có thể được sử dụng để bỏ các miếng cắt (slice) khỏi danh sách hoặc xóa toàn bộ danh sách (điều mà chúng ta đã làm trước đó bằng cách gán một danh sách rỗng vào miếng cắt). Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
6

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05 cũng có thể được dùng để xóa hoàn toàn các biến:

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
7

Tham chiếu tới tên

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
01 sau đó sẽ tạo ra lỗi (ít nhất cho đến khi một giá trị khác được gán vào cho nó). Chúng ta sẽ thấy các cách dùng khác với
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05 sau này.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

5.3 Bộ và dãy

Chúng ta đã thấy rằng danh sách và chuỗi có nhiều thuộc tính chung, như là có chỉ mục, và các toán tử cắt miếng. Chúng là hai ví dụ của dãy (sequence) kiểu dữ liệu. Vì Python là một ngôn ngữ đang phát triển, các kiểu dữ liệu dãy khác có thể được thêm vào. Có một kiểu dãy chuẩn khác: bộ

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11.

Một

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 gồm một số các giá trị phân cách bởi dấu phẩy, ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
8

Khi xuất ra,

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 luôn luôn được kèm giữa hai dấu ngoặc nhằm để cho các
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 lồng nhau có thể được thông dịch chính xác; chúng có thể được nhập vào với ngoặc hoặc không, mặc dù thông thường chúng ta vẫn cần các dấu ngoặc (nếu
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 là một phần của một biểu thức lớn hơn).
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 được dùng nhiều. Ví dụ: cặp tọa độ (x, y), bản ghi nhân viên từ cơ sở dữ liệu, v.v… Giống như chuỗi,
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 không thể bị thay đổi: không thể gán giá trị mới cho từng phần tử của
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 (mặc dù bạn có thể đạt được cùng kết quả với cắt miếng và ghép dãy). Cũng có thể tạo
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 chứa các đối tượng khả biến ví dụ như danh sách.
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 được dùng nhiều. Ví dụ: cặp tọa độ (x, y), bản ghi nhân viên từ cơ sở dữ liệu, v.v… Giống như chuỗi,
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 không thể bị thay đổi: không thể gán giá trị mới cho từng phần tử của
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 (mặc dù bạn có thể đạt được cùng kết quả với cắt miếng và ghép dãy). Cũng có thể tạo
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 chứa các đối tượng khả biến ví dụ như danh sách.

Vấn đề đặc biệt là trong việc tạo nên

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 chứa 0 hoặc một phần tử: cú pháp ngôn ngữ có một vài điểm riêng để thực hiện việc này.
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 rỗng được tạo nên bởi một cặp ngoặc rỗng;
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 một phần tử được tạo bởi một giá trị theo sau bởi một dấu phẩy (việc cho giá trị đơn lẻ vào trong ngoặc không đủ để tạo
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11). Xấu, nhưng hiệu quả. Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
9

Câu lệnh

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
24 là một ví dụ của việc đóng gói
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
25(tuple packing): các giá trị
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
26,
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
27 và
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
28 được gói lại vào trong một
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11. Và quá trình ngược:

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
0

Và nó được gọi là tháo dãy. Việc tháo dãy yêu cầu danh sách các biến bên trái có cùng số phần tử như độ lớn của dãy. Chú ý rằng phép đa gán (multiple assignment) thật ra chỉ là sự tổng hợp của việc gói

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 và tháo dãy.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

5.3 Bộ và dãy

Chúng ta đã thấy rằng danh sách và chuỗi có nhiều thuộc tính chung, như là có chỉ mục, và các toán tử cắt miếng. Chúng là hai ví dụ của dãy (sequence) kiểu dữ liệu. Vì Python là một ngôn ngữ đang phát triển, các kiểu dữ liệu dãy khác có thể được thêm vào. Có một kiểu dãy chuẩn khác: bộ # this is the first comment SPAM = 1                 # and this is the second comment                          #... and now a third! STRING = "# This is not a comment."11.

Một

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 gồm một số các giá trị phân cách bởi dấu phẩy, ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

5.3 Bộ và dãy

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
1

Chúng ta đã thấy rằng danh sách và chuỗi có nhiều thuộc tính chung, như là có chỉ mục, và các toán tử cắt miếng. Chúng là hai ví dụ của dãy (sequence) kiểu dữ liệu. Vì Python là một ngôn ngữ đang phát triển, các kiểu dữ liệu dãy khác có thể được thêm vào. Có một kiểu dãy chuẩn khác: bộ # this is the first comment SPAM = 1                 # and this is the second comment                          #... and now a third! STRING = "# This is not a comment."11.

Một

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11 gồm một số các giá trị phân cách bởi dấu phẩy, ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

5.3 Bộ và dãy

Công việc chính của từ điển là chứa một giá trị vào một khóa nào đó và lấy lại giá trị từ khóa đó. Cũng có thể xóa một cặp

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
40 với
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05. Nếu bạn chứa vào một khóa đã có sẵn, giá trị cũ sẽ bị mất. Lấy giá trị từ một khóa không tồn tại sẽ gây nên lỗi.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Phương thức

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
44 của đối tượng từ điển trả về một danh sách các khóa đã được dùng trong từ điển, theo một thứ tự bất kỳ (nếu bạn muốn chúng được sắp xếp, chỉ cần áp dụng phương thức
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
56 vào danh sách các khóa). Để kiểm tra xem một khóa có trong từ điển hay không, có thể dùng phương thức
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
46 hoặc từ khóa
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
50.

Đây là một ví dụ nhỏ về cách dùng từ điển:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
2

Phương thức

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
48 dùng để tạo từ điển trực tiếp từ các danh sách các cụm khóa-giá trị chứa trong
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11. Khi các cụm có một mẫu nào đó, việc gộp danh sách có thể chỉ ra ngắn gọn danh sách khóa-giá trị.

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
3

Ở phần sau của bài chỉ dẫn chúng ta sẽ tìm hiểu về các biểu thức bộ tạo thích hợp hơn với việc cung cấp các cặp khóa-giá trị vào hàm khởi tạo

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
48. Khi mà khóa là những chuỗi đơn giản, đôi khi nó sẽ dễ hơn nếu chỉ định các cụm bằng thống số từ khóa:
Khi mà khóa là những chuỗi đơn giản, đôi khi nó sẽ dễ hơn nếu chỉ định các cụm bằng thống số từ khóa:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
4

5.6 Kỹ thuật lặp

Khi lặp qua từ điển, khóa và giá trị tương ứng có thể được lấy ra cùng lúc bằng phương thức

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
51.

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
5

Khi lặp qua một dãy, vị trí chỉ mục và giá trị tương ứng có thể được lấy ra cùng lúc bằng hàm

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
52.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
6

Để lặp qua hai hoặc nhiều dãy cùng lúc, các phần tử có thể được ghép với nhau bằng hàm

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
53.

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
7

Để lặp qua một dãy theo thứ tự đảo, đầu tiên chỉ định dãy đó theo thứ tự xuôi, rồi gọi hàm

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
54.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
8

Để lặp qua một dãy theo thứ tự đã sắp xếp, dùng hàm

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
55 và nó sẽ trả về một danh sách đã sắp xếp trong khi vẫn để danh sách gốc nguyên vẹn.

>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
9

5.7 Bàn thêm về điều kiện

Điều kiện dùng trong các câu lệnh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
31 và
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
13 có thể chứa bất kỳ toán tử nào, không chỉ là phép so sánh.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Các toán tử so sánh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
50 và
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
59 kiểm tra xem giá trị có mặt (hoặc không có mặt) trong một dãy. Toán tử
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
60 và
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
61 so sánh xem hai đối tượng có phải cùng là một đối tượng hay không; việc này chỉ quan trọng đối với các đối tượng khả biến như danh sách. Mọi toán tử so sánh có cùng độ ưu tiên, thấp hơn của các toán tử số.

So sánh có thể được nối với nhau. Ví dụ như,

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
62 kiểm tra xem
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
01 nhỏ hơn
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
02 và hơn nữa
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
02 bằng với
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
66.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Phép so sánh có thể được ghép với nhau bằng toán tử Boolean

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
67 và
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
68, và kết quả của phép so sánh (hoặc của mọi biểu thức Boolean) có thể được đảo ngược với
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
69. Các toán tử này có độ ưu tiên thấp hơn các toán tử so sánh; giữa chúng,
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
69 có độ ưu tiên cao nhất và
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
68 thấp nhất, để cho
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
72 tương đương với
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
73. Như mọi khi, dấu ngoặc đơn có thể được dùng để cho biết kết cấu đúng ý.

Các toán tử Boolean and và or còn được gọi là đoản mạch (short-circuit) toán tử: toán hạng của chúng được đánh giá từ trái qua phải, và việc định giá dừng lại ngay khi kết quả được xác định. Ví dụ như, nếu A và C là đúng nhưng B là sai, A and B and C không định giá biểu thức C. Khi dùng như một giá trị chung chung và không phải như một Boolean, giá trị trả về của một toán tử đoản mạch là thông số được định giá cuối cùng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Có thể gán kết quả của một phép so sánh hoặc một biểu thức Boolean vào một biến. Ví dụ,

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
00

Chú ý rằng trong Python, khác với C, phép gán không thể có mặt trong biểu thức. Các lập trình viên C sẽ không hài lòng với việc này, nhưng nó tránh một nhóm lớn các lỗi thường gặp trong chương trình C: nhập vào

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
58 trong một biểu thức khi mà
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
08 được nhằm tới.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

5.8 So sánh dãy và các kiểu khác

Đối tượng dãy có thể được so sánh với đối tượng khác cùng kiểu dãy. Sự so sánh dùng từ điển thứ tự: đầu tiên hai phần tử đâu được so sánh, và nếu chúng khác nhau thì kết quả được xác định; nếu chúng bằng nhau thì hai phần tử kế sẽ được so sánh và cứ thế, cho đến cuối một trong hai dãy. Nếu hai phần tử được so sánh lại là hai phần dãy cùng kiểu, phép so sánh từ điển lại được thực hiện đệ quy như vậy. Nếu mọi phần tử trong hai dãy đều bằng nhau thì chúng được coi là bằng nhau. Nếu một dãy là dãy con ban đầu của dãy kia, thì dãy ngắn hơn sẽ là dãy bé hơn. Thứ tự từ điển đối với chuỗi sử dụng thứ tự ASCII cho từng ký tự. Một vài ví dụ về việc so sánh dãy cùng kiểu:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
01

Lưu ý rằng so sánh các đối tượng khác kiểu cũng được chấp nhận. Kết quả có thể đoán được nhưng ngoài ý muốn: các kiểu được xếp theo thứ tự tên của chúng. Do đó[3], một danh sách (

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
64) luôn nhỏ hơn một chuỗi (
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
77), và một chuỗi luôn nhỏ hơn một
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11, v.v…. Các kiểu số lẫn lộn được so sánh theo giá trị của chúng, do đó
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
17 bằng
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
80, v.v…

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

6. Mô-đun

Nếu bạn thoát khỏi trình thông dịch và chạy nó lại, những gì bạn đã định nghĩa (hàm và biến) đều bị mất. Do đó, nếu bạn muốn viết một chương trình dài hơn, thì tốt nhất bạn nên dùng một trình soạn thảo để chuẩn bị đầu vào cho trình thông dịch và chạy nó với tập tin vào này. Việc này được gọi là tạo kịch bản (script). Khi chương trình của bạn trở nên dài hơn, bạn sẽ muốn tách nó ra thành nhiều tập tin để dễ duy trì. Bạn sẽ muốn dùng một hàm thuận tiện mà bạn đã viết trong nhiều chương trình mà không cần phải chép lại định nghĩa của nó vào các chương trình đó.

Để hỗ trợ việc này, Python có một cách đặt các định nghĩa vào một tập tin và dùng chúng trong một kịch bản hoặc trong một phiên làm việc với trình thông dịch. Tập tin này được gọi là mô-đun (module); các định nghĩa từ một mô-đun có thể được nhập (import) vào các mô-đun khác hoặc vào mô-đun chính (tập hợp các biến mà bạn có thể truy cập tới trong một kịch bản được chạy ở cấp cao nhất và trong chế độ máy tính).

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

6. Mô-đun

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
02

Nếu bạn thoát khỏi trình thông dịch và chạy nó lại, những gì bạn đã định nghĩa (hàm và biến) đều bị mất. Do đó, nếu bạn muốn viết một chương trình dài hơn, thì tốt nhất bạn nên dùng một trình soạn thảo để chuẩn bị đầu vào cho trình thông dịch và chạy nó với tập tin vào này. Việc này được gọi là tạo kịch bản (script). Khi chương trình của bạn trở nên dài hơn, bạn sẽ muốn tách nó ra thành nhiều tập tin để dễ duy trì. Bạn sẽ muốn dùng một hàm thuận tiện mà bạn đã viết trong nhiều chương trình mà không cần phải chép lại định nghĩa của nó vào các chương trình đó.

Để hỗ trợ việc này, Python có một cách đặt các định nghĩa vào một tập tin và dùng chúng trong một kịch bản hoặc trong một phiên làm việc với trình thông dịch. Tập tin này được gọi là mô-đun (module); các định nghĩa từ một mô-đun có thể được nhập (import) vào các mô-đun khác hoặc vào mô-đun chính (tập hợp các biến mà bạn có thể truy cập tới trong một kịch bản được chạy ở cấp cao nhất và trong chế độ máy tính).

Mô-đun là một tập tin chứa các định nghĩa và câu lệnh Python. Tên tập tin là tên của mô-đun với đuôi

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
81 được gắn vào. Trong một mô-đun, tên của mô-đun (là một chuỗi) có thể được truy cập qua một biến toàn cục
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
82. Ví dụ, dùng trình soạn thảo của bạn để tạo một tập tin đặt tên là
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
83 trong thư mục hiện tại với nội dung sau:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
04

Bây giờ chạy trình thông dịch Python và nhập mô-đun này với dòng lệnh sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
03

Việc này sẽ không nhập trực tiếp các tên hàm định nghĩa trong # this is the first comment SPAM = 1                 # and this is the second comment                          #... and now a third! STRING = "# This is not a comment."84 vào bảng ký hiệu (# this is the first comment SPAM = 1                 # and this is the second comment                          #... and now a third! STRING = "# This is not a comment."85); nó chỉ nhập tên mô-đun # this is the first comment SPAM = 1                 # and this is the second comment                          #... and now a third! STRING = "# This is not a comment."84 mà thôi. Dùng tên mô-đun bạn có thể truy cập các hàm:

Nếu bạn định dùng một hàm thường xuyên, thì bạn có thể gán nó vào một tên cục bộ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
05

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

6.1 Bàn thêm về mô-đun
Có một biến thể của câu lệnh

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
88 để nhập nhiều tên trực tiếp từ một mô-đun vào trong bảng ký hiệu của mô-đun nhập. Ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
06

Mô-đun có thể chứa các câu lệnh khả thi cũng như các định nghĩa hàm. Các câu lệnh này nhằm mục đích khởi tạo mô-đun. Chúng sẽ chỉ được chạy lần đầu mô-đun được nhập ở đâu đó[4].
Và một biến thể khác để nhập tất cả các tên từ một mô-đun:

Mỗi mô-đun có một bảng ký hiệu riêng của nó và được dùng như bảng toàn cục đối với mọi hàm được định nghĩa trong mô-đun. Do đó, tác giả của một mô-đun có thể sử dụng các biến toàn cục trong mô-đun mà không phải lo lắng về việc trùng lặp với các biến toàn cục của người dùng. Mặt khác, nếu bạn biết bạn đang làm gì, bạn có thể truy cập vào các biến toàn cục của mô-đun với cùng một cách dùng để truy cập các hàm của nó
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
87.

Mô-đun có thể nhập các mô-đun khác. Thông thường (nhưng không bắt buộc) ta hay để tất cả các lệnh import ở đầu một mô-đun (hoặc kịch bản). Các tên của mô-đun bị nhập được đặt trong bảng ký hiệu toàn cục của mô-đun nhập nó. Có một biến thể của câu lệnh

# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
88 để nhập nhiều tên trực tiếp từ một mô-đun vào trong bảng ký hiệu của mô-đun nhập. Ví dụ:

Câu lệnh này không đưa tên mô-đun bị nhập vào bảng ký hiệu cục bộ (do đó trong ví dụ này,
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
84 chưa được định nghĩa) Và một biến thể khác để nhập tất cả các tên từ một mô-đun:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
07
Thật ra, mô-đun được tìm trong danh sách các thư mục chỉ định bởi biến sys.path đã được thiết lập từ thư mục chứa kịch bản nguồn (hoặc thư mục hiện tại), PYTHONPATH và các mặc định khi cài đặt. Điều này cho phép các chương trình Python thay đổi hoặc thay thế đường dẫn tìm mô-đun. Lưu ý rằng vì thư mục chứa kịch bản đang chạy nằm trong đường dẫn tìm kiếm, tên của kịch bản nhất thiết phải không trùng với tên các mô-đun chuẩn, nếu không thì Python sẽ cố sức nạp kịch bản như là một mô-đun khi mô-đun đó được nhập vào. Thông thường điều này sẽ gây lỗi. Xem mục 6.2, “Các mô-đun chuẩn,” để biết thêm chi tiết.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

6.1.2 Các tập tin Python “đã dịch”

Như một cách quan trọng để tăng tốc quá trình khởi động của các chương trình ngắn có dùng nhiều mô-đun chuẩn, nếu tập tin có tên spam.pyc tồn tại trong thư mục mà spam.py được tìm thấy, tập tin này được giả định là phiên bản đã được “biên dịch byte” (byte-compile) của mô-đun spam. Thời gian thay đổi của phiên bản spam.py dùng để tạo spam.pyc được lưu lại trong spam.pyc, và tập tin.pyc sẽ bị bỏ qua nếu chúng không khớp nhau. Thông thường, bạn không cần làm gì cả để tạo tập tin spam.pyc. Khi nào spam.py được biên dịch thành công, Python sẽ thử ghi phiên bản đã biên dịch ra spam.pyc. Nếu việc ghi này thất bại thì cũng không có lỗi gì xảy ra; nếu vì lý do gì đó mà tập tin không được ghi đầy đủ, tập tin spam.pyc sẽ bị đánh dấu là không hợp lệ và sẽ bị bỏ qua sau này. Nội dung của tập tin spam.pyc không phụ thuộc vào hệ thống, do đó một thư mục mô-đun Python có thể được chia xẻ với nhiều máy trên các kiến trúc khác nhau. Một vài mẹo cho chuyên gia:
Thông thường, bạn không cần làm gì cả để tạo tập tin spam.pyc. Khi nào spam.py được biên dịch thành công, Python sẽ thử ghi phiên bản đã biên dịch ra spam.pyc. Nếu việc ghi này thất bại thì cũng không có lỗi gì xảy ra; nếu vì lý do gì đó mà tập tin không được ghi đầy đủ, tập tin spam.pyc sẽ bị đánh dấu là không hợp lệ và sẽ bị bỏ qua sau này. Nội dung của tập tin spam.pyc không phụ thuộc vào hệ thống, do đó một thư mục mô-đun Python có thể được chia xẻ với nhiều máy trên các kiến trúc khác nhau.
Một vài mẹo cho chuyên gia:

  • Khi trình thông dịch Python được chạy với cờ -O, mã tối ưu được tạo và lưu trong các tập tin.pyo. Trình tối ưu hóa hiện tại không giúp gì nhiều, nó chỉ bỏ đi các lệnh
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    91. Khi -O được dùng, tất cả mã byte (bytecode) đều được tối ưu;
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    92 bị bỏ qua và
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    81 được biên dịch ra mã byte tối ưu.-O, mã tối ưu được tạo và lưu trong các tập tin.pyo. Trình tối ưu hóa hiện tại không giúp gì nhiều, nó chỉ bỏ đi các lệnh
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    91. Khi -O được dùng, tất cả mã byte (bytecode) đều được tối ưu;
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    92 bị bỏ qua và
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    81 được biên dịch ra mã byte tối ưu.
  • Truyền hai cờ -O vào trình thông dịch Python (-OO) sẽ khiến trình biên dịch mã byte thực hiện những tối ưu mà trong những trường hợp hiếm hoi có thể dẫn đến hỏng hóc trong chương trình. Hiện tại chỉ có các chuỗi
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    94 được bỏ đi khỏi mã byte, làm cho tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    95 gọn hơn. Vì một vài chương trình phụ thuộc vào các chuỗi này, bạn nên chỉ dùng tùy chọn này nếu bạn rõ bạn đang làm gì.-O vào trình thông dịch Python (-OO) sẽ khiến trình biên dịch mã byte thực hiện những tối ưu mà trong những trường hợp hiếm hoi có thể dẫn đến hỏng hóc trong chương trình. Hiện tại chỉ có các chuỗi
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    94 được bỏ đi khỏi mã byte, làm cho tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    95 gọn hơn. Vì một vài chương trình phụ thuộc vào các chuỗi này, bạn nên chỉ dùng tùy chọn này nếu bạn rõ bạn đang làm gì.
  • Một chương trình không chạy nhanh hơn khi nó được đọc từ một tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    92 hay
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    95 so với khi nó được đọc từ tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    81; một điểm nhanh hơn duy nhất ở các tập tin.pyc hay.pyo là tốc độ chúng được nạp.
  • Khi một kịch bản được chạy bằng cách nhập tên nó ở dòng lệnh, thì mã byte của kịch bản không bao giờ được ghi vào tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    92 hay
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    95. Do đó, thời gian khởi động của một kịch bản có thể được giảm xuống bằng cách chuyển hầu hết mã của nó thành mô-đun và tạo một kịch bản nhỏ để nhập mô-đun đó. Bạn cũng có thể chạy tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    92 hay
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    95 trực tiếp từ dòng lệnh.
  • Có thể dùng tập tin
    >>> 2+2
    4
    >>> # This is a comment
    ... 2+2
    4
    >>> 2+2  # and a comment on the same line as code
    4
    >>> (50-5*6)/4
    5
    >>> # Integer division returns the floor:
    ... 7/3
    2
    >>> 7/-3
    -3
    03 (hay
    >>> 2+2
    4
    >>> # This is a comment
    ... 2+2
    4
    >>> 2+2  # and a comment on the same line as code
    4
    >>> (50-5*6)/4
    5
    >>> # Integer division returns the floor:
    ... 7/3
    2
    >>> 7/-3
    -3
    04 khi -O được dùng) và không có tập tin
    >>> 2+2
    4
    >>> # This is a comment
    ... 2+2
    4
    >>> 2+2  # and a comment on the same line as code
    4
    >>> (50-5*6)/4
    5
    >>> # Integer division returns the floor:
    ... 7/3
    2
    >>> 7/-3
    -3
    05 của cùng một mô-đun. Việc này được tận dụng để phân phối một thư viện Python dưới một dạng hơi khó để dịch ngược.-O được dùng) và không có tập tin
    >>> 2+2
    4
    >>> # This is a comment
    ... 2+2
    4
    >>> 2+2  # and a comment on the same line as code
    4
    >>> (50-5*6)/4
    5
    >>> # Integer division returns the floor:
    ... 7/3
    2
    >>> 7/-3
    -3
    05 của cùng một mô-đun. Việc này được tận dụng để phân phối một thư viện Python dưới một dạng hơi khó để dịch ngược.
  • Mô-đun compileall có thể tạo các tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    92 (hoặc các tập tin
    # this is the first comment
    SPAM = 1                 # and this is the second comment
                             #... and now a third!
    STRING = "# This is not a comment."
    95 khi -O được dùng) cho mọi mô-đun trong một thư mục.-O được dùng) cho mọi mô-đun trong một thư mục.

6.2 Các mô-đun chuẩn

Python có một thư viện các mô-đun chuẩn, được nói tới trong một tài liệu khác, Tham khảo thư viện Python (từ nay gọi là “Tài liệu tham khảo”’). Một vài mô-đun được chuyển thẳng vào trình thông dịch; chúng cung cấp các tác vụ không nằm trong phạm vi chính của ngôn ngữ nhưng cũng được tạo sẵn vì hiệu quả cao hoặc để truy cập vào những chức năng của hệ điều hành ví dụ như các lệnh gọi hệ thống. Tập hợp các mô-đun này là một tùy chọn cấu hình lệ thuộc vào hệ thống. Ví dụ, mô-đun

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
08 chỉ có trên các hệ hỗ trợ Amoeba. Cần phải nhắc đến mô-đun: sys, được đưa vào trong mọi trình thông dịch Python. Các biến
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
09 và
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
10 định nghĩa những chuỗi được dùng như dấu nhắc chính và phụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
08

Hai biến này chỉ được định nghĩa khi trình thông dịch chạy ở chế độ tương tác. Biến

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
11 là một danh sách các chuỗi quyết định đường dẫn tìm kiếm các mô-đun của trình thông dịch. Nó được khởi tạo theo đường dẫn mặc định từ biến môi trường PYTHONPATH, hoặc từ một giá trị có sẵn nếu PYTHONPATH không được thiết lập. Bạn có thể sửa nó bằng cách dùng các công cụ trên danh sách:
Biến
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
11 là một danh sách các chuỗi quyết định đường dẫn tìm kiếm các mô-đun của trình thông dịch. Nó được khởi tạo theo đường dẫn mặc định từ biến môi trường PYTHONPATH, hoặc từ một giá trị có sẵn nếu PYTHONPATH không được thiết lập. Bạn có thể sửa nó bằng cách dùng các công cụ trên danh sách:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
09

6.3 Hàm dir()

Hàm có sẵn

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
12 được dùng để tìm các tên một mô-đun định nghĩa. Nó trả về một danh sách các chuỗi đã sắp xếp:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
10

Không có thông số,

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
12 liệt kê các tên bạn đã định nghĩa:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
11

Lưu ý rằng nó liệt kê mọi loại tên: biến, mô-đun, hàm, v.v…

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
12 không liệt kê tên của các hàm và biến có sẵn. Nếu bạn muốn có danh sách của chúng, thì chúng được định nghĩa trong mô-đun chuẩn
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
15:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
12

6.4 Gói

Gói (package) là một cách để cấu trúc vùng tên mô-đun của Python bằng cách dùng “tên mô-đun có chấm”. Ví dụ, tên mô-đun

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
16 chỉ ra mô-đun con tên “
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
17” trong một gói tên “
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
18“. Cũng như việc sử dụng mô-đun giúp tác giả của các mô-đun khác nhau không phải lo lắng về các biến toàn cục của nhau, việc sử dụng tên mô-đun có chấm giúp tác giả của các gói đa mô-đun như NumPy hay Python Imaging Library không phải lo lắng về tên mô-đun của họ. Giả sử bạn muốn thiết kế một tập hợp các mô-đun (một “gói”) nhằm vào việc xử lý các tập tin và dữ liệu âm thanh. Có nhiều định dạng tập tin âm thanh (thường được nhận dạng dựa vào phần mở rộng, ví dụ: .wav, .aiff, .au), do đó bạn sẽ cần tạo và duy trì một tập hợp luôn tăng của các mô-đun cho việc chuyển đổi giữa các định dạng khác nhau. Cũng có nhiều tác vụ khác nhau bạn muốn thực hiện với dữ liệu âm thanh (ví dụ như tổng hợp, thêm tiếng vang, áp dụng chức năng làm bằng, tạo ra hiệu ứng nổi), do đó bạn sẽ không ngừng viết một loạt các mô-đun để thực hiện các tác vụ này. Sau đây là một cấu trúc minh họa cho gói của bạn (được trình bày theo cách của một hệ tập tin phân cấp)
Giả sử bạn muốn thiết kế một tập hợp các mô-đun (một “gói”) nhằm vào việc xử lý các tập tin và dữ liệu âm thanh. Có nhiều định dạng tập tin âm thanh (thường được nhận dạng dựa vào phần mở rộng, ví dụ: .wav, .aiff, .au), do đó bạn sẽ cần tạo và duy trì một tập hợp luôn tăng của các mô-đun cho việc chuyển đổi giữa các định dạng khác nhau. Cũng có nhiều tác vụ khác nhau bạn muốn thực hiện với dữ liệu âm thanh (ví dụ như tổng hợp, thêm tiếng vang, áp dụng chức năng làm bằng, tạo ra hiệu ứng nổi), do đó bạn sẽ không ngừng viết một loạt các mô-đun để thực hiện các tác vụ này. Sau đây là một cấu trúc minh họa cho gói của bạn (được trình bày theo cách của một hệ tập tin phân cấp)

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
13

Khi nhập một gói, Python tìm trong các thư mục từ

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
11 để tìm thư mục con của gói.

Các tập tin

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
20 là cần thiết để cho Python biết các thư mục chứa các gói; việc này được đặt ra để tránh các thư mục với tên chung, ví dụ như “string”, vô tình che mất mô-đun hợp lệ xuất hiện sau trong đường dẫn tìm kiếm. Trong trường hợp đơn giản nhất,
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
20 có thể chỉ là một tập tin rỗng, nhưng nó cũng có thể thực thi các mã thiết lập của gói hoặc thiết lập biến
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
22, sẽ được nhắc đến sau.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Người dùng gói này có thể nhập từng mô-đun riêng lẻ từ gói, ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
14

Nó sẽ nạp mô-đun con

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
23. Nó phải được tham chiếu bằng tên đầy đủ.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
15

Cách nhập mô-đun con khác là:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
16

Nó cũng nạp luôn mô-đun con

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
24, và làm cho nó có thể được truy cập mà không cần phần tên gói, do đó nó có thể được dùng như sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
17

Một biến thể khác là nhập hàm hoặc biến mình muốn một cách trực tiếp:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
18

Một lần nữa, lệnh này nạp mô-đun con echo, nhưng nó làm hàm

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
25 có thể được sử dụng trực tiếp:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
19

Lưu ý rằng khi sử dụng

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
26,
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
27 có thể hoặc là mô-đun con (hoặc gói con) của gói, hoặc là một tên nào khác được định nghĩa trong gói, chẳng hạn như một hàm, lớp, hoặc biến. Câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
88 trước hết kiểm tra xem
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
27 có được định nghĩa trong gói; nếu không, nó giả định rằng đó là mô-đun và thử nạp nó. Nếu không thể tìm thấy mô-đun, ngoại lệ
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
30 sẽ xuất hiện. Ngược lại, khi dùng cú pháp như import
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
31, mỗi tiểu mục trừ tiểu mục cuối phải là một gói; tiểu mục cuối có thể là một mô-đun hoặc một gói nhưng không thể là một lớp, hay hàm, hay biến được định nghĩa trong tiểu mục trước.
Ngược lại, khi dùng cú pháp như import
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
31, mỗi tiểu mục trừ tiểu mục cuối phải là một gói; tiểu mục cuối có thể là một mô-đun hoặc một gói nhưng không thể là một lớp, hay hàm, hay biến được định nghĩa trong tiểu mục trước.

6.4.1 Nhập * từ một gói

Bây giờ chuyện gì xảy ra khi bạn viết

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
32? Tốt nhất, bạn sẽ hy vọng mã này sẽ tìm các mô-đun có trong gói và nhập tất cả chúng vào. Đáng tiếc là tác vụ này không chạy ổn định lắm trên hệ Mac và Windows vì hệ thống tập tin không luôn chứa thông tin chính xác về phân biệt hoa/thường trong tên tập tin. Trên các hệ này, không có cách nào bảo đảm để biết được nếu một tập tin
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
33 cần được nhập vào như là một mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
24,
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
35 hay
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
36. (Ví dụ, Windows 95 có một thói quen là hiện mọi tên tập tin với ký tự đầu tiên viết hoa.) Hạn chế tên 8+3 của DOS cũng tạo ra thêm một vấn đề thú vị với các tên mô-đun dài.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Người dùng gói này có thể nhập từng mô-đun riêng lẻ từ gói, ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
20

Điều này có nghĩa là

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
32 sẽ nhập ba mô-đun được chỉ định từ gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
42. Nếu
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
22 không được định nghĩa, câu lệnh
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
32 sẽ không nhập mọi mô-đun con từ gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
45 vào vùng tên hiện tại; nó chỉ đảm bảo rằng gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
45 đã được nhập (có thể chạy các mã khởi tạo trong
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
20) và sau đó nhập các tên được định nghĩa trong gói. Nó bao gồm các tên (và mô-đun con đã được nạp) được định nghĩa bởi
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
20. Nó cũng gồm các mô-đun con của gói đã được nạp bởi câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
88 trước. Xem đoạn mã này:
Nếu
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
22 không được định nghĩa, câu lệnh
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
32 sẽ không nhập mọi mô-đun con từ gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
45 vào vùng tên hiện tại; nó chỉ đảm bảo rằng gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
45 đã được nhập (có thể chạy các mã khởi tạo trong
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
20) và sau đó nhập các tên được định nghĩa trong gói. Nó bao gồm các tên (và mô-đun con đã được nạp) được định nghĩa bởi
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
20. Nó cũng gồm các mô-đun con của gói đã được nạp bởi câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
88 trước. Xem đoạn mã này:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
21

Trong ví dụ này, các mô-đun

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
24 và
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
51 được nhập vào vùng tên hiện tại vì chúng được định nghĩa trong gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
45 khi câu lệnh
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
53 được thực thi. (Cũng sẽ có cùng kết quả khi
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
22 được định nghĩa.) Lưu ý là bình thường việc nhập
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
76 từ một mô-đun hay gói được coi là xấu, vì nó hay dẫn tới các mã khó đọc. Tuy nhiên, khi dùng trong một phiên làm việc tương tác thì nó giúp tiết kiệm công nhập phím, và một vài mô-đun được thiết kế để chỉ xuất các tên theo một vài mẫu cụ thể. Nhớ rằng, không có gì sai trái với việc dùng
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
56! Đúng ra, đây là cách viết được khuyến khích trừ khi mô-đun nhập (importing module) cần dùng mô-đun con có cùng tên ở một gói khác.
Lưu ý là bình thường việc nhập
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
76 từ một mô-đun hay gói được coi là xấu, vì nó hay dẫn tới các mã khó đọc. Tuy nhiên, khi dùng trong một phiên làm việc tương tác thì nó giúp tiết kiệm công nhập phím, và một vài mô-đun được thiết kế để chỉ xuất các tên theo một vài mẫu cụ thể.
Nhớ rằng, không có gì sai trái với việc dùng
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
56! Đúng ra, đây là cách viết được khuyến khích trừ khi mô-đun nhập (importing module) cần dùng mô-đun con có cùng tên ở một gói khác.

6.4.2 Tham chiếu nội trong gói

Các mô-đun con thường cần tham chiếu lẫn nhau. Ví dụ, Mô-đun

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
51 có thể sử dụng mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
24. Trong thực tế, những tham chiếu này quá phổ biến đễn nỗi câu lệnh import đầu tiên sẽ tìm trong gói chứa (containing package) trước khi tìm trong đường dẫn tìm kiếm mô-đun chuẩn. Do đó, mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
51 có thể đơn giản dùng
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
60 hay
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
61. Nếu mô-đun được nhập (imported module) không thể tìm ra trong gói chứa (là gói mà mô-đun hiện tại là một mô-đun con), câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
88 tìm một mô-đun cấp cao nhất có cùng tên. Khi các gói được cấu trúc thành các gói con (như gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
42 trong ví dụ), không có đường tắt để tham chiếu tới các mô-đun con của các gói kế cận – tên đầy đủ của gói con phải được chỉ định. Ví dụ, nếu mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
64 cần dùng mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
24 trong gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
45, nó có thể dùng
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
67. Bắt đầu từ Python 2.5, ngoài việc nhập tương đối hiểu ngầm (implicit relative import) đã nói, bạn có thể viết lệnh nhập tương đối xác định (explicit relative import) với kiểu
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
68 của câu lệnh nhập. Các lệnh nhập tương đối xác định dùng chấm ở đầu để chỉ định các gói hiện tại và gói cha có mặt trong câu lệnh nhập. Ví dụ từ mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
51, bạn sẽ dùng:
Khi các gói được cấu trúc thành các gói con (như gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
42 trong ví dụ), không có đường tắt để tham chiếu tới các mô-đun con của các gói kế cận – tên đầy đủ của gói con phải được chỉ định. Ví dụ, nếu mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
64 cần dùng mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
24 trong gói
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
45, nó có thể dùng
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
67.
Bắt đầu từ Python 2.5, ngoài việc nhập tương đối hiểu ngầm (implicit relative import) đã nói, bạn có thể viết lệnh nhập tương đối xác định (explicit relative import) với kiểu
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
68 của câu lệnh nhập. Các lệnh nhập tương đối xác định dùng chấm ở đầu để chỉ định các gói hiện tại và gói cha có mặt trong câu lệnh nhập. Ví dụ từ mô-đun
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
51, bạn sẽ dùng:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
22

Lưu ý cả hai lệnh nhập tương đối xác định và hiểu ngầm đều dựa vào tên của mô-đun hiện tại. Vì tên của mô-đun chính luôn luôn là “

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
70“, mô-đun được nhằm dể dùng như mô-đun chính của một chương trình Python nên luôn luôn cùng câu lệnh nhập tuyệt đối.

6.4.3 Gói trong nhiều thư mục

Gói còn có thêm một thuộc tính đặc biệt khác,

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
71. Nó được khởi tạo là danh sách chứa tên của thư mục chứa tập tin
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
20 của gói trước khi mã trong tập tin đó được thực thi. Biến này có thể được thay đổi; làm như vậy sẽ ảnh hưởng các tìm kiếm mô-đun và gói con chứa trong gói này trong tương lai. Mặc dù tính năng này không thường được dùng, nó có thể được tận dụng để mở rộng tập hợp các mô-đun tìm thấy trong một gói.
Mặc dù tính năng này không thường được dùng, nó có thể được tận dụng để mở rộng tập hợp các mô-đun tìm thấy trong một gói.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

7. Vào và ra (nhập và xuất) trong lập trình Python

Có nhiều các để thể hiện đầu ra của một chương trình; dữ liệu có thể được in ra ở dạng người đọc được, hoặc viết vào một tập tin để dùng sau này. Chương này sẽ bàn về một vài khả năng đó.

7.1 Định dạng ra đẹp hơn

Chúng ta đã gặp hai cách để viết giá trị: câu lệnh biểu thức và câu lệnh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
12. (Cách thứ ba là dùng phương thức
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
74 của đối tượng tập tin; tập tin đầu ra chuẩn có thể được tham chiếu tới theo
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
75. Xem Tham khảo thư viện Python để biết thêm chi tiết.)

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

7. Vào và ra (nhập và xuất) trong lập trình Python

Có nhiều các để thể hiện đầu ra của một chương trình; dữ liệu có thể được in ra ở dạng người đọc được, hoặc viết vào một tập tin để dùng sau này. Chương này sẽ bàn về một vài khả năng đó.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Một câu hỏi vẫn còn đó: làm sao để chuyển giá trị thành chuỗi? May mắn thay Python có một cách để chuyển bất kỳ giá trị nào thành chuỗi: truyền nó vào hàm

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
82 hay hàm
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96. Dấu nháy ngược (
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
84) tương đương với
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
82, nhưng chúng không còn được dùng trong mã Python mới, và rất có thể sẽ không còn trong các phiên bản ngôn ngữ sau này.

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96 nhằm để trả về cách thể hiện giá trị một cách dễ đọc, trong khi
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
82 nhằm để tạo cách thể hiện mà trình thông dịch có thể đọc (hoặc sẽ sinh lỗi
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
88 nếu không có cú pháp tương đương). Đối với các đối tượng không có cách thể hiện cho người đọc,
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96 sẽ trả về cùng giá trị như
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
82. Nhiều giá trị, ví dụ như số, hoặc cấu trúc như danh sách và từ điển, có cùng cách thể hiện với cả hai hàm này. Riêng chuỗi và số chấm động có hai cách thể hiện khác biệt.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Một vài ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
23

Đây là hai cách để viết một bảng bình phương và lập phương:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
24

(Chú ý một khoảng trắng được thêm vào giữa các cột theo cách hoạt động của

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
12 : nó luôn luôn thêm khoảng trắng giữa các thông số.) Ví dụ này biểu diễn phương thức
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
92 của các đối tượng chuỗi, nó canh phải một chuỗi vào trong trường với độ rộng xác định bằng cách thêm khoảng trống vào bên trái. Các phương thức tương tự khác gồm
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
93 và
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
94. Các phương thức này không viết gì cả, chúng chỉ trả về một chuỗi mới. Nếu chuỗi nhập vào quá dài, chúng cũng không cắt nó đi, mà trả về nó nguyên vẹn; điều này thường sẽ phá hỏng bố cục của bạn, nhưng vẫn tốt hơn là nói dối về một giá trị. (Nếu bạn thật sự muốn cắt bỏ bạn có thể thêm phép cắt miếng, như “
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
95“.)
Ví dụ này biểu diễn phương thức
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
92 của các đối tượng chuỗi, nó canh phải một chuỗi vào trong trường với độ rộng xác định bằng cách thêm khoảng trống vào bên trái. Các phương thức tương tự khác gồm
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
93 và
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
94. Các phương thức này không viết gì cả, chúng chỉ trả về một chuỗi mới. Nếu chuỗi nhập vào quá dài, chúng cũng không cắt nó đi, mà trả về nó nguyên vẹn; điều này thường sẽ phá hỏng bố cục của bạn, nhưng vẫn tốt hơn là nói dối về một giá trị. (Nếu bạn thật sự muốn cắt bỏ bạn có thể thêm phép cắt miếng, như “
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
95“.)

Có một phương thức khác,

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
96, nó đệm không vào bên trái một chuỗi số. Nó hiểu các dấu cộng và trừ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
25

Dùng toán tử

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
79 sẽ giống như vậy:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
26

Nếu có nhiều hơn một định dạng trong chuỗi, bạn cần truyền một bộ ở toán hạng bên phải, như trong ví dụ này:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
27

Hầu hết các định dạng hoạt động như trong C và yêu cầu bạn truyền kiểu thích hợp; nếu không, bạn sẽ nhận biệt lệ thay vì đổ nhân (core dump). Định dạng

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
98 dễ dãi hơn: nếu thông số tương ứng không phải là một đối tượng chuỗi, nó sẽ được chuyển thành chuỗi qua hàm có sẵn
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96. Việc dùng
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
76 để truyền vào độ rộng và mức chính xác như là một thông số nguyên riêng cũng được hỗ trợ. Các định dạng C
>>> width = 20
>>> height = 5*9
>>> width * height
900
01 và
>>> width = 20
>>> height = 5*9
>>> width * height
900
02 không được hỗ trợ.

Nếu bạn có một chuỗi định dạng rất dài và không muốn cắt ra, có thể bạn sẽ muốn tham chiếu tới các biến sắp được định dạng qua tên, thay vì vị trí. Việc này có thể được thực hiện theo dạng

>>> width = 20
>>> height = 5*9
>>> width * height
900
03, như ví dụ sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
28

Cách này đặc biệt hữu dụng khi đi kèm với hàm có sẵn

>>> width = 20
>>> height = 5*9
>>> width * height
900
04 mới, nó trả về một từ điển chứa tất cả các biến cục bộ.

7.2 Đọc và viết tập tin

Câu lệnh

>>> width = 20
>>> height = 5*9
>>> width * height
900
05 trả về một đối tượng tập tin, và thường được dùng với hai thông số: “
>>> width = 20
>>> height = 5*9
>>> width * height
900
06“.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
29

Thông số thứ nhất là một chuỗi chứa tên tập tin. Thông số thứ hai là một chuỗi khác chứa một vài ký tự xác định cách thức tập tin sẽ được dùng.

>>> width = 20
>>> height = 5*9
>>> width * height
900
07 có thể là ‘
>>> width = 20
>>> height = 5*9
>>> width * height
900
08‘ khi tập sẽ chỉ được đọc, ‘
>>> width = 20
>>> height = 5*9
>>> width * height
900
09‘ chỉ được ghi (tập tin cùng tên đang có sẽ bị xóa), và ‘
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
01‘ mở tập tin để thêm vào cuối; mọi dữ liệu ghi vào tập tin sẽ được tự động thêm vào cuối. ‘
>>> width = 20
>>> height = 5*9
>>> width * height
900
11‘ mở tập tin để đọc và ghi. Thông số
>>> width = 20
>>> height = 5*9
>>> width * height
900
07 là không bắt buộc; ‘
>>> width = 20
>>> height = 5*9
>>> width * height
900
08‘ sẽ được giả định nếu nó bị bỏ qua.

Trong Windows và Macintosh, ‘

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
02‘ thêm vào mode mở tập tin ở chế độ nhị phân, cho nên cũng có các chế độ khác như ‘
>>> width = 20
>>> height = 5*9
>>> width * height
900
15‘, ‘
>>> width = 20
>>> height = 5*9
>>> width * height
900
16‘, và ‘r+b’. Windows phân biệt rõ các tập tin văn bản và nhị phân; ký tự hết dòng (end-of-line) trong các tập tin văn bản được tự động thay đổi một chút khi dữ liệu được đọc hay ghi. Việc thay đổi sau bức bình phong (behind-the-scene) như vậy không ảnh hưởng các tập tin văn bản ASCII, nhưng nó sẽ phá dữ liệu nhị phân như trong các tập tin JPEG hay hàm EXE. Cần cẩn thận dùng chế độ nhị phân khi đọc và ghi các tập tin như vậy.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

7.2.1 Phương thức của đối tượng tập tin

Các ví dụ trong mục này sẽ giả sử một đối tượng tập tin f đã được tạo.

Để đọc nội dung tập tin, gọi

>>> width = 20
>>> height = 5*9
>>> width * height
900
17, nó đọc một số lượng dữ liệu và trả về một chuỗi.
>>> width = 20
>>> height = 5*9
>>> width * height
900
18 là một thông số số nguyên không bắt buộc. Khi
>>> width = 20
>>> height = 5*9
>>> width * height
900
18 bị bỏ qua hoặc âm, toàn bộ nội dung tập tin sẽ được đọc và trả về; bạn sẽ gặp vấn đề nếu tập tin lớn gấp đôi bộ nhớ của máy bạn. Ngược lại, nhiều nhất size byte sẽ được đọc và trả về. Nếu đã đến cuối tập tin,
>>> width = 20
>>> height = 5*9
>>> width * height
900
20 sẽ trả về một chuỗi rỗng (
>>> width = 20
>>> height = 5*9
>>> width * height
900
21).

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
30

>>> width = 20
>>> height = 5*9
>>> width * height
900
22 đọc một dòng từ tập tin; ký tự dòng mới (
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
47) được giữ lại ở cuối chuỗi, và sẽ chỉ bị bỏ qua ở dòng cuối của tập tin nếu tập tin không kết thúc bằng một dòng mới. Điều này làm giá trị trả về rõ ràng; nếu
>>> width = 20
>>> height = 5*9
>>> width * height
900
22 trả về một chuỗi rỗng có nghĩa là đã đụng cuối tập tin, trong khi một dòng trống thì được biểu diễn bởi ‘
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
47‘, một chuỗi chỉ chứa duy nhât một ký tự dòng mới.

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
31

>>> width = 20
>>> height = 5*9
>>> width * height
900
26 trả về một danh sách tất cả các dòng trong tập tin. Nếu truyền một tham số không bắt buộc sizehint, nó sẽ đọc nhiêu đó byte từ tập tin và thêm một chút đủ để hoàn tất một dòng, và trả về các dòng đã đọc được. Điều này thường được dùng để đọc một cách hiệu quả từng dòng một trong một tập tin lớn mà không cần phải nạp toàn bộ tập tin vào bộ nhớ. Chỉ có các dòng toàn vẹn mới được trả về.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
32

Một cách khác để đọc các dòng là lặp qua đối tượng tập tin. Nó rất tiết kiệm bộ nhớ, nhanh, và có mã đơn giản:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
33

Cách này đơn giản hơn nhưng không cho bạn điều khiển cách đọc. Vì hai cách này quản lý bộ đệm dòng khác nhau, chúng không nên được dùng chung.

>>> width = 20
>>> height = 5*9
>>> width * height
900
27 viết nội dung của string vào tập tin, trả về
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
39.
>>> width = 20
>>> height = 5*9
>>> width * height
900
27 viết nội dung của string vào tập tin, trả về
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
39.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
34

Để viết một thứ khác không phải là chuỗi, nó sẽ cần được chuyển thành một chuỗi trước:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
35

>>> width = 20
>>> height = 5*9
>>> width * height
900
29 trả về một số nguyên cho biết vị trí hiện tại của đối tượng tập tin, tính theo byte từ đầu tập tin. Để di chuyển vị trí, dùng “
>>> width = 20
>>> height = 5*9
>>> width * height
900
30“. Vị trí được tính từ tổng của offset và điểm tham chiếu; điểu tham chiếu được xác định bởi thông số
>>> width = 20
>>> height = 5*9
>>> width * height
900
31. Giá trị
>>> width = 20
>>> height = 5*9
>>> width * height
900
31 0 tính từ đầu tập tin, 1 dùng vị trí hiện tại, và 2 tính từ vị trí cuối tập tin.
>>> width = 20
>>> height = 5*9
>>> width * height
900
31 có thể bị bỏ qua và mặc định là 0, điểm tham chiếu là đầu tập tin.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
36

Khi bạn đã dùng xong, gọi

>>> width = 20
>>> height = 5*9
>>> width * height
900
34 để đóng nó lại và giải phóng tài nguyên hệ thống đã sử dụng khi mở tập tin. Sau khi gọi
>>> width = 20
>>> height = 5*9
>>> width * height
900
34, mọi cách dùng đối tượng tập tin sẽ tự động thất bại.

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
37

Các đối tượng tập tin có thêm các phương thức phụ như

>>> width = 20
>>> height = 5*9
>>> width * height
900
36 và
>>> width = 20
>>> height = 5*9
>>> width * height
900
37 không được thường xuyên dùng; tham khảo tài liệu thư viện để biết thêm về các đối tượng tập tin.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

7.2.2 pickle mô-đun

Các chuỗi có thể được ghi hoặc đọc dễ dàng từ một tập tin. Các số cần một ít cố gắng hơn, vì phương thức

>>> width = 20
>>> height = 5*9
>>> width * height
900
38 chỉ trả về chuỗi, và cần được truyền vào một hàm như
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
66, nó sẽ nhận một chuỗi như
>>> width = 20
>>> height = 5*9
>>> width * height
900
40 và trả về giá trị số
>>> width = 20
>>> height = 5*9
>>> width * height
900
41 của nó. Tuy nhiên, khi bạn muốn lưu các kiểu dữ liệu phức tạp hơn như danh sách, từ điển, hoặc các đối tượng, việc này trở nên rắc rối hơn nhiều.

Thay vì để người dùng luôn viết và gỡ rối mã để lưu các kiểu dữ liệu phức tạp, Python cung cấp một mô-đun chuẩn gọi là pickle. Đây là một mô-đun tuyệt diệu có thể nhận hầu hết mọi đối tượng Python (ngay cả một vài dạng mã Python!), và chuyển nó thành một chuỗi; quá trình này được gọi là giầm (pickling). Tạo lại đối tượng từ một chuỗi được gọi là vớt (unpickling). Giữa việc giầm và vớt, biểu diễn dạng chuỗi của đối tượng có thể được lưu vào tập tin, hoặc gửi qua mạng đến một máy ở xa.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Nếu bạn có một đối tượng

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
74, và một đối tượng tập tin
>>> width = 20
>>> height = 5*9
>>> width * height
900
43 đã được mở để ghi vào, cách đơn giản nhất để giầm đối tượng chỉ cần một dòng mã:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
38

Để vớt đối tượng ra, nếu

>>> width = 20
>>> height = 5*9
>>> width * height
900
43 là một đối tượng tập tin đã được mở để đọc:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
39

(Có những biến thể khác, dùng khi giầm nhiều đối tượng hoặc khi bạn không muốn viết dữ liệu đã giầm vào tập tin; tham khảo toàn bộ tài liệu về pickle trong Tham khảo thư viện Python.)

pickle là cách chuẩn để làm cho các đối tượng Python có thể được lưu và dùng lại bởi các chương trình khác, hoặc bởi lần chạy khác của cùng chương trình; thuật ngữ trong ngành gọi là đối tượng bền. Vì pickle được sử dụng rộng rãi, nhiều tác giả khi mở rộng Python đã cẩn thận để đảm bảo rằng các kiểu dữ liệu mới ví dụ như ma trận có thể được giầm và vớt đúng đắn.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

8. Lỗi và biệt lệ

Đến bây giờ chũng ta cũng chỉ mới nhắc đến các thông điệp lỗi, nhưng nếu bạn đã thử qua các ví dụ thì bạn có thể đã gặp nhiều hơn. Có (ít nhất) hai loại lỗi khác biệt: lỗi cú pháp và biệt lệ.

8.1 Lỗi cú pháp

Lỗi cú pháp, còn biết đến như lỗi phân tích (parsing error), có lẽ là phàn nàn lớn nhất bạn gặp phải khi vẫn đang học Python:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
40

Bộ phân tích lặp lại dòng gây lỗi và hiển thị một mũi tên nhỏ trỏ vào điểm đầu tiên lỗi được phát hiện. Lỗi nằm ở dấu hiệu phía trước mũi tên: trong ví dụ trên, lỗi được phát hiện ở từ khóa

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
12, vì thiếu một dấu hai chấm (“
>>> width = 20
>>> height = 5*9
>>> width * height
900
46“) ở trước đó. Tên tập tin vào số dòng được hiển thị để bạn biết tìm lỗi ở chỗ nào nếu đầu vào là từ một kịch bản.

8.2 Biệt lệ (Ngoại lệ)

Cho dù một câu lệnh hoặc biểu thức là đúng đắn, nó vẫn có thể tạo lỗi khi thực thi. Những lỗi bị phát hiện trong lúc thực thi được gọi là biệt lệ và không tai hại một cách vô điều kiện: bạn sẽ học cách xử lý chúng trong các chương trình Python. Hầu hết các biệt lệ đều được xử lý bởi chương trình và dẫn đến kết quả là các thông điệp lỗi như ở đây:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
41

Dòng cuối cùng của thông điệp lỗi cho biết chuyện gì xảy ra. Biệt lệ có nhiều kiểu, và kiểu được hiển thị như là một phần của thông điệp: các kiểu trong ví dụ là

>>> width = 20
>>> height = 5*9
>>> width * height
900
47,
>>> width = 20
>>> height = 5*9
>>> width * height
900
48 và
>>> width = 20
>>> height = 5*9
>>> width * height
900
49. Chuỗi được hiển thị như là kiểu biệt lệ là tên của biệt lệ có sẵn vừa xảy ra. Điều này đúng với tất cả các biệt lệ có sẵn, nhưng không nhất thiết đúng với các biệt lệ do người dùng định nghĩa (mặc dù đó là một quy ước hữu dụng). Các tên biệt lệ chuẩn là những từ định danh có sẵn (không phải là từ khóa). Phần còn lại cho biết chi tiết về kiểu biệt lệ và chuyện gì gây ra nó.
Phần còn lại cho biết chi tiết về kiểu biệt lệ và chuyện gì gây ra nó.

Phần trước của thông điệp lỗi cho biết hoàn cảnh khi xảy ra biệt lệ, ở dạng lần ngược ngăn xếp (stack traceback). Bình thường nó chứa một lần ngược ngăn xếp liệt kê các dòng nguồn; tuy nhiên, nó sẽ không hiển thị các dòng đọc từ đầu vào chuẩn. Tham khảo thư viện Python liệt kê các biệt lệ có sẵn và ý nghĩa của chúng.
Tham khảo thư viện Python liệt kê các biệt lệ có sẵn và ý nghĩa của chúng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

8.3 Xử lý biệt lệ

Chúng ta có thể viết những chương trình xử lý những biệt lệ được chọn. Hãy xem ví dụ sau, nó yêu cầu người dùng nhập vào dữ liệu cho tới khi một số nguyên được nhập, nhưng cũng cho phép người dùng ngưng chương trình (dùng Control-C hoặc phím tắt khác mà hệ điều hành hỗ trợ); lưu ý rằng sự ngắt quãng do người dùng tạo nên được đánh dấu bởi việc nâng biệt lệ

>>> width = 20
>>> height = 5*9
>>> width * height
900
50.

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
42

>>> width = 20
>>> height = 5*9
>>> width * height
900
51 (câu lệnh) hoạt động như sau.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • Trước tiên, vế
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    51 (các câu lệnh giữa từ khóa
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    51 và
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    54 ) được thực thi.
  • Nếu không có biệt lệ nào xảy ra, vế
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    54 được bỏ qua và câu lệnh
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    51 kết thúc.
  • Nếu trong khi thực thi vế
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    51 xảy ra biệt lệ, phần còn lại của vế được bỏ qua. Sau đó nếu kiểu biệt lệ hợp với kiểu được chỉ định sau từ khóa
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    54, thì vế
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    54 được thực thi, và rồi việc thực thi tiếp tục sau câu lệnh
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    51.
  • Nếu biệt lệ xảy ra không hợp với biệt lệ được chỉ định ở vế
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    54, nó sẽ được truyền ra các câu lệnh
    >>> width = 20
    >>> height = 5*9
    >>> width * height
    900
    51 bên ngoài; nếu không có đoạn mã xử lý nào, nó là một biệt lệ không được xử lý và việc thực thi dừng lại với một thông báo như trên.

Một câu lệnh

>>> width = 20
>>> height = 5*9
>>> width * height
900
51 có thể có nhiều hơn một vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54, để chỉ rõ cách xử lý cho những biệt lệ khác nhau. Nhiều nhất là một đoạn xử lý (handler) sẽ được thực thi. Các đoạn xử lý chỉ xử lý biệt lệ xảy ra trong vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
51 tương ứng, không xử lý các biệt lệ trong các đoạn xử lý khác của cùng câu lệnh
>>> width = 20
>>> height = 5*9
>>> width * height
900
51. Vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 có thể định danh nhiều biệt lệ trong một bộ (
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
11), ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
43

Vế

>>> width = 20
>>> height = 5*9
>>> width * height
900
54 cuối cùng có thể bỏ qua tên biệt lệ, có tác dụng như là một thay thế (wildcard). Phải hết sức cẩn trọng khi dùng nó, vì nó có thể dễ dàng che đi lỗi lập trình thật! Nó cũng có thể được dùng để in thông báo lỗi và sau đó nâng biệt lệ lại (re-raise exception) (nhằm cho phép nơi gọi xử lý biệt lệ):

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
44

Câu lệnh

>>> width = 20
>>> height = 5*9
>>> width * height
900
70  có một vế
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
15 không bắt buộc, mà khi có mặt sẽ phải đi sau tất cả các vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54. Nó dùng cho mã sẽ được thực thi nếu vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
51 không nâng biệt lệ nào. Ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
45

Việc dùng vế

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
15 tốt hơn là thêm mã vào vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
51 vì nó tránh việc vô tình bắt một biệt lệ không được nâng từ mã được bảo vệ trong câu lệnh
>>> width = 20
>>> height = 5*9
>>> width * height
900
70. Khi một biệt lệ xảy ra, nó có thể có một giá trị gắn liền, còn được biết đến như là thông sốcủa biệt lệ. Sự có mặt và kiểu của thông số phụ thuộc vào kiểu biệt lệ. Vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 có thể chỉ định một biến sau một (hoặc một bộ) tên biệt lệ. Biến đó được gán với một trường hợp biệt lệ (exception instance) với các thông số chứa trong
>>> width = 20
>>> height = 5*9
>>> width * height
900
78. Để thuận tiện, trường hợp biệt lệ định nghĩa
>>> width = 20
>>> height = 5*9
>>> width * height
900
79 và
>>> width = 20
>>> height = 5*9
>>> width * height
900
80 để cho các thông số có thể được truy xuất và in ra trực tiếp mà không phải tham chiếu
>>> width = 20
>>> height = 5*9
>>> width * height
900
81. Nhưng việc dùng
>>> width = 20
>>> height = 5*9
>>> width * height
900
82
>>> width = 20
>>> height = 5*9
>>> width * height
900
83 đã không được khuyến khích. Thay vào đó, cách dùng tốt nhất là truyền một thông số đơn lẻ vào một biệt lệ (có thể là một bộ nếu có nhiều thông số) và gán nó vào thuộc tính message. Ta cũng có thể tạo một biệt lệ trước và thêm các thuộc tính vào nó trước khi nâng.
Khi một biệt lệ xảy ra, nó có thể có một giá trị gắn liền, còn được biết đến như là thông sốcủa biệt lệ. Sự có mặt và kiểu của thông số phụ thuộc vào kiểu biệt lệ.
Vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 có thể chỉ định một biến sau một (hoặc một bộ) tên biệt lệ. Biến đó được gán với một trường hợp biệt lệ (exception instance) với các thông số chứa trong
>>> width = 20
>>> height = 5*9
>>> width * height
900
78. Để thuận tiện, trường hợp biệt lệ định nghĩa
>>> width = 20
>>> height = 5*9
>>> width * height
900
79 và
>>> width = 20
>>> height = 5*9
>>> width * height
900
80 để cho các thông số có thể được truy xuất và in ra trực tiếp mà không phải tham chiếu
>>> width = 20
>>> height = 5*9
>>> width * height
900
81.
Nhưng việc dùng
>>> width = 20
>>> height = 5*9
>>> width * height
900
82
>>> width = 20
>>> height = 5*9
>>> width * height
900
83 đã không được khuyến khích. Thay vào đó, cách dùng tốt nhất là truyền một thông số đơn lẻ vào một biệt lệ (có thể là một bộ nếu có nhiều thông số) và gán nó vào thuộc tính message. Ta cũng có thể tạo một biệt lệ trước và thêm các thuộc tính vào nó trước khi nâng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
46

Nếu biệt lệ có một thông số, nó sẽ được in ra như là phần cuối (`chi tiết’) của thông điệp của những biệt lệ không được xử lý. Các phần xử lý biệt lệ không chỉ xử lý các biệt lệ xảy ra ngay trong vế

>>> width = 20
>>> height = 5*9
>>> width * height
900
51, mà còn xử lý cả biệt trong những hàm được gọi (trực tiếp hoặc gián tiếp) trong vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
51. Ví dụ:
Các phần xử lý biệt lệ không chỉ xử lý các biệt lệ xảy ra ngay trong vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
51, mà còn xử lý cả biệt trong những hàm được gọi (trực tiếp hoặc gián tiếp) trong vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
51. Ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
47

8.4 Nâng biệt lệ

Câu lệnh

>>> width = 20
>>> height = 5*9
>>> width * height
900
86 cho phép nhà lập trình ép xảy ra một biệt lệ được chỉ định. Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
48

Thông số đầu tiên cho raise chỉ định biệt lệ sẽ được nâng. Thông số (tùy chọn) thứ hai chỉ định thông số của biệt lệ. Hoặc là, các dòng trên có thể được viết

>>> width = 20
>>> height = 5*9
>>> width * height
900
87. Cả hai dạng đều đúng, nhưng người ta có vẻ chuộng dạng thứ hai hơn. Nếu bạn cần xác định xem một biệt lệ có được nâng chưa nhưng không định xử lý nó, dạng đơn giản hơn của câu lệnh
>>> width = 20
>>> height = 5*9
>>> width * height
900
86 cho phép bạn nâng lại (re-raise) biệt lệ:
Nếu bạn cần xác định xem một biệt lệ có được nâng chưa nhưng không định xử lý nó, dạng đơn giản hơn của câu lệnh
>>> width = 20
>>> height = 5*9
>>> width * height
900
86 cho phép bạn nâng lại (re-raise) biệt lệ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
49

8.5 Biệt lệ tự định nghĩa

Các chương trình có thể đặt tên biệt lệ riêng bằng cách tạo một lớp biệt lệ mới. Các biệt lệ thường nên kế thừa từ lớp

>>> width = 20
>>> height = 5*9
>>> width * height
900
89, trực tiếp hoặc gián tiếp. Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
50

Trong ví dụ này, mặc định

>>> width = 20
>>> height = 5*9
>>> width * height
900
90 của Exception đã được định nghĩa lại. Cách thức mới chỉ đơn giản tạo thuộc tính
>>> width = 20
>>> height = 5*9
>>> width * height
900
91. Nó thay thế cách thức mặc định tạo thuộc tính
>>> width = 20
>>> height = 5*9
>>> width * height
900
83.

Các lớp biệt lệ có thể được định nghĩa để làm bất kỳ việc gì như các lớp khác, nhưng chúng thường là đơn giản và chỉ cung cấp một số thuộc tính để chứa thông tin về lỗi cho các phần xử lý biệt lệ. Khi tạo một mô-đun mà có thể nâng vài lỗi khác biệt, cách thông thường là tạo một lớp cơ sở cho các biệt lệ được định nghĩa bởi mô-đun đó, và kế thừa từ đó để tạo những lớp biệt lệ cụ thể cho những trường hợp lỗi khác nhau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
51

Đa số biệt lệ được định nghĩa với tên tận cùng bằng “

>>> width = 20
>>> height = 5*9
>>> width * height
900
93”, tương tự như cách đặt tên của các biệt lệ chuẩn. Nhiều mô-đun chuẩn định nghĩa biệt lệ riêng cho chúng để thông báo những lỗi mà có thể xảy ra trong các hàm chúng định nghĩa. Thông tin thêm về các lớp được trình bày trong chương 9, “Lớp”.
Nhiều mô-đun chuẩn định nghĩa biệt lệ riêng cho chúng để thông báo những lỗi mà có thể xảy ra trong các hàm chúng định nghĩa. Thông tin thêm về các lớp được trình bày trong chương 9, “Lớp”.

8.6 Định nghĩa cách xử lý

Câu lệnh

>>> width = 20
>>> height = 5*9
>>> width * height
900
51 có một vế không bắt buộc khác với mục đích định nghĩa những tác vụ dọn dẹp (clean-up action) mà sẽ được thực hiện trong mọi trường hợp. Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
52

A vế

>>> width = 20
>>> height = 5*9
>>> width * height
900
95 luôn được thực thi trước khi rời khỏi câu lệnh
>>> width = 20
>>> height = 5*9
>>> width * height
900
51, cho dù có xảy ra biệt lệ hay không. Khi một biệt lệ đã xảy ra trong vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
51 và không được xử lý bởi vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 (hoặc nó đã xảy ra trong một vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 hay
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
15), nó sẽ được nâng lại sau khi vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
95 đã được thực thi. Vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
95 cũng được thực thi “trên đường ra” khi bất kỳ vế nào của câu lệnh
>>> width = 20
>>> height = 5*9
>>> width * height
900
51 được bỏ lại thông qua câu lệnh
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
26,
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
27 hay
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
37. Một ví dụ phức tạp hơn:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
53

Như bạn có thể thấy, vế

>>> width = 20
>>> height = 5*9
>>> width * height
900
95 được thực thi trong mọi trường hợp.
>>> width = 20
>>> height = 5*9
>>> width * height
900
49 được nâng vì chia hai chuỗi không được xử lý bởi vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 và vì thế nên được nâng lại sau khi vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
95 đã được thực thi. Trong các ứng dụng thực thế, vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
95 được dùng để trả lại những tài nguyên ngoài (như tập tin, hoặc kết nối mạng), cho dù việc sử dụng tài nguyên có thành công hay không.
Trong các ứng dụng thực thế, vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
95 được dùng để trả lại những tài nguyên ngoài (như tập tin, hoặc kết nối mạng), cho dù việc sử dụng tài nguyên có thành công hay không.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

8.7 Định nghĩa xử lý có sẵn

Một số đối tượng định nghĩa các tác vụ dọn dẹp chuẩn để thực thi khi một đối tượng không còn được cần đến, cho dù việc xử dụng đối tượng là thành công hay thất bại. Xem qua ví dụ sau, nó thử mở một tập tin và viết nội dung của nó ra màn hình.

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
54

Vấn đề với đoạn mã trên là nó để tập tin ngỏ trong một thời gian không xác định sau khi đoạn mã đã kết thúc. Đây không phải là vấn đề gì trong các đoạn kịch bản đơn giản, nhưng có thể là một vấn đề phức tạp đối với các ứng dụng lớn hơn. Câu lệnh

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
12 cho phép các đối tượng như tập tin được dùng theo một cách đảm bảo chúng sẽ được dọn dẹp đúng lúc và đúng đắn.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
55

Sau khi câu lệnh được thực thi, tập tin

>>> width = 20
>>> height = 5*9
>>> width * height
900
43 luôn được đóng lại, cho dù gặp phải vấn đề trong khi xử lý các dòng. Các đối tượng khác mà cung cấp những tác vụ dọn dẹp định nghĩa sẵn sẽ cho biết về điểm này trong tài liệu của chúng.

9. Lớp

Chỉ cần một ít cú pháp và từ khóa mới, Python đã có thể hỗ trợ lớp

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
14. Nó là sự trộn lẫn giữa C++ và Modula-3. Cũng như mô-đun, các lớp tron Python không đặt rào cản tuyệt đối giữa định nghĩa lớp và người sử dụng, mà thay vào đó nó dựa vào sự lịch thiệp trong cách dùng mà “không phá định nghĩa.” Tuy nhiên, các tính năng quan trọng nhất của lớp vẫn được giữ lại trọn vẹn: cách kế thừa lớp hỗ trợ nhiều lớp cơ sở, lớp con có thể định nghĩa lại bất kỳ phương thức nào của các lớp cơ sở của nó, và một phương thức có thể gọi một phương thức cùng tên của một lớp cơ sở. Các đối tượng có thể chứa một lượng dũ liệu riêng bất kỳ.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Theo thuật ngữ C++, mọi thành viên lớp (kể cả thành viên dữ liệu) là

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
15 (công cộng), và mọi thành viên hàm là virtual(ảo). Không có bộ khởi tạo (constructor) hoặc bộ hủy (destructor) đặc biệt. Cũng như Modula-3, không có cách viết tắt nào để tham chiếu tới các thành viên của một đối tượng từ các phương thức của nó: hàm phương thức được khai báo với thông số thứ nhất thể hiện chính đối tượng đó, và được tự động truyền vào qua lệnh gọi. Như trong Smalltalk, các lớp cũng là các đối tượng theo một nghĩa rộng: trong Python, mọi kiểu dữ liệu là đều là các đối tượng. Điều này cho phép nhập (import) và đổi tên. Không như C++ và Modula-3, các kiểu có sẵn có thể được dùng như các lớp cơ sở để mở rộng bởi người dùng. Và như trong C++ nhưng không giống Modula-3, đa số các toán tử có sẵn với cú pháp đặc biệt (các toán tử số học, truy cập mảng, v.v…) có thể được định nghĩa lại trong các trường hợp cụ thể của lớp.

9.1 Vài lời về thuật ngữ

Những từ chuyên ngành dùng ở đây theo từ vựng của Smalltalk và C++.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Các đối tượng có tính cá thể (individuality), và nhiều tên (trong nhiều phạm vi, scope) có thể được gắn vào cùng một đối tượng. Trong các ngôn ngữ khác được gọi là tên lóng (alias). Nó thường không được nhận ra khi dùng Python lần đầu, và có thể được bỏ qua khi làm việc với các kiểu bất biến cơ bản (số, chuỗi, bộ). Tuy nhiên, tên lóng có một ảnh hưởng đối với ý nghĩa của mã Python có sử dụng các đối tượng khả biến như danh sách, từ điển, và đa số các kiểu thể hiện các vật ngoài chương trình (tập tin, cửa sổ, v.v…). Nó thường được dùng vì tên lóng có tác dụng như là con trỏ theo một vài khía cạnh nào đó. Ví dụ, truyền một đối tượng vào một hàm rẻ vì chỉ có con trỏ là được truyền, và nếu một hàm thay đổi một đối tượng được truyền vào, thì nơi gọi sẽ thấy các thay đổi đó — thay vì cần hai kiểu truyền thông số như trong Pascal.

9.2 Phạm vi trong Python và vùng tên

Trước khi giới thiệu lớp, chúng ta sẽ cần hiểu phạm vi (scope) và vùng tên (namespace) hoạt động như thế nào vì các định nghĩa lớp sẽ sử dụng chúng. Kiến thức về vấn đề này cũng rất hữu dụng với những nhà lập trình Python chuyên nghiệp. Bắt đầu với một vài định nghĩa.
Bắt đầu với một vài định nghĩa.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Một namespace (vùng tên) là ánh xạ từ tên vào đối tượng. Đa số các vùng tên được cài đặt bằng từ điển Python, nhưng điều đó thường là không quan trọng (trừ tốc độ), và có thể sẽ thay đổi trong tương lai. Các ví dụ vùng tên như: tập hợp các tên có sẵn (các hàm như

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
16 và các tên biệt lệ có sẵn); các tên toàn cụ trong một mô-đun; các tên nội bộ trong một phép gọi hàm. Theo nghĩa đó tập hợp các thuộc tính của một đối tượng cũng là một vùng tên. Điều quan trọng cần biết về vùng tên là tuyệt đối không có quan hệ gì giữa các vùng tên khác nhau; ví dụ hai mô-đun khác nhau có thể cùng định nghĩa hàm “maximize” mà không sợ lẫn lộn — người dùng mô-đun phải thêm tiền tố tên mô-đun trước khi gọi hàm.

Cũng xin nói thêm là từ thuộc tính được dùng để chỉ mọi tên theo sau dấu chấm — ví dụ, trong biểu thức

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
63,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
18 là một thuộc tính của đối tượng
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
62. Nói đúng ra, tham chiếu tới tên trong một mô-đun là các tham chiếu tới thuộc tính: trong biểu thức
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
20,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
21 là một đối tượng mô-đun và
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
22 là một thuộc tính của nó. Trong trường hợp này, việc ánh xạ giữa các thuộc tính của mô-đun và các tên toàn cục được định nghĩa trong mô-đun thật ra rất đơn giản: chúng dùng chung một vùng tên[5]!

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thuộc tính có thể là chỉ đọc, hoặc đọc ghi. Trong trường hợp sau, phép gán vào thuộc tính có thể được thực hiện. Các thuộc tính mô-đun là đọc ghi: bạn có thể viết “

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
23“. Các thuộc tính đọc ghi cũng có thể được xóa đi với câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05. Ví dụ, “
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
25” sẽ xóa thuộc tính
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
26 từ đối tượng tên
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
21.

Các vùng tên được tạo ra vào những lúc khác nhau và có thời gian sống khác nhau. Vùng tên chứa các tên có sẵn được tạo ra khi trình thông dịch Python bắt đầu, và không bao giờ bị xóa đi. Vùng tên toàn cục của một mô-đun được tạo ra khi định nghĩa mô-đun được đọc; bình thường, vùng tên mô-đun cũng tồn tại cho tới khi trình thông dịch thoát ra. Các câu lệnh được thực thi bởi lời gọi ở lớp cao nhất của trình thông dịch, vì đọc từ một kịch bản hoặc qua tương tác, được coi như một phần của mô-đun gọi là

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
70, cho nên chúng cũng có vùng tên riêng. (Các tên có sẵn thật ra cũng tồn tại trong một mô-đun; được gọi là
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
15.) Vùng tên nội bộ của một hàm được tạo ra khi hàm được gọi, và được xóa đi khi hàm trả về, hoặc nâng một biệt lệ không được xử lý trong hàm. Dĩ nhiên, các lời gọi hàm đệ quy có vùng tên riêng của chúng.
Vùng tên nội bộ của một hàm được tạo ra khi hàm được gọi, và được xóa đi khi hàm trả về, hoặc nâng một biệt lệ không được xử lý trong hàm. Dĩ nhiên, các lời gọi hàm đệ quy có vùng tên riêng của chúng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thuộc tính có thể là chỉ đọc, hoặc đọc ghi. Trong trường hợp sau, phép gán vào thuộc tính có thể được thực hiện. Các thuộc tính mô-đun là đọc ghi: bạn có thể viết “

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
23“. Các thuộc tính đọc ghi cũng có thể được xóa đi với câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05. Ví dụ, “
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
25” sẽ xóa thuộc tính
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
26 từ đối tượng tên
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
21.

Các vùng tên được tạo ra vào những lúc khác nhau và có thời gian sống khác nhau. Vùng tên chứa các tên có sẵn được tạo ra khi trình thông dịch Python bắt đầu, và không bao giờ bị xóa đi. Vùng tên toàn cục của một mô-đun được tạo ra khi định nghĩa mô-đun được đọc; bình thường, vùng tên mô-đun cũng tồn tại cho tới khi trình thông dịch thoát ra. Các câu lệnh được thực thi bởi lời gọi ở lớp cao nhất của trình thông dịch, vì đọc từ một kịch bản hoặc qua tương tác, được coi như một phần của mô-đun gọi là

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
70, cho nên chúng cũng có vùng tên riêng. (Các tên có sẵn thật ra cũng tồn tại trong một mô-đun; được gọi là
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
15.) Vùng tên nội bộ của một hàm được tạo ra khi hàm được gọi, và được xóa đi khi hàm trả về, hoặc nâng một biệt lệ không được xử lý trong hàm. Dĩ nhiên, các lời gọi hàm đệ quy có vùng tên riêng của chúng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thuộc tính có thể là chỉ đọc, hoặc đọc ghi. Trong trường hợp sau, phép gán vào thuộc tính có thể được thực hiện. Các thuộc tính mô-đun là đọc ghi: bạn có thể viết “

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
23“. Các thuộc tính đọc ghi cũng có thể được xóa đi với câu lệnh
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
05. Ví dụ, “
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
25” sẽ xóa thuộc tính
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
26 từ đối tượng tên
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
21.
Thông thường, phạm vi nội bộ tham chiếu các tên nội bộ của hàm hiện tại (dựa vào văn bản). Bên ngoài hàm, phạm vi nội bộ tham chiếu cùng một vùng tên như phạm vi toàn cục: vùng tên của mô-đun. Các định nghĩa lớp đặt thêm một vùng tên khác trong phạm vi nội bộ.
Điểm quan trọng cần ghi nhớ là phạm vi được xác định theo văn bản: phạm vi toàn cục của một hàm được định nghĩa trong một mô-đun là vùng tên của mô-đun đó, cho dù mô-đun đó được gọi từ đâu, hoặc được đặt tên lóng nào. Mặt khác, việc tìm tên được thực hiện lúc chạy — tuy nhiên, định nghĩa ngôn ngữ đang phát triển theo hướng xác định tên vào lúc “dịch”, cho nên đừng dựa vào việc tìm tên động! (Thực ra thì các biến nội bộ đã được xác định tĩnh.)

Các vùng tên được tạo ra vào những lúc khác nhau và có thời gian sống khác nhau. Vùng tên chứa các tên có sẵn được tạo ra khi trình thông dịch Python bắt đầu, và không bao giờ bị xóa đi. Vùng tên toàn cục của một mô-đun được tạo ra khi định nghĩa mô-đun được đọc; bình thường, vùng tên mô-đun cũng tồn tại cho tới khi trình thông dịch thoát ra. Các câu lệnh được thực thi bởi lời gọi ở lớp cao nhất của trình thông dịch, vì đọc từ một kịch bản hoặc qua tương tác, được coi như một phần của mô-đun gọi là

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
70, cho nên chúng cũng có vùng tên riêng. (Các tên có sẵn thật ra cũng tồn tại trong một mô-đun; được gọi là
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
15.) Vùng tên nội bộ của một hàm được tạo ra khi hàm được gọi, và được xóa đi khi hàm trả về, hoặc nâng một biệt lệ không được xử lý trong hàm. Dĩ nhiên, các lời gọi hàm đệ quy có vùng tên riêng của chúng.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thuộc tính có thể là chỉ đọc, hoặc đọc ghi. Trong trường hợp sau, phép gán vào thuộc tính có thể được thực hiện. Các thuộc tính mô-đun là đọc ghi: bạn có thể viết “>>> x = y = z = 0  # Zero x, y and z >>> x 0 >>> y 0 >>> z 023“. Các thuộc tính đọc ghi cũng có thể được xóa đi với câu lệnh # this is the first comment SPAM = 1                 # and this is the second comment                          #... and now a third! STRING = "# This is not a comment."05. Ví dụ, “>>> x = y = z = 0  # Zero x, y and z >>> x 0 >>> y 0 >>> z 025” sẽ xóa thuộc tính >>> x = y = z = 0  # Zero x, y and z >>> x 0 >>> y 0 >>> z 026 từ đối tượng tên >>> x = y = z = 0  # Zero x, y and z >>> x 0 >>> y 0 >>> z 021.

Các vùng tên được tạo ra vào những lúc khác nhau và có thời gian sống khác nhau. Vùng tên chứa các tên có sẵn được tạo ra khi trình thông dịch Python bắt đầu, và không bao giờ bị xóa đi. Vùng tên toàn cục của một mô-đun được tạo ra khi định nghĩa mô-đun được đọc; bình thường, vùng tên mô-đun cũng tồn tại cho tới khi trình thông dịch thoát ra. Các câu lệnh được thực thi bởi lời gọi ở lớp cao nhất của trình thông dịch, vì đọc từ một kịch bản hoặc qua tương tác, được coi như một phần của mô-đun gọi là

>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
70, cho nên chúng cũng có vùng tên riêng. (Các tên có sẵn thật ra cũng tồn tại trong một mô-đun; được gọi là
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
15.) Vùng tên nội bộ của một hàm được tạo ra khi hàm được gọi, và được xóa đi khi hàm trả về, hoặc nâng một biệt lệ không được xử lý trong hàm. Dĩ nhiên, các lời gọi hàm đệ quy có vùng tên riêng của chúng.

Một phạm vi là một vùng văn bản của một chương trình Python mà một vùng tên có thể được truy cập trực tiếp. “Có thể truy cập trực tiếp” có nghĩa là một tham chiếu không đầy đủ (unqualifed reference) tới một tên sẽ thử tìm tên đó trong vùng tên.

Mặc dù phạm vi được xác định tĩnh, chúng được dùng một cách động. Vào bất kỳ một lúc nào, có ít nhất ba phạm vi lồng nhau mà vùng tên của chúng có thể được truy cập trực tiếp: phạm vi bên trong cùng, được tìm trước, chứa các tên nội bộ; các vùng tên của các hàm chứa nó, được tìm bắt đầu từ phạm vi chứa nó gần nhất (nearest enclosing scope); phạm vi giữa (middle scope), được tìm kế, chứa các tên toàn cục của mô-đun; và phạm vi ngoài cùng (được tìm sau cùng) là vùng tên chứa các tên có sẵn.

Nếu một tên được khai báo là toàn cục, thì mọi tham chiếu hoặc phép gán sẽ đi thẳng vào phạm vi giữa chứa các tên toàn cục của mô-đun. Nếu không, mọi biến được tìm thấy ngoài phạm vi trong cùng chỉ có thể được đọc (nếu thử khi vào các biến đó sẽ tạo một biến cục bộ mới trong phạm vi trong vùng, và không ảnh hưởng tới biến cùng tên ở phạm vi ngoài). Thông thường, phạm vi nội bộ tham chiếu các tên nội bộ của hàm hiện tại (dựa vào văn bản). Bên ngoài hàm, phạm vi nội bộ tham chiếu cùng một vùng tên như phạm vi toàn cục: vùng tên của mô-đun. Các định nghĩa lớp đặt thêm một vùng tên khác trong phạm vi nội bộ. Điểm quan trọng cần ghi nhớ là phạm vi được xác định theo văn bản: phạm vi toàn cục của một hàm được định nghĩa trong một mô-đun là vùng tên của mô-đun đó, cho dù mô-đun đó được gọi từ đâu, hoặc được đặt tên lóng nào. Mặt khác, việc tìm tên được thực hiện lúc chạy — tuy nhiên, định nghĩa ngôn ngữ đang phát triển theo hướng xác định tên vào lúc “dịch”, cho nên đừng dựa vào việc tìm tên động! (Thực ra thì các biến nội bộ đã được xác định tĩnh.)

Định nghĩa lớp, cũng như định nghĩa hàm (câu lệnh

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
36 ) phải được thực thi trước khi chúng có hiệu lực. (Bạn có thể đặt một định nghĩa hàm trong một nhánh của lệnh if, hoặc trong một hàm.)

Trong thực tế, các câu lệnh trong một định nghĩa lớp thường là định nghĩa hàm, nhưng các câu lệnh khác cũng được cho phép, và đôi khi rất hữu dụng. Các định nghĩa hàm trong một lớp thường có một dạng danh sách thông số lạ, vì phải tuân theo cách gọi phương thức.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Khi gặp phải một định nghĩa lớp, một vùng tên mới được tạo ra, và được dùng như là phạm vi nội bộ — do đó, mọi phép gán vào các biến nội bộ đi vào vùng tên này. Đặc biệt, các định nghĩa hàm buộc tên của hàm mới ở đây.

Khi rời khỏi một định nghĩa lớp một cách bình thường, một đối tượng lớp được tạo ra. Đây cơ bản là một bộ gói (wrapper) của nội dung của vùng tên tạo ra bởi định nghĩa lớp. Phạm vi nội bộ ban đầu (trước khi vào định nghĩa lớp) được thiết lập lại, và đối tượng lớp được buộc vào đây qua tên lớp đã chỉ định ở định nghĩa lớp, (

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
31 trong ví dụ này).

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

9.3.2 Đối tượng lớp

Các đối tượng lớp hỗ trợ hai loại tác vụ: tham chiếu thuộc tính và tạo trường hợp (instantiation).

Tham chiếu thuộc tính dùng cú pháp chuẩn được dùng cho mọi tham chiếu thuộc tính trong Python:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
32. Các tên thuộc tính hợp lệ gồm mọi tên trong vùng tên của lớp khi đối tượng lớp được tạo ra. Do đó, nếu định nghĩa lớp có dạng như sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
57

thì

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
33 và
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
34 là những tham chiếu thuộc tính hợp lệ, trả về một số nguyên và một đối tượng hàm, theo thứ tự đó. Các thuộc tính lớp cũng có thể gán vào, cho nên bạn có thể thay đổi giá trị của
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
33 bằng phép gán.
# this is the first comment
SPAM = 1                 # and this is the second comment
                         #... and now a third!
STRING = "# This is not a comment."
94 cũng là một thuộc tính hợp lệ, trả về chuỗi tài liệu của lớp: “A simple example class”.

Class instantiation (tạo trường hợp lớp) dùng cùng cách viết như gọi hàm. Hãy tưởng tượng một đối tượng lớp là một hàm không thông số trả về một trường hợp của lớp. Ví dụ (với lớp trên):

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
58

tạo một trường hợp mới của lớp và gán đối tượng này vào biến nội bộ

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
74.

Tác vụ tạo trường hợp (“gọi” một đối tượng lớp) tạo một đối tượng rỗng. Nhiều lớp thích tạo đối tượng với các trường hợp được khởi tạo ở một trạng thái đầu nào đó. Do đó một lớp có thể định nghĩa một phương thức đặc biệt tên

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
38, như sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
59

Khi một lớp định nghĩa một phương thức

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
38, việc tạo trường hợp lớp sẽ tự động gọi
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
38 ở trường hợp lớp mới vừa được tạo. Trong ví dụ nạy, một trường hợp đã khởi tạo mới có thể được tại ra từ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
58

Dĩ nhiên,

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
38 (phương thức) có thể nhận thêm thông số. Trong trường hợp đó, các thông số đưa vào phép tạo trường hợp lớp sẽ được truyền vào
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
38. Ví dụ,

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
61

9.3.3 Đối tượng trường hợp

Chúng ta có thể làm được gì với những đối tượng trường hợp? Tác vụ duy nhất mà các đối tượng trường hợp hiểu được là tham chiếu thuộc tính. Có hai loại tên thuộc tính hợp lệ, thuộc tính dữ liệu và phương thức. data attributes (thuộc tính dữ liệu lớp) tương ứng với “biến trường hợp” trong Smalltalk, và ”thành viên dữ liệu” trong C++. Thuộc tính dữ liệu không cần được khai báo; như các biến nội bộ, chúng tự động tồn tại khi được gán vào. Ví dụ, nếu

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
74 là một trường hợp của
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
44 được tạo ra ở trên, đoạn mã sau in ra giá trị 16, mà không chừa lại dấu vết:
data attributes (thuộc tính dữ liệu lớp) tương ứng với “biến trường hợp” trong Smalltalk, và ”thành viên dữ liệu” trong C++. Thuộc tính dữ liệu không cần được khai báo; như các biến nội bộ, chúng tự động tồn tại khi được gán vào. Ví dụ, nếu
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
74 là một trường hợp của
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
44 được tạo ra ở trên, đoạn mã sau in ra giá trị 16, mà không chừa lại dấu vết:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
62

Loại tham chiếu thuộc tính trường hợp khác là một method (phương thức). Một phương thức là một hàm “của” một đối tượng. (Trong Python, từ phương thức không chỉ riêng cho trường hợp lớp: các kiểu đối tượng khác cũng có thể có phương thức. Ví dụ, đối tượng danh sách có phương thức tên

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
45, v.v… Tuy nhiên, trong phần sau chúng ta sẽ chỉ dùng từ phương thức dể chỉ các phương thức của đối tượng trường hợp lớp, trừ khi được chỉ định khác đi.)

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

9.3.2 Đối tượng lớp

9.3.4 Đối tượng phương thức

Thông thường, một phương thức được gọi ngay sau khi nó bị buộc:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
63

Trong

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
44, nó sẽ trả về chuỗi
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
53. Tuy nhiên, cũng không nhất thiết phải gọi một phương thức ngay lập tức:
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
46 là một đối tượng phương thức, và có thể được cất đi và gọi vào một thời điểm khác. Ví dụ:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
64

sẽ tiếp tục in

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
55 mãi mãi. Chuyện gì thật sự xảy ra khi một phương thức được gọi? Bạn có thể đã nhận ra rằng
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
56 được gọi với không thông số, mặc dù định nghĩa hàm của
>>> width = 20
>>> height = 5*9
>>> width * height
900
43 chỉ định một thông số. Chuyện gì xảy ra với thông số đó? Python chắc chắn nâng một biệt lệ khi một hàm cần một thông số được gọi suông — cho dù thông số đó có được dùng hay không đi nữa…
Chuyện gì thật sự xảy ra khi một phương thức được gọi? Bạn có thể đã nhận ra rằng
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
56 được gọi với không thông số, mặc dù định nghĩa hàm của
>>> width = 20
>>> height = 5*9
>>> width * height
900
43 chỉ định một thông số. Chuyện gì xảy ra với thông số đó? Python chắc chắn nâng một biệt lệ khi một hàm cần một thông số được gọi suông — cho dù thông số đó có được dùng hay không đi nữa…

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thật ra, bạn cũng có thể đã đoán ra được câu trả lời: điểm đặc biệt của phương thức là đối tượng đó được truyền vào ở thông số đầu tiên của hàm. Trong ví dụ của chúng ta, lời gọi

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
56 hoàn toàn tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
59. Nói chung, gọi một hàm với một danh sách n thông số thì tương đương với việc gọi hàm tương ứng với một danh sách thông số được tạo ra bằng cách chèn đối tượng của phương thức vào trước thông số thứ nhất. (Hiểu đơn giản là
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
60 tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
61 trong đó obj là đối tượng trường hợp của lớp
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
62,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
63 là một thuộc tính hợp lệ không phải dữ liệu, tức là đối tượng hàm của lớp đó.)
(Hiểu đơn giản là
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
60 tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
61 trong đó obj là đối tượng trường hợp của lớp
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
62,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
63 là một thuộc tính hợp lệ không phải dữ liệu, tức là đối tượng hàm của lớp đó.)

9.4 Một vài lời bình

Thuộc tính dữ liệu sẽ che thuộc tính phương thức cùng tên; để tránh vô tình trùng lặp tên, mà có thể dẫn đến các lỗi rất khó tìm ra trong các chương trình lớn, bạn nên có một quy định đặt tên nào đó để giảm thiểu tỉ lệ trùng lặp. Các quy định khả thi có thể gồm viết hoa tên phương thức, đặt tiền tố vào các tên thuộc tính dữ liệu (ví dụ như dấu gạch dưới

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
70), hoặc dùng động từ cho phương thức và danh từ cho các thuộc tính dữ liệu.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thật ra, bạn cũng có thể đã đoán ra được câu trả lời: điểm đặc biệt của phương thức là đối tượng đó được truyền vào ở thông số đầu tiên của hàm. Trong ví dụ của chúng ta, lời gọi

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
56 hoàn toàn tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
59. Nói chung, gọi một hàm với một danh sách n thông số thì tương đương với việc gọi hàm tương ứng với một danh sách thông số được tạo ra bằng cách chèn đối tượng của phương thức vào trước thông số thứ nhất. (Hiểu đơn giản là
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
60 tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
61 trong đó obj là đối tượng trường hợp của lớp
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
62,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
63 là một thuộc tính hợp lệ không phải dữ liệu, tức là đối tượng hàm của lớp đó.)

9.4 Một vài lời bình

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thật ra, bạn cũng có thể đã đoán ra được câu trả lời: điểm đặc biệt của phương thức là đối tượng đó được truyền vào ở thông số đầu tiên của hàm. Trong ví dụ của chúng ta, lời gọi

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
56 hoàn toàn tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
59. Nói chung, gọi một hàm với một danh sách n thông số thì tương đương với việc gọi hàm tương ứng với một danh sách thông số được tạo ra bằng cách chèn đối tượng của phương thức vào trước thông số thứ nhất. (Hiểu đơn giản là
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
60 tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
61 trong đó obj là đối tượng trường hợp của lớp
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
62,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
63 là một thuộc tính hợp lệ không phải dữ liệu, tức là đối tượng hàm của lớp đó.)

9.4 Một vài lời bình

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Thật ra, bạn cũng có thể đã đoán ra được câu trả lời: điểm đặc biệt của phương thức là đối tượng đó được truyền vào ở thông số đầu tiên của hàm. Trong ví dụ của chúng ta, lời gọi

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
56 hoàn toàn tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
59. Nói chung, gọi một hàm với một danh sách n thông số thì tương đương với việc gọi hàm tương ứng với một danh sách thông số được tạo ra bằng cách chèn đối tượng của phương thức vào trước thông số thứ nhất. (Hiểu đơn giản là
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
60 tương đương với
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
61 trong đó obj là đối tượng trường hợp của lớp
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
62,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
63 là một thuộc tính hợp lệ không phải dữ liệu, tức là đối tượng hàm của lớp đó.)

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
65

9.4 Một vài lời bình
Phương thức có thể gọi phương thức khác thông qua thuộc tính phương thức của thông số

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
65:

Thuộc tính dữ liệu sẽ che thuộc tính phương thức cùng tên; để tránh vô tình trùng lặp tên, mà có thể dẫn đến các lỗi rất khó tìm ra trong các chương trình lớn, bạn nên có một quy định đặt tên nào đó để giảm thiểu tỉ lệ trùng lặp. Các quy định khả thi có thể gồm viết hoa tên phương thức, đặt tiền tố vào các tên thuộc tính dữ liệu (ví dụ như dấu gạch dưới
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
70), hoặc dùng động từ cho phương thức và danh từ cho các thuộc tính dữ liệu.

Các thuộc tính dữ liệu có thể được tham chiếu tới bởi cả phương thức lẫn người dùng đối tượng đó. Nói một cách khác, lớp không thể được dùng để cài đặt các kiểu dữ liệu trừu tượng tuyệt đối. Trong thực tế, không có gì trong Python có thể ép việc che dấu dữ liệu — tất cả đều dựa trên nguyên tắc. (Mặt khác, cài đặt Python, được viết bằng C, có thể dấu các chi tiết cài đặt và điểu khiển truy cập vào một đối tượng nếu cần; điều này có thể được dùng trong các bộ mở rộng Python viết bằng C.)

9.5 Kế thừa

Dĩ nhiên, một tính năng ngôn ngữ sẽ không đáng được gọi là “lớp” nếu nó không hỗ trợ kế thừa. Cú pháp của một định nghĩa lớp con như sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
67

Tên

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
74 phải đã được định nghĩa trong một phạm vi chứa định nghĩa lớp con. Thay vì tên lớp cơ sở, các biểu thức khác cũng được cho phép. Điều này rất hữu ích, ví dụ, khi mà lớp cơ sở được định nghĩa trong một mô-đun khác:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
68

Việc thực thi định nghĩa lớp con tiến hành như là lớp cơ sở. Khi một đối tượng lớp được tạo ra, lớp cơ sở sẽ được nhớ. Nó được dùng trong việc giải các tham chiếu thuộc tính: nếu một thuộc tính không được tìm thấy ở trong lớp, việc tìm kiếm sẽ tiếp tục ở lớp cơ sở. Luật này sẽ được lặp lại nếu lớp cơ sở kế thừa từ một lớp khác.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Không có gì đặc biệt trong việc tạo trường hợp của các lớp con:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
75 tạo một trường hợp của lớp. Các tham chiếu hàm được giải như sau: thuộc tính lớp tương ứng sẽ được tìm, đi xuống chuỗi các lớp cơ sở nếu cần, và tham chiếu phương thức là hợp lệ nếu tìm thấy một đối tượng hàm.

Lớp con có thể định nghĩa lại các phương thức của lớp cơ sở. Bởi vì phương thức không có quyền gì đặc biệt khi gọi một phương thức của cùng một đối tượng, một phương thức của lớp cơ sở gọi một phương thức khác được định nghĩa trong cùng lớp cơ sở có thể là đang gọi một phương thức do lớp con đã định nghĩa lại. (Người dùng C++ có thể hiểu là mọi phương thức của Python là virtual.) Một phương thức được định nghĩa lại trong lớp con có thể muốn mở rộng thay vì thay thế phương thức cùng tên của lớp cơ sở. Có một cách đơn giản để gọi phương thức của lớp sơ sở: chỉ việc gọi “

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
76“. Đôi khi điều này cũng có ích cho người dùng. (Lưu ý rằng đoạn mã chỉ hoạt động nếu lớp cơ sở được định nghĩa hoặc nhập trực tiếp vào phạm vi toàn cục.)
Một phương thức được định nghĩa lại trong lớp con có thể muốn mở rộng thay vì thay thế phương thức cùng tên của lớp cơ sở. Có một cách đơn giản để gọi phương thức của lớp sơ sở: chỉ việc gọi “
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
76“. Đôi khi điều này cũng có ích cho người dùng. (Lưu ý rằng đoạn mã chỉ hoạt động nếu lớp cơ sở được định nghĩa hoặc nhập trực tiếp vào phạm vi toàn cục.)

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Không có gì đặc biệt trong việc tạo trường hợp của các lớp con:
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
75 tạo một trường hợp của lớp. Các tham chiếu hàm được giải như sau: thuộc tính lớp tương ứng sẽ được tìm, đi xuống chuỗi các lớp cơ sở nếu cần, và tham chiếu phương thức là hợp lệ nếu tìm thấy một đối tượng hàm.

Lớp con có thể định nghĩa lại các phương thức của lớp cơ sở. Bởi vì phương thức không có quyền gì đặc biệt khi gọi một phương thức của cùng một đối tượng, một phương thức của lớp cơ sở gọi một phương thức khác được định nghĩa trong cùng lớp cơ sở có thể là đang gọi một phương thức do lớp con đã định nghĩa lại. (Người dùng C++ có thể hiểu là mọi phương thức của Python là virtual.) Một phương thức được định nghĩa lại trong lớp con có thể muốn mở rộng thay vì thay thế phương thức cùng tên của lớp cơ sở. Có một cách đơn giản để gọi phương thức của lớp sơ sở: chỉ việc gọi “

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
76“. Đôi khi điều này cũng có ích cho người dùng. (Lưu ý rằng đoạn mã chỉ hoạt động nếu lớp cơ sở được định nghĩa hoặc nhập trực tiếp vào phạm vi toàn cục.)

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
69

9.5.1 Đa kế thừa
(Đối với một số người tìm theo chiều rộng — tìm

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
80 và
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
82 trước các lớp cơ sở của
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
78 — có vẻ tự nhiên hơn. Nhưng, điều này yêu cầu bạn biết một thuộc tính nào đó của
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
78 được thật sự định nghĩa trong
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
78 hay trong một trong các lớp cơ sở của nó trước khi bạn có thể biết được hậu quả của sự trùng lặp tên với một thuộc tính của
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
80. Luật tìm theo chiều sâu không phân biệt giữa thuộc tính trực tiếp hay kế thừa của
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
78.)

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Không có gì đặc biệt trong việc tạo trường hợp của các lớp con:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
75 tạo một trường hợp của lớp. Các tham chiếu hàm được giải như sau: thuộc tính lớp tương ứng sẽ được tìm, đi xuống chuỗi các lớp cơ sở nếu cần, và tham chiếu phương thức là hợp lệ nếu tìm thấy một đối tượng hàm.

Lớp con có thể định nghĩa lại các phương thức của lớp cơ sở. Bởi vì phương thức không có quyền gì đặc biệt khi gọi một phương thức của cùng một đối tượng, một phương thức của lớp cơ sở gọi một phương thức khác được định nghĩa trong cùng lớp cơ sở có thể là đang gọi một phương thức do lớp con đã định nghĩa lại. (Người dùng C++ có thể hiểu là mọi phương thức của Python là virtual.) Một phương thức được định nghĩa lại trong lớp con có thể muốn mở rộng thay vì thay thế phương thức cùng tên của lớp cơ sở. Có một cách đơn giản để gọi phương thức của lớp sơ sở: chỉ việc gọi “>>> x = y = z = 0  # Zero x, y and z >>> x 0 >>> y 0 >>> z 076“. Đôi khi điều này cũng có ích cho người dùng. (Lưu ý rằng đoạn mã chỉ hoạt động nếu lớp cơ sở được định nghĩa hoặc nhập trực tiếp vào phạm vi toàn cục.)

9.5.1 Đa kế thừa

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

Không có gì đặc biệt trong việc tạo trường hợp của các lớp con:

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
75 tạo một trường hợp của lớp. Các tham chiếu hàm được giải như sau: thuộc tính lớp tương ứng sẽ được tìm, đi xuống chuỗi các lớp cơ sở nếu cần, và tham chiếu phương thức là hợp lệ nếu tìm thấy một đối tượng hàm.
Lưu ý rằng mã truyền vào
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
91,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
92 hoặc
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
93 không nhận tên lớp của lớp gọi là tên lớp hiện tại; điều này cũng giống như tác dụng của câu lệnh
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
94, tác dụng của nó cũng bị giới hạn ở mã được biên dịch cùng. Cùng giới hạn này cũng được áp dụng vào
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
95,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
96 và
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
97, khi tham chiếu
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
98 trực tiếp.

9.7 Những điều khác

Đôi khi nó thật là hữu ích khi có một kiểu dữ liệu giống như Pascal “record” hoặc C “struct”, gói gọn vài mẩu dữ liệu vào chung với nhau. Một định nghĩa lớp rỗng thực hiện được việc này:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
70

Với mã Python cần một kiểu dữ liệu trừu tượng, ta có thể thay vào đó một lớp giả lập các phương thức của kiểu dữ liệu đó. Ví dụ, nếu bạn có một hàm định dạng một vài dữ liệu trong một đối tượng tập tin, bạn có thể định nghĩa một lớp với các phương thức

>>> width = 20
>>> height = 5*9
>>> width * height
900
38 và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
00 lấy dữ liệu từ một chuỗi, và truyền vào nó một thông số.

Các đối tượng phương trức trường hợp cũng có thuộc tính:

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
01 là một đối tượng trường hợp với phương thức
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
02, và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
03 là đối tượng hàm tương ứng với phương thức.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

9.8 Biệt lệ cũng là lớp

Các biệt lệ được định nghĩa bởi người dùng cũng được định danh theo lớp. Bằng cách này, một hệ thống phân cấp biệt lệ có thể được tạo ra. Có hai dạng lệnh

>>> width = 20
>>> height = 5*9
>>> width * height
900
86 mới:
Có hai dạng lệnh
>>> width = 20
>>> height = 5*9
>>> width * height
900
86 mới:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
71

Trong dạng đầu,

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
05 phải là một trường hợp của kiểu
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
62 hoặc là lớp con của nó. Dạng thứ hai là rút gọn của:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
72

Lớp trong vế

>>> width = 20
>>> height = 5*9
>>> width * height
900
54 tương thích với một biệt lệ nếu nó cùng lớp, hoặc là một lớp cơ sở (nhưng chiều ngược lại thì không đúng — một vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 dùng lớp con sẽ không tương thích với một biệt lệ lớp cơ sở). Ví dụ, đoạn mã sau sẽ in
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
17,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
69,
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
11 theo thứ tự đó:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
73

Nếu các vế

>>> width = 20
>>> height = 5*9
>>> width * height
900
54 được đặt ngược (với “
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
13” ở đầu), nó sẽ in
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
17,
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
17,
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
17 — vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 phù hợp đầu tiên được thực thi. Khi một thông điệp lỗi được in, tên lớp của biệt lệ được in, theo sau bởi dấu hai chấm và một khoảng trắng, và cuối cùng là trường hợp đã được chuyển thành chuỗi bằng hàm có sẵn
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96.
Khi một thông điệp lỗi được in, tên lớp của biệt lệ được in, theo sau bởi dấu hai chấm và một khoảng trắng, và cuối cùng là trường hợp đã được chuyển thành chuỗi bằng hàm có sẵn
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
96.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

9.8 Biệt lệ cũng là lớp

Các biệt lệ được định nghĩa bởi người dùng cũng được định danh theo lớp. Bằng cách này, một hệ thống phân cấp biệt lệ có thể được tạo ra. Có hai dạng lệnh

>>> width = 20
>>> height = 5*9
>>> width * height
900
86 mới:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
74

Trong dạng đầu,

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
05 phải là một trường hợp của kiểu
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
62 hoặc là lớp con của nó. Dạng thứ hai là rút gọn của:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
72

Lớp trong vế

>>> width = 20
>>> height = 5*9
>>> width * height
900
54 tương thích với một biệt lệ nếu nó cùng lớp, hoặc là một lớp cơ sở (nhưng chiều ngược lại thì không đúng — một vế
>>> width = 20
>>> height = 5*9
>>> width * height
900
54 dùng lớp con sẽ không tương thích với một biệt lệ lớp cơ sở). Ví dụ, đoạn mã sau sẽ in
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
17,
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
69,
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
11 theo thứ tự đó:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
76

Nếu các vế >>> width = 20 >>> height = 5*9 >>> width * height 90054 được đặt ngược (với “>>> 3 * 3.75 / 1.5 7.5 >>> 7.0 / 2 3.513” ở đầu), nó sẽ in >>> 2+2 4 >>> # This is a comment ... 2+2 4 >>> 2+2  # and a comment on the same line as code 4 >>> (50-5*6)/4 5 >>> # Integer division returns the floor: ... 7/3 2 >>> 7/-3 -317, >>> 2+2 4 >>> # This is a comment ... 2+2 4 >>> 2+2  # and a comment on the same line as code 4 >>> (50-5*6)/4 5 >>> # Integer division returns the floor: ... 7/3 2 >>> 7/-3 -317, >>> 2+2 4 >>> # This is a comment ... 2+2 4 >>> 2+2  # and a comment on the same line as code 4 >>> (50-5*6)/4 5 >>> # Integer division returns the floor: ... 7/3 2 >>> 7/-3 -317 — vế >>> width = 20 >>> height = 5*9 >>> width * height 90054 phù hợp đầu tiên được thực thi. Khi một thông điệp lỗi được in, tên lớp của biệt lệ được in, theo sau bởi dấu hai chấm và một khoảng trắng, và cuối cùng là trường hợp đã được chuyển thành chuỗi bằng hàm có sẵn  # -*- coding: iso-8859-15 -*-  currency = u"€"  print ord(currency)96.

9.9 Bộ lặp

Bây giờ có lẽ bạn đã lưu ý rằng hầu hết các đối tượng chứa (container object) có thể được lặp qua bằng câu lệnh
import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)
19 :

Kiểu truy xuất này rõ ràng, súc tích, và tiện lợi. Bộ lặp (

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
20) được dùng khắp nơi và hợp nhất Python. Đằng sau màn nhung, câu lệnh for gọi
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
21 trên đối tượng chứa. Hàm này trả về một đối tượng bộ lặp có định nghĩa phương thức
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
22 để truy xuất và các phần tử trong bộ chứa (container). Khi không còn phần tử nào,
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
22 nâng biệt lệ
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
24 để yêu cầu vòng lặp for kết thúc. Ví dụ sau cho thấy cách hoạt động:
Một tính năng chính khác là các biến nội bộ và trạng thái thực thi được tự động lưu giữa các lần gọi. Điều này làm cho hàm dễ viết hơn và rõ ràng hơn là cách sử dụng biến trường hợp như
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
35 và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
36.
Thêm vào việc tự động tạo và lưu trạng thái chương trình, khi các bộ tạo kết thúc, chúng tự động nâng
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
24. Cộng lại, các tính năng này làm cho việc tạo các bộ lặp không có gì khó hơn là viết một hàm bình thường.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1>>> the_world_is_flat = 1 >>> if the_world_is_flat: ...     print "Be careful not to fall off!" ... Be careful not to fall off!75

Chúng ta đã hiểu giao thức bộ lặp, nên chúng ta có thể thêm cách thức bộ lặp (iterator behavior) vào lớp của chúng ta một cách dễ dàng. Định nghĩa một phương thức

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
25 trả về một đối tượng với một phương thức
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
22. Nếu lớp có định nghĩa
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
22, thì 
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
25 chỉ cần trả về
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
65:
Ví dụ:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
78

10. Giới thiệu sơ về bộ thư viện chuẩn

10.1 Giao tiếp với hệ thống

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
38 (mô-đun) cung cấp hàng loạt các hàm dùng cho việc giao tiếp với hệ điều hành:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
79

Nhớ dùng kiểu lệnh

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
39 thay vì
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
40. Điều này khiến cho
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
41 không che hàm
>>> width = 20
>>> height = 5*9
>>> width * height
900
05 sẵn có của Python. Hai hàm này hoạt động khác nhau rất nhiều. Các hàm sẵn có
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
12 và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
44 là các công cụ trợ giúp tương tác hữu ích khi làm việc với các mô-đun lớn như
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
38:
Các hàm sẵn có
>>> 2+2
4
>>> # This is a comment
... 2+2
4
>>> 2+2  # and a comment on the same line as code
4
>>> (50-5*6)/4
5
>>> # Integer division returns the floor:
... 7/3
2
>>> 7/-3
-3
12 và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
44 là các công cụ trợ giúp tương tác hữu ích khi làm việc với các mô-đun lớn như
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
38:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
80

Đối với các công việc quản lý file và thư mục thông thường, mô-đun

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
46 cung cấp một giao diện mức cao hơn và dễ dùng hơn:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
81

10.2 Ký tự thay thế tập tin

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
47 (mô-đun) cũng hỗ trợ việc tạo danh sách các tập tin từ việc tìm kiếm thư mục dùng ký tự thay thế (wildcard):

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
82

10.3 Thông số dòng lệnh

Các kịch bản phổ dụng thường phải xử lý các tham số dòng lệnh. Các tham số này được lưu thành một danh sách ở mô-đun sys trong thuộc tính

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
48. Ví dụ, kết quả sau đây thu được từ việc chạy lệnh
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
49 từ dòng lệnh:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
83

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
50 (mô-đun) xử lý
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
31 theo các nguyên tắc của hàm Unix
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
52. Nếu cần các thao tác linh hoạt và hữu hiệu hơn, chúng ta có thể dùng mô-đun
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
53.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

10.4 Chuyển hướng luồng ra và kết thúc chương trình

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
54(mô-đun) cũng có các thuộc tính cho
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
55,
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
56, và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
57. Cái cuối rất hữu dụng trong việc sinh ra các cảnh báo và thông báo lỗi và việc hiển thị chúng ngay cả khi
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
56 đã được định hướng lại:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
84

Cách thoát khỏi một kịch bản một cách trực tiếp nhất là dùng

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
59.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

10.5 Khớp mẫu chuỗi

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
60(mô-đun) cung cấp các công cụ biểu thức chính quy dùng cho việc xử lý chuỗi ở mức cao. Biểu thức chính quy cung cấp các phương án súc tích và tối ưu cho các thao tác tìm kiếm và xử lý chuỗi phức tạp:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
85

Đối với các chức năng xử lý chuỗi cơ bản thì các phương thức của đối tượng chuỗi được ưa chuộng hơn bởi chúng dễ đọc và dễ gỡ rối hơn:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
86

10.6 Toán học

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
61 (mô-đun) cung cấp các hàm xử lý về toán dấu chấm động của thư viện C mức dưới:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
87

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
62 (mô-đun) hỗ trợ việc tạo ra các lựa chọn ngẫu nhiên:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
88

10.7 Truy cập internet

Python cung cấp một vài mô-đun khác nhau cho việc truy cập internet và xử lý các giao thức internet. Hai mô-đun đơn giản nhất là

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
63 dành cho việc thu thập dữ liệu từ các URL và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
64 dành cho việc gửi thư điện tử:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
89

10.8 Ngày và giờ

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
65 (mô-đun) cung cấp các lớp dành cho viêc xử lý ngày tháng và thời gian từ đơn giản tới phức tạp. Mô-đun này có hỗ trợ các phép toán về ngày tháng, tuy nhiên nó chú trọng tới việc truy cập các thành phần ngày tháng một cách hiệu quả giúp cho việc định dạng chúng. Mô-đun này cũng hỗ trợ các đối tượng có thể phân biệt được các vùng thời gian.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
90

10.9 Nén dữ liệu

Python cung cấp một số mô-đun hỗ trợ trực tiếp các định dạng nén và lưu trữ dữ liệu phổ biến như: zlib, gzip, bz2, zipfile, và tarfile.

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
91

10.10 Đo lường hiệu suất

Một vài người dùng Python rất quan tâm đến việc tìm hiểu sự khác bệt về hiệu năng giữa các phương án khác nhau của cùng một vấn đề. Python cung cấp một công cụ đo đạc để thỏa mãn nhu cầu này. Ví dụ, chúng ta thường muốn sử dụng tính năng gói bộ và mở gói bộ thay cho phương pháp thông thường trong việc hoán đổi tham số. Mô-đun timeit cho thấy phương pháp này có hiệu năng nhỉnh hơn phương pháp thông thường:
Ví dụ, chúng ta thường muốn sử dụng tính năng gói bộ và mở gói bộ thay cho phương pháp thông thường trong việc hoán đổi tham số. Mô-đun timeit cho thấy phương pháp này có hiệu năng nhỉnh hơn phương pháp thông thường:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
92

So sánh với độ phân biệt về thời gian và sự chính xác cao của

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
66, các mô-đun profile và pstats cung cấp các công cụ cho việc xác định các đoạn mã tiêu tốn nhiều thời gian trong các khối mã lớn hơn.

10.11 Quản lý chất lượng

Một phương pháp để phát triển phần mềm chất lượng cao là viết các hàm kiểm tra cho từng hàm khi viết các hàm và chạy các hàm kiểm tra một cách thường xuyên trong quá trình phát triển phần mềm. doctest (mô-đun) cung cấp công cụ cho việc rà soát một mô-đun và thẩm định các hàm kiểm tra nhúng trong tài liệu của chương trình. Việc xây dựng các đoạn kiểm tra được thực hiện đơn giản bằng cách cắt và dán một đoạn gọi hàm thông thường kèm theo kết quả của hàm đó vào tài liệu chương trình. Việc này cải thiện đáng kể tài liệu chương trình bởi nó cung cấp cho người dùng một ví dụ về việc sử dụng hàm và cho phép mô-đun doctest kiểm tra tính đúng đắn của hàm này so với tài liệu:
doctest (mô-đun) cung cấp công cụ cho việc rà soát một mô-đun và thẩm định các hàm kiểm tra nhúng trong tài liệu của chương trình. Việc xây dựng các đoạn kiểm tra được thực hiện đơn giản bằng cách cắt và dán một đoạn gọi hàm thông thường kèm theo kết quả của hàm đó vào tài liệu chương trình. Việc này cải thiện đáng kể tài liệu chương trình bởi nó cung cấp cho người dùng một ví dụ về việc sử dụng hàm và cho phép mô-đun doctest kiểm tra tính đúng đắn của hàm này so với tài liệu:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
93

unittest (mô-đun) không dễ dùng như mô-đun doctest, nhưng nó hỗ trợ các hàm kiểm tra toàn diện hơn và lưu giữ chúng trong một tập tin riêng biệt:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
94

10.12 Kèm cả pin

Python được gắn với ý tưởng “kèm pin”. Điều này được thể hiện bởi các tính năng mạnh mẽ và đa dạng của các gói lớn hơn của nó. Ví dụ như:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • xmlrpclib và SimpleXMLRPCServer (mô-đun) giúp cho việc cài đặt các lệnh gọi thủ tục từ xa (remote procedure call) trở nên dễ dàng hơn bao giờ hết. Khác với cái tên, chúng ta có thể sử dụng mô-đun này mà không cần các kiến thức cụ thể về xử lý XML.
  • email (gói) là một thư viện hỗ trợ việc quản lý các thư điện tử, bao gồm các văn bản MIME và các văn bản dựa trên RFC 2822 khác. Không trực tiếp gửi và nhận thông điệp như smtplib và poplib, gói email có một tập các công cụ dành cho việc xây dựng và mã hóa các cấu trúc thông điệp phức tạp (bao gồm cả tập tin đính kèm) và cài đặt mã hóa internet và giao thức tiêu đề.
  • dom và xml.sax (gói) hỗ trợ rất tốt cho việc phân tích định dạng phổ biến này. Tương tự, mô-đun csv hỗ trợ việc đọc ghi trực tiếp trên một định dạng văn bản chung. Kết hợp lại, các mô-đun và gói kể trên đơn giản hóa rất nhiều việc trao đổi dữ liệu giữa các trình ứng dụng của python và các chương trình khác.
  • Việc hỗ trợ quốc tế hóa được thực hiện bởi một vài mô-đun, bao gồm gettext, locale, và gói codecs.

11. Giới thiệu sơ về bộ thư viện chuẩn – Phần II

Bài giới thiệu thứ hai này nói về các mô-đun chuyên sâu nhằm đáp ứng các tác vụ lập trình chuyên nghiệp. Các mô-đun này ít khi xuất hiện ở các kịch bản nhỏ.

11.1 Định dạng ra

repr (mô-đun)cung cấp một phiên bản repr() đã được tùy biến để hiển thị vắn tắt các đối tượng chứa (container) lớn hoặc lồng nhau nhiều mức:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
95

pprint (mô-đun) hỗ trợ việc kiểm soát việc in các đối tượng sẵn có hoặc các đối tượng do người dùng định nghĩa một cách tinh vi hơn theo một phương thúc mà rình thông dịch có thể hiểu được. Khi kết quả hiển thị ngắn hơn một dòng thì “pretty printer” sẽ thêm các dấu xuống dòng và dấu thụt vào đầu dòng khiến cho cấu trúc dữ liệu được thể hiện rõ rệt hơn:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
96

textwrap (mô-đun) định dạng đoạn văn bản sao cho vừa với độ rộng của màn hình:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
97

locale (mô-đun) sử dụng một cơ sở dữ liệu các định dạng dữ liệu dựa trên đặc điểm của từng khu vực. Hàm định dạng của locale có thuộc tính tạo nhóm, cho phép định dạng trực tiếp các con số với các dấu phân chia nhóm:

>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
98

11.2 Tạo mẫu

string (mô-đun) cung cấp một lớp Template với một cú pháp đơn giản, có thể dễ dàng thay đổi bởi người dùng. Điều này cho phép người dùng có thể tùy biến trình ứng dụng mà không phải thay đổi nó. Định dạng này sử dụng các tên biến giữ chỗ bắt đầu với “

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
67” sau đó là một tên biến hợp lệ của Python (chữ cái, chữ số và dấu gạch dưới). Tên giữ chỗ được đặt trong ngoặc, điều này khiến nó có thể được nối tiếp bởi các ký tự khác mà không cần có khoảng trống ở giữa. Viết “
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
68” sẽ tạo ra một ký tự thoát đơn “
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
67“:
Định dạng này sử dụng các tên biến giữ chỗ bắt đầu với “
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
67” sau đó là một tên biến hợp lệ của Python (chữ cái, chữ số và dấu gạch dưới). Tên giữ chỗ được đặt trong ngoặc, điều này khiến nó có thể được nối tiếp bởi các ký tự khác mà không cần có khoảng trống ở giữa. Viết “
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
68” sẽ tạo ra một ký tự thoát đơn “
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
67“:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
>>> the_world_is_flat = 1
>>> if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
99

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
70 (phương thức) nâng KeyError nếu biến giữ chỗ không được cung cấp bởi một từ điển hay một tham số nhập từ bàn phím. Đối với các trình ứng dụng kiểu nhập liệu vào thư điện tử, dữ liệu nhập bởi người dùng có thể có thiếu sót, khi đó phương thức
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
71 sẽ thích hợp hơn — nó giữ nguyên các biến giữ chỗ nếu dữ liệu bị thiếu:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
00

Các lớp con của Template có thể định nghĩa một phần tử phân chia tùy biến. Ví dụ một ứng dụng đổi tên ảnh hàng loạt của một trình duyệt ảnh có thể sử dụng dấu phần trăm để làm các biến giữ chỗ ngày tháng, số thứ tự ảnh, hay định dạng ảnh:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
01

Một ứng dụng khác của tạo mẫu là việc tách biệt lô-gíc chương trình ra khỏi các chi tiết về các định dạng đầu ra khác nhau. Điều này giúp cho việc thay thế các khuôn mẫu tùy biến cho các tập tin XML, các báo cáo bằng văn bản thông thường và các báo cáo bằng HTML.

11.3 Làm việc với bản ghi dữ liệu nhị phân

struct (mô-đun) cung cấp các hàm

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
72 và
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
73 để dùng với các định dạng bản ghi nhị phân với chiều dài không cố định. Ví dụ sau đây minh họa phương pháp lặp qua các thông tin trong phần tiêu đề của một tập tin ZIP (ký hiệu “H” và “L” biểu diễn các số không dấu hai byte và bốn byte):

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
02

11.4 Đa luồng

Phân luồng là kỹ thuật phân tách các tác vụ khác nhau của một chương trình khi chúng không bị ràng buộc trật tự với nhau. Các luồng được sử dụng để tăng tính đáp ứng của các chương trình ứng dụng đòi hỏi việc nhập liệu từ người dùng diễn ra cùng lúc với các tiến trình nền khác. Một trường hợp tương tự là việc chạy các tác vụ vào ra song song với các tác vụ tính toán ở một luồng khác. Đoạn mã sau đây minh họa cách mô-đun threading chạy các tác vụ nền trong khi chương trình chính vẫn đang chạy:
Đoạn mã sau đây minh họa cách mô-đun threading chạy các tác vụ nền trong khi chương trình chính vẫn đang chạy:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
03

Khó khăn lớn nhất của các chương trình ứng dụng đa luồng là việc điều phối các luồng phải chia sẻ dữ liệu hay các tài nguyên khác. Về mặt này, mô-đun

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
74 hỗ trợ một số hàm đồng bộ sơ cấp như các khóa (lock), các sự kiện (event), các biến điều kiện (condition) và các cờ hiệu (semaphore). Mặc dù các công cụ kể trên rất mạnh, nhung những lỗi thiết kế nhỏ có thể dẫn tới các vấn đề rất khó có thể tái tạo được. Do đó, phương pháp được ưa chuộng trong việc điều phối các tác vụ là tập hợp các truy cập tới một tài nguyên vào một luồng, sau đó sử dụng mô-đun Queue để nạp các yêu cầu từ các luồng khác tới luồng đó. Các trình ứng dụng sử dụng đối tượng Queue cho việc giao tiếp và điều phối giữa các luồng có ưu điểm là dễ thiết kể hơn, dễ đọc hơn và đáng tin cậy hơn.
Mặc dù các công cụ kể trên rất mạnh, nhung những lỗi thiết kế nhỏ có thể dẫn tới các vấn đề rất khó có thể tái tạo được. Do đó, phương pháp được ưa chuộng trong việc điều phối các tác vụ là tập hợp các truy cập tới một tài nguyên vào một luồng, sau đó sử dụng mô-đun Queue để nạp các yêu cầu từ các luồng khác tới luồng đó. Các trình ứng dụng sử dụng đối tượng Queue cho việc giao tiếp và điều phối giữa các luồng có ưu điểm là dễ thiết kể hơn, dễ đọc hơn và đáng tin cậy hơn.

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1

11.5 Nhật ký

logging (mô-đun) cung cấp một hệ thống ghi nhật ký (logging) linh hoạt và có đầy đủ các tính năng. Trong trường hợp đơn giản nhất, một thông điệp nhật ký được gửi tới một tập tin hay tới sys.stderr:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
04

Đoạn mã trên sẽ cho kết quả sau:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
05

Theo mặc định, các thông điệp chứa thông tin dành cho việc gỡ rối bị chặn lại và đầu ra được gửi tới kênh báo lỗi chuẩn. Các thông điệp này còn có thể được chuyển tiếp tới thư điện tử, gói tin, socket hay máy chủ HTTP. Các bộ lọc có thể chọn các cơ chế chuyển tiếp tùy theo mức độ ưu tiên của thông điệp: DEBUG, INFO, WARNING, ERROR, và CRITICAL. Hệ thống nhật ký có thể được cấu hình trực tiếp bên trong Python hoặc nạp từ một tập tin cấu hình mà người dùng có thể sửa đổi được, nhằm tùy biến việc ghi nhật ký mà không phải sửa đổi trình ứng dụng.
Hệ thống nhật ký có thể được cấu hình trực tiếp bên trong Python hoặc nạp từ một tập tin cấu hình mà người dùng có thể sửa đổi được, nhằm tùy biến việc ghi nhật ký mà không phải sửa đổi trình ứng dụng.

11.6 Tham chiếu yếu

Python hỗ trợ việc quản lý bộ nhớ một cách tự động (bao gồm việc đếm tham chiếu với hầu hết các đối tượng và việc thu dọn rác). Vùng nhớ được giải phóng nhanh chóng sau khi tham chiếu cuối cùng đến nó kết thúc. Phương pháp này tỏ ra hiệu quả với hầu hết các trình ứng dụng sử dụng Python, tuy vậy đôi khi ta có nhu cầu theo dõi một đối tượng chừng nào chúng được sử dụng ở một chỗ khác. Tuy vậy việc theo dõi này lại tạo ra một tham chiếu đến đối tượng đó, khiến bản thân nó trở thành một tham chiếu vĩnh viễn. Mô-đun weakref cho phép theo dỗi một đối tượng mà không cần phải tạo một tham chiếu tới đối tượng đó. Khi đối tượng không còn cần dùng nữa, nó sẽ tự động bị loại ra khỏi bảng tham chiếu yếu và một hàm gọi ngược (callback) sẽ được gọi tới đối tượng weakref. Các ứng dụng phổ biến có chứa các đối tượng được lưu tạm và đòi hỏi chi phí khởi tạo cao:
Phương pháp này tỏ ra hiệu quả với hầu hết các trình ứng dụng sử dụng Python, tuy vậy đôi khi ta có nhu cầu theo dõi một đối tượng chừng nào chúng được sử dụng ở một chỗ khác. Tuy vậy việc theo dõi này lại tạo ra một tham chiếu đến đối tượng đó, khiến bản thân nó trở thành một tham chiếu vĩnh viễn. Mô-đun weakref cho phép theo dỗi một đối tượng mà không cần phải tạo một tham chiếu tới đối tượng đó. Khi đối tượng không còn cần dùng nữa, nó sẽ tự động bị loại ra khỏi bảng tham chiếu yếu và một hàm gọi ngược (callback) sẽ được gọi tới đối tượng weakref. Các ứng dụng phổ biến có chứa các đối tượng được lưu tạm và đòi hỏi chi phí khởi tạo cao:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
06

11.7 Công cụ làm việc với danh sách

Kiểu danh sách sẵn có của Python có thể đáp ứng được nhu cầu về nhiều kiểu cấu trúc dữ liệu khác nhau. Tuy vậy chúng ta đôi khi cần tới các kiểu cấu trúc khác, tùy thuộc vào các mục tiêu cụ thể về hiệu năng. array (mô-đun) cung cấp đối tượng array() giống như một danh sách chứa các dữ liệu cùng kiểu và lưu giữ chúng gọn hơn. Ví dụ sau cho thấy một mảng các con số được lưu giữ dưới dạng các số không dấu hai byte (mã “H”) thay vì mỗi phần tử chiếm 16 byte như trong một danh sách thông thường chứa các đối tượng số nguyên của Python:
array (mô-đun) cung cấp đối tượng array() giống như một danh sách chứa các dữ liệu cùng kiểu và lưu giữ chúng gọn hơn. Ví dụ sau cho thấy một mảng các con số được lưu giữ dưới dạng các số không dấu hai byte (mã “H”) thay vì mỗi phần tử chiếm 16 byte như trong một danh sách thông thường chứa các đối tượng số nguyên của Python:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
07

collections (mô-đun) cung cấp đối tượng deque() giống như một danh sách nhưng có các thao tác thêm vào và lấy ra đầu bên trái nhanh hơn, nhưng việc tìm kiếm ở giữa thì lại chậm hơn. Các đối tượng này thích hợp cho việc cài đặt các hàng đợi và tìm kiếm cây theo chiều rộng:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
08

Ngoài các cấu trúc thay thế cho danh sách, thư viện chuẩn còn cung cấp các công cụ như mô-đun bisect chứa các hàm thao tác trên danh sách đã được sắp xếp:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
09

heapq (mô-đun) cung cấp các hàm để cài đặt đống (heap) dựa trên các danh sách thông thường. Phần tử có giá trị thấp nhất luôn được giữ ở vị trí đầu tiên. Hàm này rất có ích trong các trình ứng dụng đòi hỏi việc truy cập tới phần tử nhỏ nhất mà không cần phải sắp xếp lại toàn bộ danh sách:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
10

11.8 Số học dấu chấm động thập phân

decimal (mô-đun) cung cấp kiểu dữ liệu

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
75 cho các phép toán dấu chấm động hệ thập phân. So với cấu trúc dấu chấm động nhị phân float sẵn có của Python, lớp này rất có ích trong các trình ứng dụng về tài chính và các công việc đòi hỏi việc biểu diễn chính xác các số thập phân, kiểm soát mức độ chính xác cũng như việc làm tròn các con số theo các quy định đề ra, theo dõi vị trí của dấu chấm động hay trong các trình ứng dụng mà người sử dụng mong muốn thu được kết quả khớp với kết quả tính toán bằng tay. Ví dụ như, việc tính 5% thuế trên một cuộc gọi điện giá 70 cent sẽ cho kết quả khác nhau nếu sử dụng các phép toán dấy chấm động hệ thập phân và nhị phân. Sự khác biệt trở nên rõ rệt nếu kết quả được làm tròn tới cent:
Ví dụ như, việc tính 5% thuế trên một cuộc gọi điện giá 70 cent sẽ cho kết quả khác nhau nếu sử dụng các phép toán dấy chấm động hệ thập phân và nhị phân. Sự khác biệt trở nên rõ rệt nếu kết quả được làm tròn tới cent:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
11

>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
75 giữ một số không ở vị trí cuối cùng, nó tự động quy kết quả kiểu có bốn chữ số sau dấu chấm nếu các thừa số của phép nhân có hai chữ số sau dấu chấm.
>>> 3 * 3.75 / 1.5
7.5
>>> 7.0 / 2
3.5
77thực hiện các phép toán tương tự như cách chúng được tính bằng tay, nhờ đó tránh được các vấn đề gặp phải khi dấu chấm động hệ nhị phân không thể biểu diễn chính xác các giá trị thập phân. Việc biểu diễn chính xác các con số giúp cho lớp Decimal có thể thực hiện được các phép tính modulo và các so sánh bằng, điều mà dấu chấm động hệ nhị phân không làm được:
Việc biểu diễn chính xác các con số giúp cho lớp Decimal có thể thực hiện được các phép tính modulo và các so sánh bằng, điều mà dấu chấm động hệ nhị phân không làm được:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
12

decimal (mô-đun) cung cấp các phép toán với độ chính xác cao, tùy thuộc vào đòi hỏi của người dùng:

 # -*- coding: iso-8859-15 -*-

 currency = u"€"

 print ord(currency)
13

12. Tiếp theo?

Đọc xong bài chỉ dẫn này có lẽ đã làm tăng thêm sự thích thú của bạn với ngôn ngữ Python — và bạn cũng muốn nhanh chóng áp dụng Python để giải quyết các vấn đề trong đời sống. Thế bây giờ bạn nên học tiếp từ đâu? Bài chỉ dẫn này là một phần của bộ tài liệu của Python. Những tài liệu khác trong bộ này gồm:
Bài chỉ dẫn này là một phần của bộ tài liệu của Python. Những tài liệu khác trong bộ này gồm:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • Tham khảo thư viện Python:

Bạn nên duyệt qua cẩm nang này vì nó cung cấp tài liệu tham khảo đầy đủ (dù là ngắn gọn) về các kiểu, hàm, và các mô-đun trong bộ thư viện chuẩn. Bộ phân phối Python chuẩn có rất nhiều mã bổ sung. Có những mô-đun để đọc hộp thư Unix, lấy tài liệu từ HTTP, sinh số ngẫu nhiên, phân tích thông số dòng lệnh, viết các ứng dụng CGI, nén dữ liệu, và rất nhiều tác vụ khác. Lướt qua Tham khảo thư viện sẽ cho bạn biết những gì đang có.

  • Cài đặt các mô-đun Python giải thích làm thế nào để cài các mô-đun ngoài được viết bởi các người dùng Python khác.
  • Tham khảo ngôn ngữ: Một tài liệu chi tiết về cú pháp và ngữ nghĩa của Python. Khó đọc, nhưng rất hữu dụng vì nó là hướng dẫn đầy đủ của chính ngôn ngữ.

Các tài nguyên Python khác:

SALE 11.11 SHOPEE https://shope.ee/1VOIDFMXxP TIKI https://bitly.global/CJK6J1
  • Tham khảo thư viện Python:
  • Bạn nên duyệt qua cẩm nang này vì nó cung cấp tài liệu tham khảo đầy đủ (dù là ngắn gọn) về các kiểu, hàm, và các mô-đun trong bộ thư viện chuẩn. Bộ phân phối Python chuẩn có rất nhiều mã bổ sung. Có những mô-đun để đọc hộp thư Unix, lấy tài liệu từ HTTP, sinh số ngẫu nhiên, phân tích thông số dòng lệnh, viết các ứng dụng CGI, nén dữ liệu, và rất nhiều tác vụ khác. Lướt qua Tham khảo thư viện sẽ cho bạn biết những gì đang có.
  • Cài đặt các mô-đun Python giải thích làm thế nào để cài các mô-đun ngoài được viết bởi các người dùng Python khác.
  • Tham khảo ngôn ngữ: Một tài liệu chi tiết về cú pháp và ngữ nghĩa của Python. Khó đọc, nhưng rất hữu dụng vì nó là hướng dẫn đầy đủ của chính ngôn ngữ.

Các tài nguyên Python khác:

http://www.python.org: Trang mạng Python chính. Nó có mã, tài liệu, và chỉ dẫn tới các trang liên quan tới Python trên mạng. Trang này được chép ra ở khắp nơi trên thế giới như Châu Âu, Nhật, và Úc; các bản sao có thể nhanh hơn là trang chính, tùy thuộc vào vị trí địa lý của bạn.

  • http://docs.python.org: Truy cập nhanh tới tài liệu Python.
    The typical Python prompt of the interactive shell. Often seen for code examples that can be tried right away in the interpreter.
  •  # -*- coding: iso-8859-15 -*-
    
     currency = u"€"
    
     print ord(currency)
    44 Lời nhắc Python điển hình của vỏ tương tác khi nhập mã cho một khối mã thụt.
    The typical Python prompt of the interactive shell when entering code for an indented code block.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    80 Nhà độc tài nhân từ cho cuộc sống, a.k.a. Guido van Rossum, người tạo ra Python.
    Benevolent Dictator For Life, a.k.a. Guido van Rossum, Python’s creator.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    81 Biểu diễn nội bộ của chương trình Python trong phiên dịch. Mã byte cũng được lưu trong bộ nhớ cache trong các tệp.pyc và.pyo để thực thi cùng một tệp nhanh hơn lần thứ hai (có thể tránh được việc sắp xếp lại từ mã byte sang mã byte). Ngôn ngữ trung gian này của người Viking, được cho là chạy trên một máy ảo của người Viking, gọi các chương trình con tương ứng với mỗi mã byte.
    The internal representation of a Python program in the interpreter. The byte code is also cached in.pyc and.pyo files so that executing the same file is faster the second time (recompilation from source to byte code can be avoided). This “intermediate language” is said to run on a “virtual machine” that calls the subroutines corresponding to each bytecode.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    82 Bất kỳ lớp nào không kế thừa từ đối tượng. Xem lớp học kiểu mới.
    Any class which does not inherit from object. See new-style class.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    83 Chuyển đổi ngầm của một thể hiện của một loại sang loại khác trong một thao tác bao gồm hai đối số cùng loại. Ví dụ: int (3.15) chuyển đổi số điểm nổi thành số nguyên 3, nhưng trong 3+4.5, mỗi đối số thuộc loại khác nhau (một int, một float) và cả hai phải được chuyển đổi thành cùng loại trước khi chúng có thể được thêm vào hoặc nó sẽ tăng một kiểu mẫu. Sự ép buộc giữa hai toán hạng có thể được thực hiện với chức năng xây dựng ép buộc; Do đó, 3+4.5 tương đương với toán tử gọi.Add (*đồng nghĩa (3, 4.5)) và kết quả trong toán tử.ADD (3.0, 4.5). Nếu không bị ép buộc, tất cả các đối số của các loại thậm chí tương thích sẽ phải được chuẩn hóa theo cùng một giá trị của lập trình viên, ví dụ: float (3) +4.5 thay vì chỉ 3+4,5.
    The implicit conversion of an instance of one type to another during an operation which involves two arguments of the same type. For example, int(3.15) converts the floating point number to the integer 3, but in 3+4.5, each argument is of a different type (one int, one float), and both must be converted to the same type before they can be added or it will raise a TypeError. Coercion between two operands can be performed with the coerce builtin function; thus, 3+4.5 is equivalent to calling operator.add(*coerce(3, 4.5)) and results in operator.add(3.0, 4.5). Without coercion, all arguments of even compatible types would have to be normalized to the same value by the programmer, e.g., float(3)+4.5 rather than just 3+4.5.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    84 Một phần mở rộng của hệ thống số thực quen thuộc trong đó tất cả các số được biểu thị dưới dạng tổng của một phần thực và một phần tưởng tượng. Số tưởng tượng là bội số thực của đơn vị tưởng tượng (căn bậc hai của -1), thường được viết I trong toán học hoặc J trong kỹ thuật. Python đã hỗ trợ xây dựng cho các số phức tạp, được viết bằng ký hiệu sau này; Phần tưởng tượng được viết với hậu tố J, ví dụ: 3+1J. Để có quyền truy cập vào các tương đương phức tạp của mô -đun toán học, hãy sử dụng CMATH. Sử dụng các số phức là một tính năng toán học khá tiên tiến. Nếu bạn không nhận thức được nhu cầu cho họ, thì nó gần như chắc chắn bạn có thể bỏ qua chúng một cách an toàn.
    An extension of the familiar real number system in which all numbers are expressed as a sum of a real part and an imaginary part. Imaginary numbers are real multiples of the imaginary unit (the square root of -1), often written i in mathematics or j in engineering. Python has builtin support for complex numbers, which are written with this latter notation; the imaginary part is written with a j suffix, e.g., 3+1j. To get access to complex equivalents of the math module, use cmath. Use of complex numbers is a fairly advanced mathematical feature. If you’re not aware of a need for them, it’s almost certain you can safely ignore them.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    85 Bất kỳ đối tượng kiểu mới nào xác định các phương thức __get __ (), __set __ () hoặc __delete __ (). Khi một thuộc tính lớp là một mô tả, hành vi ràng buộc đặc biệt của nó được kích hoạt khi tra cứu thuộc tính. Thông thường, viết a.b tra cứu đối tượng B trong từ điển lớp cho A, nhưng nếu B là một mô tả, phương thức xác định được gọi. Hiểu các mô tả là chìa khóa để hiểu sâu sắc về Python vì chúng là cơ sở cho nhiều tính năng bao gồm các chức năng, phương thức, thuộc tính, phương thức lớp, phương pháp tĩnh và tham chiếu đến các lớp siêu.
    Any new-style object that defines the methods __get__(), __set__(), or __delete__(). When a class attribute is a descriptor, its special binding behavior is triggered upon attribute lookup. Normally, writing a.b looks up the object b in the class dictionary for a, but if b is a descriptor, the defined method gets called. Understanding descriptors is a key to a deep understanding of Python because they are the basis for many features including functions, methods, properties, class methods, static methods, and reference to super classes.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    86 Một mảng kết hợp, trong đó các khóa tùy ý được ánh xạ tới các giá trị. Việc sử dụng Dict rất giống với danh sách, nhưng các khóa có thể là bất kỳ đối tượng nào có hàm __hash __ (), không chỉ các số nguyên bắt đầu từ không. Được gọi là băm trong Perl.
    An associative array, where arbitrary keys are mapped to values. The use of dict much resembles that for list, but the keys can be any object with a __hash__() function, not just integers starting from zero. Called a hash in Perl.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    87 Phong cách lập trình pythonic xác định loại đối tượng bằng cách kiểm tra phương pháp hoặc chữ ký thuộc tính của nó chứ không phải bằng mối quan hệ rõ ràng với một số đối tượng (nếu nó trông giống như một con vịt và những con vịt như một con vịt, nó phải là một con vịt. Các giao diện thay vì các loại cụ thể, mã được thiết kế tốt giúp cải thiện tính linh hoạt của nó bằng cách cho phép thay thế đa hình. Gy-Typing tránh các thử nghiệm bằng cách sử dụng loại () hoặc isInstance (). Thay vào đó, nó thường sử dụng các bài kiểm tra HasAttr () hoặc lập trình EAFP.
    Pythonic programming style that determines an object’s type by inspection of its method or attribute signature rather than by explicit relationship to some type object (“If it looks like a duck and quacks like a duck, it must be a duck.”) By emphasizing interfaces rather than specific types, well-designed code improves its flexibility by allowing polymorphic substitution. Duck-typing avoids tests using type() or isinstance(). Instead, it typically employs hasattr() tests or EAFP programming.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    88 Dễ dàng yêu cầu tha thứ hơn sự cho phép. Phong cách mã hóa python phổ biến này giả định sự tồn tại của các khóa hoặc thuộc tính hợp lệ và các trường hợp ngoại lệ nếu giả định chứng minh sai. Phong cách sạch sẽ và nhanh chóng này được đặc trưng bởi sự hiện diện của nhiều người thử và ngoại trừ các câu lệnh. Kỹ thuật này tương phản với phong cách LBYL phổ biến trong nhiều ngôn ngữ khác như C.
    Easier to ask for forgiveness than permission. This common Python coding style assumes the existence of valid keys or attributes and catches exceptions if the assumption proves false. This clean and fast style is characterized by the presence of many try and except statements. The technique contrasts with the LBYL style that is common in many other languages such as C.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    89 Một mô -đun giả mà các lập trình viên có thể sử dụng để kích hoạt các tính năng ngôn ngữ mới không tương thích với trình thông dịch hiện tại. Ví dụ: Biểu thức 11/4 hiện đang đánh giá thành 2. Nếu mô -đun được thực thi đã kích hoạt phân chia thực bằng cách thực thi: từ __Future__ nhập phân chia biểu thức 11/4 sẽ đánh giá thành 2,75. Bằng cách nhập mô -đun __future__ và đánh giá các biến của nó, bạn có thể thấy khi nào một tính năng mới lần đầu tiên được thêm vào ngôn ngữ và khi nào nó sẽ trở thành mặc định: >>> nhập __future__ >>> __future __. , 'alpha', 2), (3, 0, 0, 'alpha', 0), 8192)
    A pseudo module which programmers can use to enable new language features which are not compatible with the current interpreter. For example, the expression 11/4 currently evaluates to 2. If the module in which it is executed had enabled true division by executing:
    from __future__ import division
    the expression 11/4 would evaluate to 2.75. By importing the __future__ module and evaluating its variables, you can see when a new feature was first added to the language and when it will become the default:
    >>> import __future__
    >>> __future__.division
    _Feature((2, 2, 0, ‘alpha’, 2), (3, 0, 0, ‘alpha’, 0), 8192)
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    30 Một hàm trả về một trình lặp. Có vẻ như một hàm bình thường ngoại trừ các giá trị được trả lại cho người gọi bằng cách sử dụng câu lệnh năng suất thay vì câu lệnh trả về. Các chức năng của máy phát thường chứa một hoặc nhiều cho hoặc trong khi các vòng mang lại các phần tử trở lại cho người gọi. Việc thực thi chức năng được dừng ở từ khóa năng suất (trả về kết quả) và được nối lại ở đó khi phần tử tiếp theo được yêu cầu bằng cách gọi phương thức tiếp theo () của trình lặp được trả về.
    A function that returns an iterator. It looks like a normal function except that values are returned to the caller using a yield statement instead of a return statement. Generator functions often contain one or more for or while loops that yield elements back to the caller. The function execution is stopped at the yield keyword (returning the result) and is resumed there when the next element is requested by calling the next() method of the returned iterator.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    91 Một biểu thức trả về một trình tạo. Nó trông giống như một biểu thức bình thường theo sau là một biểu thức xác định một biến vòng, phạm vi và một biểu thức nếu tùy chọn. Biểu thức kết hợp tạo ra các giá trị cho một hàm kèm theo: >>> tổng (i*i cho i trong phạm vi (10)) & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; # tổng của hình vuông 0, 1, 4, 81 285
    An expression that returns a generator. It looks like a normal expression followed by a for expression defining a loop variable, range, and an optional if expression. The combined expression generates values for an enclosing function:
    >>> sum(i*i for i in range(10))         # sum of squares 0, 1, 4,… 81
    285
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    92 Xem khóa phiên dịch toàn cầu.
    See global interpreter lock.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    93 Khóa được sử dụng bởi các chủ đề Python để đảm bảo rằng chỉ có một luồng có thể được chạy tại một thời điểm. Điều này đơn giản hóa Python bằng cách đảm bảo rằng không có hai quy trình nào có thể truy cập cùng một bộ nhớ cùng một lúc. Khóa toàn bộ trình thông dịch giúp người phiên dịch dễ dàng được nhiều luồng, với chi phí của một số song song trên các máy đa bộ xử lý. Những nỗ lực đã được thực hiện trong quá khứ để tạo ra một thông dịch viên có được luồng miễn phí (một trong đó khóa dữ liệu được chia sẻ với độ chi tiết tốt hơn nhiều), nhưng hiệu suất phải chịu trong trường hợp bộ xử lý đơn phổ biến.
    The lock used by Python threads to assure that only one thread can be run at a time. This simplifies Python by assuring that no two processes can access the same memory at the same time. Locking the entire interpreter makes it easier for the interpreter to be multi-threaded, at the expense of some parallelism on multi-processor machines. Efforts have been made in the past to create a “free-threaded” interpreter (one which locks shared data at a much finer granularity), but performance suffered in the common single-processor case.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    94 Một môi trường phát triển tích hợp cho Python. IDLE là một trình soạn thảo cơ bản và môi trường phiên dịch, vận chuyển với sự phân phối tiêu chuẩn của Python. Tốt cho người mới bắt đầu, nó cũng đóng vai trò là mã ví dụ rõ ràng cho những người muốn thực hiện một ứng dụng GUI đa nền tảng, tinh vi vừa phải.
    An Integrated Development Environment for Python. IDLE is a basic editor and interpreter environment that ships with the standard distribution of Python. Good for beginners, it also serves as clear example code for those wanting to implement a moderately sophisticated, multi-platform GUI application.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    95 Một đối tượng có giá trị cố định. Các đối tượng bất biến là số, chuỗi hoặc bộ dữ liệu (và hơn thế nữa). Một đối tượng như vậy không thể được thay đổi. Một đối tượng mới phải được tạo nếu một giá trị khác phải được lưu trữ. Họ đóng một vai trò quan trọng ở những nơi cần giá trị băm hằng số, ví dụ như là chìa khóa trong từ điển.
    An object with fixed value. Immutable objects are numbers, strings or tuples (and more). Such an object cannot be altered. A new object has to be created if a different value has to be stored. They play an important role in places where a constant hash value is needed, for example as a key in a dictionary.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    96 Bộ phận toán học loại bỏ bất kỳ phần còn lại. Ví dụ, biểu thức 11/4 hiện đang đánh giá đến 2 trái ngược với 2,75 được trả về bởi bộ phận float. Cũng được gọi là phân chia sàn. Khi chia hai số nguyên, kết quả sẽ luôn là một số nguyên khác (có chức năng sàn được áp dụng cho nó). Tuy nhiên, nếu một trong các toán hạng là một loại số khác (như phao), kết quả sẽ bị ép buộc (xem ép buộc) sang một loại chung. Ví dụ, một số nguyên chia cho một chiếc phao sẽ dẫn đến giá trị nổi, có thể với một phần thập phân. Phân chia số nguyên có thể bị ép buộc bằng cách sử dụng toán tử // thay vì / toán tử. Xem thêm __future__.
    Mathematical division discarding any remainder. For example, the expression 11/4 currently evaluates to 2 in contrast to the 2.75 returned by float division. Also called floor division. When dividing two integers the outcome will always be another integer (having the floor function applied to it). However, if one of the operands is another numeric type (such as a float), the result will be coerced (see coercion) to a common type. For example, an integer divided by a float will result in a float value, possibly with a decimal fraction. Integer division can be forced by using the // operator instead of the / operator. See also __future__.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    97 Python có một trình thông dịch tương tác, điều đó có nghĩa là bạn có thể thử mọi thứ và ngay lập tức thấy kết quả của chúng. Chỉ cần khởi chạy Python không có đối số (có thể bằng cách chọn nó từ menu chính máy tính của bạn). Đó là một cách rất mạnh mẽ để kiểm tra các ý tưởng mới hoặc kiểm tra các mô -đun và gói (hãy nhớ trợ giúp (x)).
    Python has an interactive interpreter which means that you can try out things and immediately see their results. Just launch python with no arguments (possibly by selecting it from your computer’s main menu). It is a very powerful way to test out new ideas or inspect modules and packages (remember help(x)).
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    98 Python là một ngôn ngữ được giải thích, trái ngược với một ngôn ngữ được biên soạn. Điều này có nghĩa là các tệp nguồn có thể được chạy trực tiếp mà không cần tạo một thực thi trước đó được chạy. Các ngôn ngữ được giải thích thường có chu kỳ phát triển/gỡ lỗi ngắn hơn so với các ngôn ngữ được biên dịch, mặc dù các chương trình của họ thường chạy chậm hơn. Xem thêm Tương tác.
    Python is an interpreted language, as opposed to a compiled one. This means that the source files can be run directly without first creating an executable which is then run. Interpreted languages typically have a shorter development/debug cycle than compiled ones, though their programs generally also run more slowly. See also interactive.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    99 Một đối tượng container có khả năng trả lại các thành viên của mình một lần. Ví dụ về các vòng lặp bao gồm tất cả các loại chuỗi (như danh sách, str và tuple) và một số loại không theo trình tự như dict và file và đối tượng của bất kỳ lớp nào bạn xác định với phương thức __iter __ () hoặc __getItem __ (). Ererables có thể được sử dụng trong một vòng lặp và ở nhiều nơi khác cần một chuỗi (zip (), map (), Hồi). Khi một đối tượng có thể đi được truyền dưới dạng đối số cho hàm tích hợp iter (), nó sẽ trả về một trình lặp cho đối tượng. Trình lặp này là tốt cho một lần vượt qua tập hợp các giá trị. Khi sử dụng Iterables, thường không cần thiết phải gọi iter () hoặc tự đối phó với các đối tượng lặp. Câu lệnh FOR thực hiện điều đó tự động cho bạn, tạo một biến không tên tạm thời để giữ trình lặp trong suốt thời gian của vòng lặp. Xem thêm Iterator, trình tự và trình tạo.
    A container object capable of returning its members one at a time. Examples of iterables include all sequence types (such as list, str, and tuple) and some non-sequence types like dict and file and objects of any classes you define with an __iter__() or __getitem__() method. Iterables can be used in a for loop and in many other places where a sequence is needed (zip(), map(),…). When an iterable object is passed as an argument to the builtin function iter(), it returns an iterator for the object. This iterator is good for one pass over the set of values. When using iterables, it is usually not necessary to call iter() or deal with iterator objects yourself. The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop. See also iterator, sequence, and generator.
  • >>> 3 * 3.75 / 1.5
    7.5
    >>> 7.0 / 2
    3.5
    20 Một đối tượng đại diện cho một luồng dữ liệu. Các cuộc gọi lặp đi lặp lại đến phương thức Iterator tiếp theo () trả về các mục liên tiếp trong luồng. Khi không có thêm dữ liệu, ngoại lệ dừng lại được nêu ra thay thế. Tại thời điểm này, đối tượng iterator đã cạn kiệt và bất kỳ cuộc gọi nào đến phương thức tiếp theo của nó () chỉ cần tăng một lần nữa. Trình lặp được yêu cầu phải có một phương thức __iter __ () trả về chính đối tượng iterator để mọi trình lặp cũng có thể lặp lại và có thể được sử dụng ở hầu hết các nơi mà các vòng lặp khác được chấp nhận. Một ngoại lệ đáng chú ý là mã cố gắng nhiều lần lặp. Một đối tượng container (như danh sách) tạo ra một trình lặp mới mỗi lần bạn chuyển nó đến hàm iter () hoặc sử dụng nó trong một vòng lặp. Cố gắng điều này với một trình lặp sẽ chỉ trả về cùng một đối tượng lặp cạn kiệt được sử dụng trong lần lặp trước đó, làm cho nó xuất hiện giống như một thùng chứa trống.
    An object representing a stream of data. Repeated calls to the iterator’s next() method return successive items in the stream. When no more data is available a StopIteration exception is raised instead. At this point, the iterator object is exhausted and any further calls to its next() method just raise StopIteration again. Iterators are required to have an __iter__() method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted. One notable exception is code that attempts multiple iteration passes. A container object (such as a list) produces a fresh new iterator each time you pass it to the iter() function or use it in a for loop. Attempting this with an iterator will just return the same exhausted iterator object used in the previous iteration pass, making it appear like an empty container.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    01 Hãy nhìn trước khi bạn nhảy. Phong cách mã hóa này kiểm tra rõ ràng cho các điều kiện trước khi thực hiện cuộc gọi hoặc tra cứu. Phong cách này tương phản với phương pháp EAFP và được đặc trưng bởi sự hiện diện của nhiều câu nói nếu.
    Look before you leap. This coding style explicitly tests for pre-conditions before making calls or lookups. This style contrasts with the EAFP approach and is characterized by the presence of many if statements.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    02 Một cách nhỏ gọn để xử lý tất cả hoặc một tập hợp con của các phần tử trong một chuỗi và trả về một danh sách với kết quả. Kết quả = [[0x % 02x, % x cho x trong phạm vi (256) nếu x % 2 == 0] tạo danh sách các chuỗi chứa số HEX (0x ..) chẵn và trong phạm vi từ 0 đến 255. Mệnh đề IF là tùy chọn. Nếu bị bỏ qua, tất cả các yếu tố trong phạm vi (256) được xử lý.
    A compact way to process all or a subset of elements in a sequence and return a list with the results. result = [“0x%02x” % x for x in range(256) if x % 2 == 0] generates a list of strings containing hex numbers (0x..) that are even and in the range from 0 to 255. The if clause is optional. If omitted, all elements in range(256) are processed.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    03 Một đối tượng container (chẳng hạn như dict) hỗ trợ tra cứu khóa tùy ý bằng phương pháp đặc biệt __getItem __ ().
    A container object (such as dict) that supports arbitrary key lookups using the special method __getitem__().
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    04 Lớp của một lớp. Định nghĩa lớp tạo ra một tên lớp, từ điển lớp và danh sách các lớp cơ sở. Metaclass chịu trách nhiệm lấy ba đối số đó và tạo ra lớp học. Hầu hết các ngôn ngữ lập trình theo định hướng đối tượng cung cấp một triển khai mặc định. Điều làm cho Python trở nên đặc biệt là có thể tạo ra các metaclass tùy chỉnh. Hầu hết người dùng không bao giờ cần công cụ này, nhưng khi có nhu cầu, Metaclasses có thể cung cấp các giải pháp mạnh mẽ, thanh lịch. Chúng đã được sử dụng để ghi nhật ký truy cập thuộc tính, thêm an toàn chủ đề, theo dõi việc tạo đối tượng, thực hiện singletons và nhiều tác vụ khác.
    The class of a class. Class definitions create a class name, a class dictionary, and a list of base classes. The metaclass is responsible for taking those three arguments and creating the class. Most object oriented programming languages provide a default implementation. What makes Python special is that it is possible to create custom metaclasses. Most users never need this tool, but when the need arises, metaclasses can provide powerful, elegant solutions. They have been used for logging attribute access, adding thread-safety, tracking object creation, implementing singletons, and many other tasks.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    05 Các đối tượng có thể thay đổi có thể thay đổi giá trị của chúng nhưng giữ ID (). Xem thêm bất biến.
    Mutable objects can change their value but keep their id(). See also immutable.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    06 Nơi lưu trữ một biến. Không gian tên được thực hiện như từ điển. Có các không gian tên địa phương, toàn cầu và tích hợp cũng như các không gian tên lồng trong các đối tượng (trong phương pháp). Không gian tên hỗ trợ mô -đun bằng cách ngăn chặn xung đột đặt tên. Chẳng hạn, các hàm __builtin __. Open () và os.open () được phân biệt bởi không gian tên của chúng. Các không gian tên cũng hỗ trợ khả năng đọc và khả năng bảo trì bằng cách làm rõ mô -đun nào thực hiện một chức năng. Chẳng hạn, viết ngẫu nhiên.seed () hoặc itertools.izip () cho thấy rõ rằng các hàm đó được thực hiện bởi các mô -đun ngẫu nhiên và itertools tương ứng.
    The place where a variable is stored. Namespaces are implemented as dictionaries. There are the local, global and builtin namespaces as well as nested namespaces in objects (in methods). Namespaces support modularity by preventing naming conflicts. For instance, the functions __builtin__.open() and os.open() are distinguished by their namespaces. Namespaces also aid readability and maintainability by making it clear which module implements a function. For instance, writing random.seed() or itertools.izip() makes it clear that those functions are implemented by the random and itertools modules respectively.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    07 Khả năng tham khảo một biến trong một định nghĩa kèm theo. Ví dụ, một hàm được xác định bên trong một hàm khác có thể tham khảo các biến trong hàm bên ngoài. Lưu ý rằng phạm vi lồng nhau chỉ hoạt động để tham khảo và không được chuyển nhượng sẽ luôn ghi vào phạm vi trong cùng. Ngược lại, các biến cục bộ cả đọc và viết trong phạm vi trong cùng. Tương tự như vậy, các biến toàn cầu đọc và ghi vào không gian tên toàn cầu.
    The ability to refer to a variable in an enclosing definition. For instance, a function defined inside another function can refer to variables in the outer function. Note that nested scopes work only for reference and not for assignment which will always write to the innermost scope. In contrast, local variables both read and write in the innermost scope. Likewise, global variables read and write to the global namespace.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    08 Bất kỳ lớp nào kế thừa từ đối tượng. Điều này bao gồm tất cả các loại tích hợp như Danh sách và Dict. Chỉ các lớp kiểu mới mới có thể sử dụng các tính năng mới hơn, đa năng hơn như __Slots__, mô tả, thuộc tính, __getAttribution __ (), phương thức lớp và phương thức tĩnh.
    Any class that inherits from object. This includes all built-in types like list and dict. Only new-style classes can use Python’s newer, versatile features like __slots__, descriptors, properties, __getattribute__(), class methods, and static methods.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    09 Một bản phát hành Python huyền thoại, không bắt buộc phải tương thích ngược, với giao diện thần giao cách cảm.
    A mythical python release, not required to be backward compatible, with telepathic interface.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    10 Một tuyên bố bên trong một lớp kiểu mới lưu bộ nhớ bằng không gian khai báo trước cho các thuộc tính và loại bỏ các từ điển thể hiện. Mặc dù phổ biến, kỹ thuật này có phần khó khăn để có được quyền và được bảo lưu tốt nhất cho những trường hợp hiếm hoi trong đó có một số lượng lớn các trường hợp trong một ứng dụng quan trọng bộ nhớ.
    A declaration inside a new-style class that saves memory by pre-declaring space for instance attributes and eliminating instance dictionaries. Though popular, the technique is somewhat tricky to get right and is best reserved for rare cases where there are large numbers of instances in a memory-critical application.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    11 Một ITable có thể hỗ trợ quyền truy cập phần tử hiệu quả bằng cách sử dụng các chỉ số số nguyên thông qua các phương thức đặc biệt __getItem __ () và __len __ (). Một số loại trình tự tích hợp là danh sách, str, tuple và unicode. Lưu ý rằng Dical cũng hỗ trợ __getItem __ () và __len __ (), nhưng được coi là ánh xạ thay vì một chuỗi vì các tra cứu sử dụng các khóa bất biến tùy ý thay vì số nguyên.
    An iterable which supports efficient element access using integer indices via the __getitem__() and __len__() special methods. Some built-in sequence types are list, str, tuple, and unicode. Note that dict also supports __getitem__() and __len__(), but is considered a mapping rather than a sequence because the lookups use arbitrary immutable keys rather than integers.
  • >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    12 Liệt kê các nguyên tắc và triết lý thiết kế Python hữu ích trong việc hiểu và sử dụng ngôn ngữ. Danh sách này có thể được tìm thấy bằng cách gõ vào ____ ____913 tại dấu nhắc tương tác.
    Listing of Python design principles and philosophies that are helpful in understanding and using the language. The listing can be found by typing “
    >>> 1j * 1J
    (-1+0j)
    >>> 1j * complex(0,1)
    (-1+0j)
    >>> 3+1j*3
    (3+3j)
    >>> (3+1j)*3
    (9+3j)
    >>> (1+2j)/(1+1j)
    (1.5+0.5j)
    13” at the interactive prompt.

. [2] thật ra, gọi Theo tham chi ế tạo ra (ví dụ như các . . Việc thực thi câu lệnh nÀy Nhập Tênn hàn vào [5] trừ một chuyện. Các Đối tượng Mô-ingun Có Một Thuộc Tính Chỉ Tênn

>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
98 Là Một Thuộc Tính nh ưng Không Phải Là Một Tênn Toàn Cục. Rõn ràng, sử dụng nó vi phạm tính tr
[2]Thật ra, gọi theo tham chiếu đối tượng (call by object reference) có thể là một diễn giải tốt hơn, vì nếu một đối tượng khả đổi được truyền vào, nơi gọi sẽ nhận được các thay đổi do nơi được gọi tạo ra (ví dụ như các phần tử được thêm vào danh sách).
[3]Không nên dựa vào luật so sánh các đối tượng khác kiểu vì nó có thể bị thay đổi ở phiên bản tương lai của ngôn ngữ.
[4]Thật ra các định nghĩa hàm cũng là `các câu lệnh’ được `thực thi’; việc thực thi câu lệnh này nhập tên hàm vào bảng ký hiệu toàn cục của mô-đun.
[5]Trừ một chuyện. Các đối tượng mô-đun có một thuộc tính chỉ đọc gọi là
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
98 trả về một từ điển dùng để cài đặt vùng tên của mô-đun; tên
>>> x = y = z = 0  # Zero x, y and z
>>> x
0
>>> y
0
>>> z
0
98 là một thuộc tính nhưng không phải là một tên toàn cục. Rõ ràng, sử dụng nó vi phạm tính trừu tượng của cài đặt vùng tên, và nên được giới hạn vào những chuyện như gỡ rối.

Sub 1.2 Shoppy Huts: //shope.i/1woid -f Family