Mẫu hình | Ngôn ngữ lập trình hướng đối tượng, lập trình câu lệnh, lập trình hàm, lập trình thủ tục, lập trình phản xạ |
---|---|
Thiết kế bởi | Guido van Rossum |
Nhà phát triển | Python Software Foundation |
Xuất hiện lần đầu | 1991; 33 năm trước |
Phiên bản ổn định | 3.12.4
/ 6 tháng 6 2024 |
Kiểm tra kiểu | Vịt, động, mạnh
từ phiên bản 3.5: dần dần |
Giấy phép | Giấy phép Python Software Foundation |
Phần mở rộng tên tập tin | .py,.pyc,.pyd,.pyo (trước 3.5), .pyw,.pyz (từ 3.5) |
Trang mạng | www |
Các bản triển khai lớn | |
CPython, IronPython, Jython, MicroPython, Numba, PyPy, Stackless Python | |
Phương ngữ | |
Cython, RPython, Starlark | |
Ảnh hưởng từ | |
ABC, ALGOL 68, C, C++, CLU, Dylan, Haskell, Icon, Java, Lisp, Modula-3, Perl, Smalltalk | |
Ảnh hưởng tới | |
Boo, Cobra, CoffeeScript, D, F#, Falcon, Genie, Go, Apache Groovy, JavaScript, Julia, Nim, Ring, Ruby, Swift |
Python (phát âm tiếng Anh: /ˈpaɪθɑːn/) là một ngôn ngữ lập trình bậc cao, đa dụng, được phát triển bởi Guido van Rossum và ra mắt lần đầu vào năm 1991. Python nổi bật với tính dễ đọc, dễ học và dễ nhớ, phù hợp cho người mới bắt đầu. Ngôn ngữ này có cú pháp rõ ràng và gọn gàng, thuận tiện cho việc viết mã với ít cú pháp phức tạp. Python rất phổ biến trong phát triển trí tuệ nhân tạo và vào tháng 7 năm 2018, van Rossum đã rút lui khỏi vai trò lãnh đạo cộng đồng Python sau 30 năm.
Python sử dụng kiểu dữ liệu động và tự động quản lý bộ nhớ, tương tự như Perl, Ruby, Scheme, Smalltalk, và Tcl. Python được phát triển dưới dạng mã nguồn mở và được điều hành bởi tổ chức phi lợi nhuận Python Software Foundation.
Ban đầu, Python được thiết kế để chạy trên hệ điều hành Unix. Tuy nhiên, theo thời gian, nó đã mở rộng ra nhiều hệ điều hành khác như MS-DOS, Mac OS, OS/2, Windows, Linux và các hệ điều hành tương tự Unix. Mặc dù nhiều cá nhân đã góp phần vào sự phát triển của Python, Guido van Rossum vẫn là người đứng đầu trong việc định hình hướng phát triển của ngôn ngữ này.
Python luôn nằm trong danh sách các ngôn ngữ lập trình phổ biến nhất.
Lịch sử
Vào những năm 1980, Guido van Rossum đã phát triển Python tại Trung tâm Toán học – Tin học (Centrum Wiskunde & Informatica, CWI) ở Hà Lan như là sự kế thừa của ngôn ngữ ABC. Python được thiết kế với khả năng xử lý ngoại lệ và giao tiếp với hệ điều hành Amoeba. Dự án bắt đầu vào tháng 12 năm 1989. Van Rossum giữ vai trò chính trong việc phát triển ngôn ngữ và duy trì trách nhiệm cho đến ngày 12 tháng 7 năm 2018, khi ông thông báo rút lui và từ bỏ danh hiệu 'Nhà độc tài nhân từ cho cuộc sống'. Vào tháng 1 năm 2019, cộng đồng Python đã bầu một 'Hội đồng chèo lái' gồm năm thành viên để điều hành dự án.
Python 2.0 ra mắt vào ngày 16 tháng 10 năm 2000, mang đến nhiều tính năng mới, bao gồm hệ thống thu gom rác theo chu kỳ và hỗ trợ Unicode.
Python 3.0 được phát hành vào ngày 3 tháng 12 năm 2008. Đây là một bản cập nhật lớn không hoàn toàn tương thích với các phiên bản trước. Một số tính năng chính của Python 3 đã được đưa trở lại các phiên bản Python 2.6.x và 2.7.x. Python 3 đi kèm với công cụ 2to3
, giúp tự động chuyển đổi mã từ Python 2 sang Python 3.
Các phiên bản Python 3.9.2 và 3.8.8 được phát hành để khắc phục các vấn đề bảo mật tồn tại ở các phiên bản trước, bao gồm cả Python 2.7, nhằm ngăn chặn nguy cơ thực thi mã từ xa và 'đầu độc' bộ nhớ đệm.
Vào năm 2022, các phiên bản Python 3.10.4, 3.9.12, 3.8.13 và 3.7.13 được phát hành để giải quyết các lỗ hổng bảo mật. Sau khi Python 3.9.13 ra mắt vào tháng 5 năm 2022, các phiên bản 3.9, 3.8 và 3.7 chỉ nhận bản vá bảo mật. Ngày 7 tháng 9 năm 2022, bốn bản cập nhật mới (3.10.7, 3.9.14, 3.8.14 và 3.7.14) được phát hành để khắc phục lỗ hổng có thể dẫn đến tấn công từ chối dịch vụ.
Tính đến tháng 10 năm 2023, Python 3.12 là phiên bản ổn định mới nhất. Các cải tiến đáng chú ý từ phiên bản 3.11 bao gồm những thay đổi trong ngôn ngữ và thư viện chuẩn.
Triết lý thiết kế và tính năng
Python là một ngôn ngữ lập trình hỗ trợ nhiều kiểu lập trình, bao gồm lập trình hướng đối tượng, lập trình cấu trúc, lập trình hàm và lập trình hướng khía cạnh (như siêu lập trình và siêu đối tượng). Ngoài ra, Python cũng hỗ trợ các mẫu hình lập trình khác qua các phần mở rộng, chẳng hạn như thiết kế theo hợp đồng và lập trình logic.
Python sử dụng kiểu dữ liệu động và kết hợp giữa đếm tham chiếu với bộ dọn rác kiểm tra theo chu kỳ để quản lý bộ nhớ. Ngôn ngữ này còn hỗ trợ phân giải tên động (liên kết muộn), cho phép các tên biến và phương thức được liên kết trong quá trình thực thi chương trình.
Thiết kế của Python cung cấp các tính năng lập trình hàm tương tự như trong ngôn ngữ Lisp. Python hỗ trợ các hàm filter
, map
và reduce
, cũng như các cấu trúc dữ liệu như danh sách (list comprehension), từ điển (dictionary), tập hợp (set), và các biểu thức bộ sinh (generator). Thư viện chuẩn bao gồm hai mô đun (itertools
và functools
) cung cấp các công cụ hàm vay mượn từ Haskell và Standard ML.
Triết lý cốt lõi của Python được trình bày trong tài liệu The Zen of Python (PEP 20), theo hình thức thơ Haiku, như sau:
- Đẹp đẽ luôn hơn xấu xí
- Minh bạch tốt hơn ngầm định
- Đơn giản hơn phức tạp
- Phức tạp hơn rắc rối
- Dễ đọc là rất quan trọng.
Thay vì tích hợp tất cả tính năng vào phần lõi, Python được thiết kế để dễ dàng mở rộng qua các mô đun. Tính mô đun nhỏ gọn này đã khiến Python trở nên phổ biến trong việc thêm các giao diện lập trình vào các ứng dụng hiện có. Tầm nhìn của Van Rossum về một ngôn ngữ với phần lõi nhỏ và thư viện chuẩn rộng lớn bắt nguồn từ sự thất vọng với ABC, một ngôn ngữ lập trình theo cách tiếp cận ngược lại. Python thường được gọi là ngôn ngữ 'tặng kèm pin' nhờ vào thư viện chuẩn phong phú của nó.
Python hướng đến cú pháp đơn giản và rõ ràng, cho phép lập trình viên tự chọn cách viết mã của mình. Ngược lại với khẩu hiệu 'có nhiều hơn một cách để làm việc này,' triết lý thiết kế của Python nhấn mạnh rằng 'nên có một cách rõ ràng nhất để làm việc này.' Alex Martelli, một Viện sĩ tại Tổ chức Phần mềm Python và tác giả sách về Python, cho biết rằng 'Việc mô tả một cái gì đó là 'tài tình' không được coi là khen ngợi trong văn hóa Python.'
Các nhà phát triển Python tránh việc tối ưu hóa quá sớm và không chấp nhận các bản vá không nâng cao đáng kể hiệu suất mà làm giảm tính rõ ràng của bản triển khai tham khảo CPython. Để tăng tốc độ, lập trình viên có thể chuyển các hàm hạn chế thời gian sang mô đun mở rộng viết bằng các ngôn ngữ như C hoặc sử dụng PyPy, trình biên dịch JIT. Cython cũng có thể được sử dụng để biên dịch mã Python sang C và tạo các lệnh gọi API trực tiếp vào trình thông dịch Python.
Mục tiêu của các nhà phát triển Python là mang lại niềm vui cho người dùng ngôn ngữ này. Điều này thể hiện qua tên gọi – một tri ân đến nhóm hài Monty Python – và trong cách tiếp cận đôi khi vui nhộn trong hướng dẫn và tài liệu tham khảo, chẳng hạn như các ví dụ liên quan đến trứng và spam (gợi nhớ đến tiểu phẩm của Monty Python) thay vì các ví dụ tiêu chuẩn như foo và bar.
Một từ phổ biến trong cộng đồng Python là pythonic (đậm chất Python), có nhiều ý nghĩa liên quan đến phong cách lập trình. Khi nói một đoạn mã là pythonic, có nghĩa là đoạn mã đó sử dụng tốt các thành ngữ của Python, trông tự nhiên và dễ đọc, phù hợp với triết lý tối giản của Python. Ngược lại, mã khó hiểu hoặc giống như bản dịch thô từ ngôn ngữ khác được gọi là unpythonic (không đậm chất Python).
Những người đam mê và giỏi Python, đặc biệt là những người dày dạn kinh nghiệm, thường được gọi là Pythonista.
Cú pháp
Python là ngôn ngữ lập trình có cú pháp dễ đọc và dễ hiểu. Cấu trúc của nó rất gọn gàng và trực quan, thường sử dụng từ khóa bằng tiếng Anh thay vì dấu câu như nhiều ngôn ngữ khác. Python không cần dấu ngoặc nhọn để phân chia khối lệnh, và dấu chấm phẩy ở cuối câu lệnh gần như không được dùng, dù không bị cấm. So với các ngôn ngữ như C hay Pascal, Python có ít ngoại lệ cú pháp và trường hợp đặc biệt hơn.
Thụt lề
Python sử dụng khoảng trắng hoặc ký tự tab để thụt lề, thay vì dùng dấu ngoặc nhọn hay từ khóa để phân định khối lệnh. Việc thụt lề giúp xác định cấu trúc khối lệnh một cách trực quan. Cấu trúc chương trình phản ánh chính xác cấu trúc ngữ nghĩa của nó. Tính năng này đôi khi được gọi là 'quy tắc việt vị,' xuất hiện trong một số ngôn ngữ, nhưng ở đa số ngôn ngữ, thụt lề không ảnh hưởng đến cú pháp. Cỡ thụt lề được khuyến nghị là bốn khoảng trắng.
Câu lệnh và luồng điều khiển
Một số câu lệnh cơ bản trong Python bao gồm:
- Câu lệnh gán, sử dụng một dấu '='.
- Câu lệnh
if
: thực hiện một khối lệnh nếu điều kiện đúng, có thể kết hợp vớielse
vàelif
(else-if). - Câu lệnh
for
: lặp qua từng phần tử trong một đối tượng lặp được, gán mỗi phần tử cho một biến cục bộ để sử dụng trong vòng lặp. - Câu lệnh
while
: thực hiện một khối lệnh khi điều kiện vẫn còn đúng. - Câu lệnh
try
: cho phép bắt và xử lý ngoại lệ nâng lên (raise), và đảm bảo rằng mã trong khốifinally
luôn được thực thi, dù có lỗi hay không. - Câu lệnh
raise
: dùng để nâng một ngoại lệ hoặc nâng lại một ngoại lệ đã bị bắt trước đó. - Câu lệnh
class
: định nghĩa một lớp và không gian tên cục bộ cho lớp đó, phục vụ cho lập trình hướng đối tượng. - Câu lệnh
def
: dùng để định nghĩa một hàm hoặc phương thức. - Câu lệnh
with
: bao bọc một khối lệnh bằng bộ quản lý ngữ cảnh (context manager), giúp thực hiện các hành vi như RAII (quản lý tài nguyên) và thay thế các câu lệnh try/finally. - Câu lệnh
break
: thoát khỏi vòng lặp. - Câu lệnh
continue
: bỏ qua phần lặp hiện tại và tiếp tục với vòng lặp tiếp theo. - Câu lệnh
del
: xóa một biến, làm mất tham chiếu từ tên đến giá trị và việc sử dụng biến đó sẽ gây lỗi. Biến đã xóa có thể được tái sử dụng. - Câu lệnh
pass
: đóng vai trò như một lệnh không thực hiện gì. Được dùng để tạo các khối lệnh rỗng. - Câu lệnh
assert
: dùng trong quá trình gỡ lỗi để kiểm tra điều kiện phải đúng. - Câu lệnh
yield
: trả về giá trị từ một hàm bộ sinh;yield
cũng là một toán tử, thường dùng để triển khai các đồng thường trình. - Câu lệnh
return
: trả về một giá trị từ hàm hoặc phương thức. - Câu lệnh
import
: dùng để nhập các mô-đun chứa các hàm và biến cho chương trình hiện tại.
Câu lệnh gán (=
) liên kết một tên với một đối tượng được cấp phát động. Các biến có thể được gán lại với bất kỳ đối tượng nào. Trong Python, một tên biến chỉ giữ tham chiếu mà không có kiểu dữ liệu cố định đi kèm. Tuy nhiên, tại một thời điểm cụ thể, biến sẽ tham chiếu đến một vài đối tượng có kiểu dữ liệu. Điều này gọi là kiểu động, trái ngược với các ngôn ngữ kiểu tĩnh, nơi mỗi biến chỉ chứa giá trị của một kiểu dữ liệu cố định.
Biểu thức
Một số biểu thức trong Python tương tự như các biểu thức trong những ngôn ngữ khác như C và Java, trong khi một số khác thì khác biệt:
- Các phép toán cộng, trừ và nhân trong Python tương tự như các ngôn ngữ khác, nhưng phép chia lại có hai loại: phép chia nguyên với dấu
//
và phép chia dấu phẩy động với dấu/
. Python còn hỗ trợ toán tử**
để thực hiện phép luỹ thừa. - Từ Python , toán tử trung tố
@
đã được thêm vào, dùng chủ yếu trong các thư viện như NumPy để nhân ma trận. - Python 3.8 giới thiệu toán tử
:=
, hay còn gọi là 'toán tử moóc', giúp gán giá trị vào biến trong các biểu thức phức tạp hơn. - Toán tử
==
trong Python so sánh giá trị, không giống như Java, nơi số được so sánh theo giá trị và đối tượng theo tham chiếu. Toán tửis
trong Python so sánh danh tính (tham chiếu). Các phép so sánh trong Python có thể được nối lại, ví dụ:a <= b <= c
. - Python dùng các từ khóa
and
,or
,not
để thực hiện các phép toán luận lý thay vì các ký hiệu như&&
,||
,!
như trong Java và C. - Python có biểu thức thông hiểu danh sách (list comprehension) và biểu thức bộ sinh (generator expression).
- Hàm vô danh được định nghĩa qua biểu thức lambda; tuy nhiên, thân hàm chỉ có thể là một biểu thức đơn.
- Biểu thức điều kiện trong Python được viết dưới dạng
x if c else y
, khác với trật tự toán tửc ? x : y
trong các ngôn ngữ khác. - Danh sách và bộ trong Python có sự khác biệt. Danh sách được viết dưới dạng
[1, 2, 3]
, có thể thay đổi và không thể dùng làm khóa từ điển. Bộ được viết dưới dạng(1, 2, 3)
, không thay đổi và có thể dùng làm khóa từ điển nếu tất cả phần tử đều bất biến. Toán tử+
nối các bộ lại với nhau và tạo ra bộ mới mà không thay đổi bộ gốc. Ví dụ:t = t + (4, 5)
sẽ tạo ra(1, 2, 3, 4, 5)
và gán lại chot
. - Python hỗ trợ tính năng tháo tách chuỗi (sequence unpacking), cho phép gán các giá trị từ một đối tượng lặp được vào nhiều biến cùng lúc. Đối tượng lặp được phải có số lượng giá trị khớp với số biến.
- Toán tử định dạng xâu
%
trong Python tương tự như định dạng xâuprintf
trong C. Ví dụ:'spam=%s eggs=%d' % ('blah', 2)
cho kết quả'spam=blah eggs=2'
. Python 3.6 bổ sung thêm 'f-string':blah = 'blah'; eggs = 2; f'spam={blah} eggs={eggs}'
. - Xâu trong Python có thể được nối lại bằng toán tử cộng (dùng toán tử giống như phép cộng số). Ví dụ,
'spam' + 'eggs'
cho kết quả'spameggs'
. Xâu chứa số cũng được ghép thành xâu, chẳng hạn'2' + '2'
cho'22'
. - Python hỗ trợ nhiều kiểu hằng xâu:
- Xâu phân cách bằng dấu nháy đơn hoặc nháy kép. Cả hai đều dùng dấu chéo ngược (
\
) làm ký tự thoát. Python 3.6 thêm hỗ trợ hằng xâu định dạng. - Xâu ba dấu nháy: có thể trải dài nhiều dòng, tương tự tài liệu đây (here document) trong Unix, Perl và Ruby.
- Xâu thô, ký hiệu bằng ký tự
r
, không thông dịch các chuỗi thoát, hữu ích cho biểu thức chính quy và đường dẫn tệp trên Windows.
- Xâu phân cách bằng dấu nháy đơn hoặc nháy kép. Cả hai đều dùng dấu chéo ngược (
- Python hỗ trợ chỉ số mảng và cắt lát cho danh sách, được kí hiệu là
a[khoá]
,a[đầu:cuối]
vàa[đầu:cuối:bước]
. Chỉ số bắt đầu từ 0, và chỉ số âm lùi từ cuối lên. Cắt lát lấy các phần tử từ đầu đến chỉ số cuối (không bao gồm cuối). Tham số cắt lát thứ ba (bước) cho phép bỏ qua hoặc đảo chiều các phần tử. Chỉ số cắt lát có thể bỏ trống, ví dụa[:]
trả lại bản sao của danh sách.
Trong Python, sự phân biệt giữa biểu thức và câu lệnh là rất rõ ràng, khác hẳn với các ngôn ngữ như Common Lisp, Scheme hay Ruby. Điều này dẫn đến việc nhiều biểu thức và câu lệnh có thể thực hiện những chức năng tương tự nhau. Ví dụ:
- Thông hiểu danh sách và vòng lặp
for
- Biểu thức điều kiện và khối lệnh
if
- Hàm
eval()
(đánh giá biểu thức) vàexec()
(thực thi câu lệnh); trong Python 2,exec
là một câu lệnh.
Câu lệnh không thể nằm trong biểu thức, vì vậy các thông hiểu (bao gồm cả danh sách) và biểu thức lambda, vốn là các biểu thức, không thể chứa câu lệnh. Ví dụ, một câu lệnh gán như a = 1
không thể là một phần của biểu thức điều kiện trong câu lệnh điều kiện. Điều này giúp tránh lỗi thường gặp trong C, khi sử dụng toán tử gán =
thay vì toán tử so sánh ==
. Ví dụ, if (c = 1) { ... }
là mã C hợp lệ nhưng không phải là ý định chính xác, còn if c = 1: ...
sẽ báo lỗi cú pháp trong Python.
Phương thức
Phương thức của đối tượng là hàm gắn liền với lớp của đối tượng đó. Cú pháp là hiện_thể.phương_thức(đối số)
, trong đó các hàm và phương thức bình thường có cú pháp đặc biệt là Lớp.phương_thức(hiện_thể, đối số)
. Các phương thức trong Python luôn nhận tham số self
để truy cập dữ liệu của đối tượng (instance), khác với biến tương tự như self
hay this
trong nhiều ngôn ngữ lập trình hướng đối tượng khác (C++, Java, Objective-C, Ruby). Python cũng hỗ trợ các phương thức gạch dưới (các phương thức có tên bắt đầu và kết thúc bằng hai dấu gạch dưới), cho phép các lớp do người dùng định nghĩa điều chỉnh cách xử lý của Python như lấy chiều dài, so sánh, tính toán số học, chuyển đổi kiểu, v.v.
Kiểu dữ liệu
Python áp dụng kiểu định danh vịt (duck typing) và các đối tượng có kiểu dữ liệu, nhưng tên biến không bị ràng buộc kiểu. Kiểu dữ liệu không được kiểm tra khi biên dịch; thay vào đó, các thao tác trên đối tượng có thể gặp lỗi, cho thấy đối tượng không phù hợp với kiểu dữ liệu mong muốn. Dù là kiểu động, Python vẫn có kiểu dữ liệu mạnh, không cho phép thực hiện các thao tác không được định nghĩa rõ ràng (như cộng số vào chuỗi), thay vì âm thầm cố gắng thực hiện thao tác đó.
Python cho phép lập trình viên tạo kiểu dữ liệu tùy chỉnh thông qua lớp, thường được sử dụng trong lập trình hướng đối tượng. Các đối tượng của lớp thường được khởi tạo bằng cách gọi lớp đó (như SpamClass()
hoặc EggsClass()
), và các lớp là các đối tượng của siêu lớp type
(mà bản thân nó cũng là một đối tượng của chính nó), cho phép thực hiện siêu lập trình và phản xạ.
Trước phiên bản 3.0, Python có hai loại lớp: kiểu cũ và kiểu mới. Cú pháp của cả hai kiểu tương tự nhau. Sự khác biệt chính là lớp có kế thừa từ lớp object
hay không (tất cả các lớp kiểu mới đều kế thừa từ object
và là đối tượng của type
). Từ phiên bản Python 2.2 trở đi, cả hai loại lớp đều được hỗ trợ. Tuy nhiên, lớp kiểu cũ đã bị loại bỏ trong Python 3.0.
Kế hoạch dài hạn đang hỗ trợ việc định kiểu dần dần và từ Python , cú pháp của ngôn ngữ này cho phép chỉ định kiểu tĩnh, mặc dù chúng không được kiểm tra trong phiên bản CPython mặc định. Một công cụ kiểm tra kiểu tĩnh, có tên mypy, đang được thử nghiệm và có thể kiểm tra kiểu trong quá trình biên dịch.
Kiểu | Thay đổi được | Mô tả | Ví dụ cú pháp |
---|---|---|---|
bool
|
không | Kiểu dữ liệu luận lý | True False
|
bytearray
|
có | Chuỗi các byte nối tiếp | bytearray(b'Some ASCII') bytearray(b"Some ASCII") bytearray([119, 105, 107, 105])
|
bytes
|
không | Chuỗi các byte nối tiếp | b'Some ASCII' b"Some ASCII" bytes([119, 105, 107, 105])
|
complex
|
không | Số phức với phần thực và phần ảo | 3+2.7j 3 + 2.7j
|
dict
|
có | Mảng liên kết (hay từ điển) các cặp khoá và giá trị; có thể chứa lẫn lộn nhiều kiểu (khoá và giá trị), khoá phải là loại băm được | {'key1': 1.0, 3: False} {}
|
ellipsis
|
không | Một kiểu giữ chỗ chấm lửng được dùng như một chỉ số trong một mảng NumPy | ... Ellipsis
|
float
|
không | Số phẩy động độ chính xác đôi. Độ chính xác phụ thuộc vào từng máy nhưng trên thực tế thì nó thường được triển khai là một số IEEE 754 64-bit với độ chính xác là 53 bit. | 1.33333
|
frozenset
|
không | Tập hợp không được sắp xếp, không chứa các giá trị giống nhau; có thể chửa lẫn lộn nhiều kiểu, nếu băm được | frozenset([4.0, 'string', True])
|
int
|
không | Số nguyên với độ lớn không giới hạn | 42
|
list
|
có | Danh sách, có thể chứa lẫn lộn nhiều kiểu | [4.0, 'string', True] []
|
NoneType
|
không | Một đối tượng đại diện cho sự không có mặt của dữ liệu, tương đương với null trong các ngôn ngữ khác | None
|
NotImplementedType
|
không | Một kiểu giữ chỗ có thể được trả lại từ toán tử nạp chồng để biểu thị kiểu toán hạng không được hỗ trợ. | NotImplemented
|
range
|
không | Một chuỗi các số thường được dùng để lặp với số lần biết trước trong vòng lặpfor
|
range(-1, 10) range(10, -5, -2)
|
set
|
có | Tập hợp không được sắp xếp, không chứa các giá trị giống nhau; có thể chửa lẫn lộn nhiều kiểu, nếu băm được | {4.0, 'string', True} set()
|
str
|
không | Một xâu ký tự (string): chuỗi các điểm mã Unicode | 'Wikipedia' "Wikipedia" """Trải dài trên nhiều dòng""" |
tuple
|
không | Bộ; có thể chứa lẫn lộn nhiều kiểu | (4.0, 'xâu kí tự', True) ('phần tử',) ()
|
^a Không thể truy cập trực tiếp bằng tên
Phép toán số học
Python hỗ trợ các ký hiệu toán học phổ biến như +
, -
, *
, /
, toán tử chia sàn //
và toán tử chia lấy dư %
(số dư có thể âm, ví dụ 4 % -3 == -2
). Python cũng có toán tử **
cho phép tính lũy thừa, chẳng hạn như 5**3 == 125
và 9**0.5 == 3.0
, cùng với toán tử nhân ma trận @
. Các toán tử này hoạt động tương tự như trong toán học truyền thống, với thứ tự ưu tiên như nhau, và toán tử trung tố (+
và -
cũng có thể dùng làm toán tử một ngôi để biểu diễn số dương và số âm).
Phép chia giữa các số nguyên trả về kết quả là số thực. Cách hành xử của phép chia đã thay đổi đáng kể qua các phiên bản.
- Python (từ phiên bản 3.0) đã chuyển đổi toán tử
/
thành phép chia số thực, ví dụ:5/2 == 2.5
. - Trước đây, Python 2.2 đã thay đổi phép chia số nguyên để làm tròn về phía âm vô cực, ví dụ:
7/3 == 2
và-7/3 == -3
. Toán tử chia sàn//
đã được giới thiệu, vì vậy7//3 == 2
,-7//3 == -3
,7.5//3 == 2.0
và-7.5//3 == -3.0
. Sử dụngfrom __future__ import division
để áp dụng quy tắc chia của Python 3.0 trong các mô đun. - Trước Python 2.1, hành vi phép chia tương tự kiểu C. Toán tử
/
thực hiện phép chia nguyên nếu cả hai toán hạng là số nguyên; nếu không, nó thực hiện phép chia số thực. Phép chia nguyên làm tròn về 0, ví dụ:7/3 == 2
và-7/3 == -2
.
Trong Python, /
đại diện cho phép chia thực (hoặc đơn giản là phép chia), trong khi //
là phép chia sàn. Trước phiên bản 3.0, /
là phép chia cổ điển.
Hành vi làm tròn về phía âm vô cực, dù có khác biệt so với các ngôn ngữ khác, mang lại sự chính xác cao. Ví dụ, phương trình (a + b)//b == a//b + 1
luôn đúng. Phương trình b*(a//b) + a%b == a
cũng đúng cho cả giá trị dương và âm của a
. Tuy nhiên, để duy trì tính hợp lệ của phương trình này, a % b
phải nằm trong khoảng mở [0, b) với b
là số nguyên dương và trong khoảng (b, 0] khi b
âm.
Python cung cấp hàm round
để làm tròn số thực thành số nguyên gần nhất. Đối với các số có chữ số cuối là 5, Python 3 sử dụng phương pháp làm tròn thành số chẵn: round(1.5)
và round(2.5)
đều là 2
. Các phiên bản trước 3 làm tròn xa số 0: round(0.5)
là 1.0
và round(-0.5)
là −1.0
.
Python cho phép sử dụng các biểu thức logic với nhiều điều kiện liên tiếp một cách đồng nhất như trong toán học. Ví dụ, biểu thức a < b < c
kiểm tra xem a
có nhỏ hơn b
và b
có nhỏ hơn c
hay không. Các ngôn ngữ dựa trên C hiểu biểu thức này khác: trong C, biểu thức sẽ đánh giá a < b
trước, trả về 0 hoặc 1, sau đó kết quả này được so sánh với c
.
Python hỗ trợ số học với độ chính xác tùy ý cho tất cả các phép toán với số nguyên. Lớp Decimal
trong mô đun decimal
cung cấp số thập phân với độ chính xác tùy chỉnh và các phương pháp làm tròn khác nhau. Lớp Fraction
trong mô đun fractions
cung cấp số hữu tỉ với độ chính xác tùy ý.
Nhờ vào thư viện toán học phong phú của Python cùng với thư viện bên thứ ba NumPy, Python thường được sử dụng như một ngôn ngữ kịch bản để xử lý các vấn đề liên quan đến dữ liệu số và tính toán phức tạp.
Chú thích
# dòng chú thích
In giá trị
# Từ Python 3 trở đi print((7 + 8) / 2.0) print((2 + 3j) * (4 - 6j))
Nội suy chuỗi (string interpolation)
print('Hello {}!'.format('world')) print('a = {.2f} và b = {.2f}'.format(a,b))
Cấu trúc điều kiện
- Kiểu 1:
if biểu_thức_điều_kiện: # lệnh...
- Kiểu 2:
if biểu_thức_điều_kiện: # lệnh... else: # lệnh...
- Kiểu 3:
if biểu_thức_điều_kiện_1: # lệnh... (thực thi nếu biểu_thức_điều_kiện_1 đúng) elif biểu_thức_điều_kiện_2: # lệnh... (thực thi nếu biểu_thức_điều_kiện_1 sai nhưng biểu_thức_điều_kiện_2 đúng) else: # lệnh... (thực thi nếu tất cả các điều kiện trên đều sai)
- Khớp mẫu, thêm từ bản 3.10.0:
match biến_1: case điều_kiện_1: # thực thi nếu biến_1 = điều_kiện_1 case điều_kiện_2: # thực thi nếu biến_1 = điều_kiện_2
Cấu trúc vòng lặp
while biểu_thức_đúng: # lệnh...
for phần_tử in dãy: # lệnh...
L = ['Hà Nội', 'Hải Phòng', 'TP Hồ Chí Minh'] for thành_phố in L: print(thành_phố) for i in range(10): print(i)
Hàm
def tên_hàm (tham_biến_1, tham_biến_2, tham_biến_n): # lệnh... return giá_trị_hàm
Hàm với tham số mặc định:
def luỹ_thừa(x, n=2): '''Lũy thừa với số mũ mặc định là 2''' return x**n print(luỹ_thừa(3)) # 9 print(luỹ_thừa(2,3)) # 8
Lớp
class Lớp: #... class LớpCon(Lớp): '''LớpCon kế thừa từ Lớp''' x = 3 # thuộc tính của lớp # def phương_thức(self, tham_biến): #... # khởi tạo đối tượng a = LớpCon() print(a.x) print(a.phương_thức(m)) # m là giá trị cho tham biến
Xử lý ngoại lệ
try: câu_lệnh except Loại_Lỗi: thông báo lỗi
Thư viện
Bộ thư viện chuẩn phong phú của Python – một trong những lợi thế lớn nhất của Python – cung cấp công cụ phù hợp cho nhiều loại công việc khác nhau. Đối với các ứng dụng kết nối Internet, thư viện này hỗ trợ nhiều giao thức và định dạng chuẩn như MIME và HTTP. Nó cũng bao gồm các mô-đun để phát triển giao diện đồ hoạ người dùng, kết nối cơ sở dữ liệu quan hệ, sinh số ngẫu nhiên, tính toán với số thập phân chính xác cao, xử lý biểu thức chính quy và kiểm thử đơn vị.
Một số thành phần của thư viện chuẩn nằm trong đặc tả (ví dụ, Giao diện Cổng vào Máy chủ Web (WSGI) triển khai wsgiref
theo PEP 333), nhưng phần lớn các mô-đun không được xác định bằng đặc tả. Chúng được xác định thông qua mã nguồn, tài liệu và bộ kiểm thử của chúng. Tuy nhiên, vì phần lớn thư viện chuẩn là mã Python đa nền tảng, chỉ một số ít mô-đun cần phải được chỉnh sửa hoặc viết lại cho các triển khai khác nhau.
Tính đến tháng 9 năm 2021, Python Package Index (PyPI), kho phần mềm chính thức cho các gói Python bên thứ ba, chứa hơn 329.000 gói với nhiều chức năng phong phú, bao gồm:
- Tự động hóa
- Phân tích dữ liệu
- Cơ sở dữ liệu
- Tài liệu
- Giao diện người dùng đồ hoạ
- Xử lý hình ảnh
- Học máy
- Ứng dụng di động
- Đa phương tiện
- Mạng máy tính
- Khoa học tính toán
- Quản trị hệ thống
- Kiểm thử tự động
- Xử lý văn bản
- Khung mạng
- Thu thập web
Môi trường phát triển
Hầu hết các phiên bản Python (bao gồm CPython) đi kèm với một trình lặp đọc–tính–in (REPL), cho phép hoạt động như một trình thông dịch dòng lệnh, nơi người dùng có thể nhập lệnh và nhận ngay kết quả.
Python được cài đặt kèm với một môi trường phát triển tích hợp (IDE) có tên là IDLE, rất thích hợp cho người mới bắt đầu.
Các hệ vỏ khác như IDLE và IPython cung cấp thêm tính năng tự hoàn thiện mã, lưu trữ trạng thái phiên làm việc và tô sáng cú pháp.
Bên cạnh các IDE cài đặt trên máy tính, còn có các IDE chạy trên trình duyệt web như SageMath (dành cho phát triển các chương trình Python liên quan đến toán học và khoa học); PythonAnywhere, một IDE kết hợp môi trường lưu trữ; và Canopy IDE, một IDE Python thương mại tập trung vào khoa học tính toán.
Các bản triển khai
Ví dụ về triển khai
CPython là phiên bản chuẩn của Python, được lập trình bằng ngôn ngữ C, tuân thủ chuẩn C89 và một số tính năng chọn lọc của C99. Mặc dù các phiên bản C mới hơn đã ra mắt, CPython vẫn sử dụng phiên bản cũ và có phần mở rộng C riêng. Nó biên dịch mã Python thành mã byte trung gian và thực thi mã này trên máy ảo của mình. CPython đi kèm với thư viện chuẩn phong phú được viết bằng C và Python bản địa. Nó hỗ trợ nhiều nền tảng, bao gồm Windows (từ Python 3.9, trình cài đặt Python không còn hỗ trợ Windows 7 và 8; Windows XP được hỗ trợ cho đến Python ) và nhiều hệ điều hành Unix hiện đại như macOS (bao gồm máy Mac Apple M1 từ Python 3.9.1 với phiên bản thử nghiệm) và hỗ trợ không chính thức cho một số hệ thống như VMS. Khả năng tương thích đa nền tảng là ưu tiên chính trong các phiên bản Python 1 và Python 2, khi OS/2 và Solaris cũng được hỗ trợ; hiện tại nhiều hệ điều hành này đã không còn được hỗ trợ.
Các loại triển khai khác
- PyPy là một trình thông dịch nhanh, tuân thủ cú pháp của Python 2.7 và 3.6. Trình biên dịch tức thời của PyPy mang lại hiệu suất vượt trội so với CPython, mặc dù một số thư viện viết bằng C không thể sử dụng cùng với PyPy.
- Stackless Python là một nhánh đáng chú ý của CPython với hỗ trợ vi luồng, không sử dụng ngăn xếp lời gọi giống như CPython, cho phép xử lý đồng thời hiệu quả. PyPy cũng có phiên bản không sử dụng ngăn xếp.
- MicroPython và CircuitPython là các phiên bản của Python 3 được tối ưu hóa cho vi điều khiển, chẳng hạn như Lego Mindstorms EV3.
- Pyston là phiên bản của Python sử dụng biên dịch tức thời để cải thiện tốc độ thực thi các chương trình Python.
- Cinder là nhánh tối ưu hiệu năng của CPython 3.8, với nhiều cải tiến như đệm bộ nhớ mã byte trong dòng, đánh giá chương trình con tham vọng, trình biên dịch tức thời 'mỗi lúc một phương thức' và trình biên dịch mã byte thử nghiệm.
Biên dịch sang ngôn ngữ khác
Một số trình biên dịch chuyển đổi mã nguồn Python, một tập con hạn chế của Python, hoặc các ngôn ngữ tương tự Python sang các ngôn ngữ bậc cao khác:
- Brython, Transcrypt và Pyjs (phiên bản cuối cùng năm 2012) chuyển đổi Python sang JavaScript.
- Codon chuyển đổi một tập con Python với kiểu tĩnh sang mã máy (thông qua LLVM) và hỗ trợ đa luồng cho hệ thống bản địa.
- Cython chuyển đổi (một tập con của) Python 2.7 sang C. Mã kết quả có thể được sử dụng với Python qua các lệnh gọi API mức C vào trình thông dịch Python.
- Nuitka chuyển đổi Python sang C.
- Numba sử dụng LLVM để chuyển đổi một tập con của Python sang mã máy.
- Pythran chuyển đổi một tập con của Python 3 sang C++.
- Pyrex (phiên bản mới nhất năm 2010) và Shed Skin (phiên bản mới nhất năm 2013) chuyển đổi lần lượt sang C và C++.
- Google's Grumpy (phiên bản mới nhất năm 2017) chuyển đổi Python 2 sang Go.
- IronPython cho phép chạy các chương trình Python 2.7 trên .NET Common Language Runtime.
- Jython chuyển đổi Python 2.7 sang mã byte Java, cho phép sử dụng thư viện Java từ chương trình Python.
- RPython có thể được chuyển đổi sang C và được dùng để xây dựng trình thông dịch PyPy của Python.
Quá trình phát triển
Sự phát triển của Python chủ yếu được điều hành qua quy trình Đề nghị Cải tiến Python (Python Enhancement Proposal, hay PEP), là cơ chế chính để đề xuất các tính năng lớn mới, thu thập ý kiến cộng đồng về các vấn đề và ghi chép các quyết định thiết kế của Python. Phong cách viết mã của Python được quy định trong PEP 8. Các PEP quan trọng sẽ được cộng đồng Python và hội đồng điều hành xem xét và bình luận.
Cải tiến ngôn ngữ đi đôi với sự phát triển của bản triển khai chuẩn CPython. Danh sách thư python-dev là diễn đàn chính để thảo luận về sự phát triển của ngôn ngữ này. Các vấn đề cụ thể được theo dõi qua hệ thống lỗi Roundup tại bugs.python.org. Ban đầu, mã nguồn được quản lý trên một kho mã tự chủ sử dụng Mercurial, cho đến khi Python chuyển sang GitHub vào tháng 1 năm 2017.
Các bản phát hành công khai của CPython được phân thành ba loại, dựa trên phần nào của số phiên bản được nâng cấp:
- Phiên bản không tương thích ngược: mã nguồn có thể không hoạt động và cần chuyển đổi thủ công. Phần đầu của số phiên bản sẽ được tăng lên. Các bản phát hành như vậy rất hiếm; ví dụ, phiên bản 3.0 được phát hành 8 năm sau phiên bản 2.0. Theo dự đoán của Guido van Rossum, phiên bản 4.0 có thể không bao giờ được phát hành.
- Bản phát hành lớn hay bản phát hành 'tính năng': tương thích chủ yếu với các phiên bản trước nhưng bổ sung các tính năng mới. Phần thứ hai của số phiên bản được tăng lên. Kể từ Python 3.8, các bản phát hành sẽ diễn ra hàng năm. Mỗi phiên bản lớn sẽ nhận được hỗ trợ sửa lỗi trong vài năm sau khi phát hành.
- Phiên bản sửa lỗi: không có tính năng mới, được phát hành mỗi ba tháng khi số lỗi sửa được đủ lớn kể từ bản phát hành trước. Các lỗ hổng bảo mật cũng được khắc phục trong những phiên bản này. Phần ba và phần cuối cùng của số phiên bản được tăng lên.
Nhiều phiên bản alpha, beta và ứng cử viên cũng được phát hành để thử nghiệm và xem trước trước khi phát hành chính thức. Mặc dù có một lịch trình dự kiến cho mỗi bản phát hành, các bản phát hành thường bị trì hoãn nếu mã chưa sẵn sàng. Đội ngũ phát triển Python theo dõi tình trạng của mã qua các kiểm thử đơn vị lớn trong suốt quá trình phát triển.
Sự kiện học thuật quan trọng nhất của Python là PyCon. Bên cạnh đó, còn có các chương trình hướng dẫn Python đặc biệt như Pyladies.
Python 3.10 không còn hỗ trợ wstr
(sẽ bị loại bỏ từ Python 3.12, vì vậy các phần mở rộng Python cần được cập nhật), đồng thời bổ sung tính năng khớp mẫu (pattern matching) vào ngôn ngữ.
Độ phổ biến
Từ năm 2003, Python luôn nằm trong top mười ngôn ngữ lập trình phổ biến nhất theo chỉ số TIOBE. Tính đến tháng 10 năm 2021, Python đứng đầu danh sách, vượt qua Java và C. Python đã được vinh danh là Ngôn ngữ Lập trình của Năm vào các năm 2007, 2010, 2018 và 2020, là ngôn ngữ duy nhất đạt được vinh dự này bốn lần.
Nghiên cứu thực nghiệm cho thấy các ngôn ngữ kịch bản như Python có năng suất cao hơn so với các ngôn ngữ truyền thống như C và Java trong việc xử lý chuỗi và tìm kiếm trong từ điển. Nghiên cứu cũng chỉ ra rằng việc tiêu tốn bộ nhớ của Python thường 'tốt hơn Java và không kém hơn nhiều so với C hay C++'.
Nhiều tổ chức lớn như Wikipedia, Google, Yahoo!, CERN, NASA, Facebook, Amazon, Instagram, Spotify và các tổ chức nhỏ hơn như ILM và ITA sử dụng Python. Reddit, một trang mạng xã hội lớn, cũng chủ yếu được viết bằng Python.
Ứng dụng
Python có thể được sử dụng như một ngôn ngữ kịch bản cho các ứng dụng web, ví dụ qua mod wsgi trên máy chủ Apache. Giao diện Cổng vào Máy chủ Web (WSGI) là một API chuẩn đang được phát triển để hỗ trợ các ứng dụng web này. Các framework như Django, Pylons, Pyramid, TurboGears, web2py, Tornado, Flask, Bottle và Zope hỗ trợ các nhà phát triển trong việc thiết kế và bảo trì các ứng dụng phức tạp. Pyjs và IronPython có thể được dùng để phát triển phía khách cho các ứng dụng Ajax. SQLAlchemy giúp ánh xạ dữ liệu vào cơ sở dữ liệu quan hệ, còn Twisted là một framework dành cho giao tiếp giữa các máy tính, ví dụ như được sử dụng bởi Dropbox.
Các thư viện như NumPy, SciPy và Matplotlib cho phép Python xử lý hiệu quả trong các tính toán khoa học. Các thư viện chuyên biệt như Biopython và Astropy cung cấp các chức năng theo miền. SageMath là một hệ thống đại số máy tính với giao diện lập trình bằng Python, bao gồm nhiều lĩnh vực toán học như đại số, tổ hợp, giải tích số, lý thuyết số và vi tích phân. OpenCV cung cấp các tính năng phong phú về thị giác máy tính và xử lý ảnh.
Python được sử dụng rộng rãi trong trí tuệ nhân tạo và học máy nhờ các thư viện như TensorFlow, Keras, Pytorch và Scikit-learn. Với kiến trúc mô đun, cú pháp đơn giản và công cụ xử lý văn bản phong phú, Python cũng thường được sử dụng trong xử lý ngôn ngữ tự nhiên.
Python có thể được dùng để phát triển giao diện người dùng đồ họa (GUI) qua các thư viện như Tkinter hoặc tạo trò chơi thông qua các thư viện như Pygame, một thư viện chuyên làm trò chơi 2D.
Python đã được tích hợp thành công vào nhiều sản phẩm phần mềm như một ngôn ngữ kịch bản. Nó xuất hiện trong phần mềm phương pháp phần tử hữu hạn như Abaqus, trong các công cụ dựng mô hình 3D giống như FreeCAD, và trong các gói phần mềm hoạt hình 3D như 3ds Max, Blender, Cinema 4D, Lightwave, Houdini, Maya, Modo, MotionBuilder, và Softimage. Nó cũng được dùng trong trình tổng hợp hiệu ứng trực quan Nuke, các chương trình chỉnh sửa ảnh 2D như GIMP, Inkscape, Scribus, và Paint Shop Pro, cùng với các ứng dụng soạn nhạc và kí hiệu âm nhạc như Capella. GNU Debugger sử dụng Python để hiển thị các cấu trúc phức tạp như các kiểu chứa trong C++. Esri khuyến khích Python là lựa chọn tối ưu để viết script trong ArcGIS. Python cũng được áp dụng trong một số trò chơi video và là một trong ba ngôn ngữ lập trình đầu tiên có sẵn trên Google App Engine, cùng với Java và Go.
Nhiều hệ điều hành bao gồm Python như một thành phần tiêu chuẩn. Python có mặt trong hầu hết các bản phân phối Linux, AmigaOS 4 (với Python 2.7), FreeBSD (dưới dạng gói), NetBSD, OpenBSD (dưới dạng gói) và macOS, và có thể được sử dụng từ dòng lệnh (terminal). Một số bản phân phối Linux như Ubuntu sử dụng trình cài đặt Ubiquity viết bằng Python, trong khi Red Hat Linux và Fedora sử dụng Anaconda, và Gentoo Linux sử dụng Python cho hệ thống quản lý gói Portage.
Python được áp dụng rộng rãi trong ngành an toàn thông tin, bao gồm cả việc phát triển khai thác.
LibreOffice tích hợp Python và có kế hoạch thay thế Java bằng Python. Python Scripting Provider đã trở thành tính năng cốt lõi của LibreOffice kể từ phiên bản 4.0 phát hành ngày 7 tháng 2 năm 2013.
Ảnh hưởng của ngôn ngữ
Thiết kế và triết lý của Python đã tác động đến nhiều ngôn ngữ lập trình khác:
- CoffeeScript – một ngôn ngữ lập trình biên dịch sang JavaScript – lấy cảm hứng từ cú pháp của Python.
- ECMAScript/JavaScript đã mượn cơ chế vòng lặp và bộ sinh từ Python.
- GDScript, ngôn ngữ kịch bản tương tự Python, được tích hợp vào engine trò chơi Godot.
- Go được thiết kế để 'tăng tốc công việc trong một ngôn ngữ kiểu động giống như Python' và cả hai ngôn ngữ có cú pháp cắt lát mảng tương tự.
- Groovy được phát triển để mang triết lý thiết kế của Python vào Java.
- Julia được tạo ra với mục tiêu 'có thể dùng cho các mục đích chung giống như Python'.
- Mojo, một ngôn ngữ kế thừa của Python, cố gắng giữ nguyên cú pháp và hệ sinh thái của Python, với khả năng chạy nhanh hơn Python đến 35.000 lần.
- Nim cũng có cú pháp và thụt lề tương đồng với Python.
- Matsumoto Yukihiro, người sáng lập Ruby, đã nói: 'Tôi muốn một ngôn ngữ kịch bản mạnh mẽ hơn Perl và hướng đối tượng hơn Python. Đó là lý do tôi quyết định thiết kế ngôn ngữ của riêng mình.'
- Cổng thông tin Lập trình máy tính
- Cổng thông tin Phần mềm mã nguồn mở và tự do
- Zen of Python
- pip (trình quản lý gói)
Liên kết bên ngoài
- Trang chính thức của Python
- Wiki Python
- Tài liệu của Python
- Python Cheese Shop – Kho lưu trữ phần mềm viết bằng Python; trước đây gọi là Python Package Index (PyPI)
Ngôn ngữ lập trình |
---|
Phần mềm tự do nguồn mở |
---|
Tiêu đề chuẩn |
|
---|