Python: Đặc điểm lệnh, hàm, lớp, cấu trúc, kiểu dữ liệu

Thứ sáu - 08/05/2020 05:41
Ngôn ngữ lập trình Python là gì? Tất tần tật về PythonPython được thiết kế để trở thành một ngôn ngữ dễ học, mã nguồn dễ đọc, bố cục trực quan, dễ hiểu, thể hiện qua các điểm sau:

Từ khóa[ | ]

  • Python tăng cường sử dụng từ khóa tiếng Anh, hạn chế các ký hiệu và cấu trúc cú pháp so với các ngôn ngữ khác.
  • Python là một ngôn ngữ phân biệt kiểu chữ HOA, chữ thường.
  • Như C/C++, các từ khóa của Python đều ở dạng chữ thường.
and del for is raise
assert elif from lambda return
break else global not try
class except if or while
continue exec import pass yield
def finally in print  

Khối lệnh[ | ]

Trong các ngôn ngữ khác, khối lệnh thường được đánh dấu bằng cặp ký hiệu hoặc từ khóa. Ví dụ, trong C/C++, cặp ngoặc nhọn { } được dùng để bao bọc một khối lệnh. Python, trái lại, có một cách rất đặc biệt để tạo khối lệnh, đó là thụt các câu lệnh trong khối vào sâu hơn (về bên phải) so với các câu lệnh của khối lệnh cha chứa nó. Ví dụ, giả sử có đoạn mã sau trong C/C++:

 1 #include <math.h>
 2 //...
 3 delta = b * b  4 * a * c;
 4 if (delta > 0)
 5 {
 6     // Khối lệnh mới bắt đầu từ  tự { đến }
 7     x1 = (- b + sqrt(delta)) / (2 * a);
 8     x2 = (- b - sqrt(delta)) / (2 * a);
 9     printf("Phuong trinh co hai nghiem phan biet:\n");
10     printf("x1 = %f; x2 = %f", x1, x2);
11 }

Đoạn mã trên có thể được viết lại bằng Python như sau:

1 import math
2 #...
3 delta = b * b  4 * a * c
4 if delta > 0:
5     # Khối lệnh mới, thụt vào đầu dòng
6     x1 = (- b + math.sqrt(delta)) / (2 * a)
7     x2 = (- b  math.sqrt(delta)) / (2 * a)
8     print "Phuong trinh co hai nghiem phan biet:"
9     print "x1 = ", x1, "; ", "x2 = ", x2

Ta có thể sử dụng dấu tab hoặc khoảng trống để thụt các câu lệnh vào.

Các bản hiện thực[ | ]

Python được viết từ những ngôn ngữ khác, tạo ra những bản hiện thực khác nhau. Bản hiện thực Python chính, còn gọi là CPython, được viết bằng C, và được phân phối kèm một thư viện chuẩn lớn được viết hỗn hợp bằng C và Python. CPython có thể chạy trên nhiều nền và khả chuyển trên nhiều nền khác. Dưới đây là các nền trên đó, CPython có thể chạy.

Ngoài CPython, còn có hai hiện thực Python khác: Jython cho môi trường Java  IronPython cho môi trường .NET  Mono.

Khả năng mở rộng[ | ]

Python có thể được mở rộng: nếu ta biết sử dụng C, ta có thể dễ dàng viết và tích hợp vào Python nhiều hàm tùy theo nhu cầu. Các hàm này sẽ trở thành hàm xây dựng sẵn (built-in) của Python. Ta cũng có thể mở rộng chức năng của trình thông dịch, hoặc liên kết các chương trình Python với các thư viện chỉ ở dạng nhị phân (như các thư viện đồ họa do nhà sản xuất thiết bị cung cấp). Hơn thế nữa, ta cũng có thể liên kết trình thông dịch của Python với các ứng dụng viết từ C và sử dụng nó như là một mở rộng hoặc một ngôn ngữ dòng lệnh phụ trợ cho ứng dụng đó.

Trình thông dịch[ | ]

Python là một ngôn ngữ lập trình dạng thông dịch, do đó có ưu điểm tiết kiệm thời gian phát triển ứng dụng vì không cần phải thực hiện biên dịch  liên kết. Trình thông dịch có thể được sử dụng để chạy file script, hoặc cũng có thể được sử dụng theo cách tương tác. Ở chế độ tương tác, trình thông dịch Python tương tự shell của các hệ điều hành họ Unix, tại đó, ta có thể nhập vào từng biểu thức rồi gõ Enter, và kết quả thực thi sẽ được hiển thị ngay lập tức. Đặc điểm này rất hữu ích cho người mới học, giúp họ nghiên cứu tính năng của ngôn ngữ; hoặc để các lập trình viên chạy thử mã lệnh trong suốt quá trình phát triển phần mềm. Ngoài ra, cũng có thể tận dụng đặc điểm này để thực hiện các phép tính như với máy tính bỏ túi.

Lệnh và cấu trúc điều khiển[ | ]

Mỗi câu lệnh trong Python nằm trên một dòng mã nguồn. Ta không cần phải kết thúc câu lệnh bằng bất kì ký tự gì. Cũng như các ngôn ngữ khác, Python cũng có các cấu trúc điều khiển. Chúng bao gồm:

  • Cấu trúc rẽ nhánh: cấu trúc if (có thể sử dụng thêm elif hoặc else), dùng để thực thi có điều kiện một khối mã cụ thể.
  • Cấu trúc lặp, bao gồm:
  • Lệnh while: chạy một khối mã cụ thể cho đến khi điều kiện lặp có giá trị false.
  • Vòng lặp for: lặp qua từng phần tử của một dãy, mỗi phần tử sẽ được đưa vào biến cục bộ để sử dụng với khối mã trong vòng lặp.
  • Python cũng có từ khóa class dùng để khai báo lớp (sử dụng trong lập trình hướng đối tượng) và lệnh def dùng để định nghĩa hàm.

Hệ thống kiểu dữ liệu[ | ]

Python sử dụng hệ thống kiểu duck typing, còn gọi là latent typing (tự động xác định kiểu). Có nghĩa là, Python không kiểm tra các ràng buộc về kiểu dữ liệu tại thời điểm dịch, mà là tại thời điểm thực thi. Khi thực thi, nếu một thao tác trên một đối tượng bị thất bại, thì có nghĩa là đối tượng đó không sử dụng một kiểu thích hợp.

Python cũng là một ngôn ngữ định kiểu mạnh. Nó cấm mọi thao tác không hợp lệ, ví dụ cộng một con số vào chuỗi ký tự.

Sử dụng Python, ta không cần phải khai báo biến. Biến được xem là đã khai báo nếu nó được gán một giá trị lần đầu tiên. Căn cứ vào mỗi lần gán, Python sẽ tự động xác định kiểu dữ liệu của biến. Python có một số kiểu dữ liệu thông dụng sau:

  • int, long: số nguyên (trong phiên bản 3.x long được nhập vào trong kiểu int). Độ dài của kiểu số nguyên là tùy ý, chỉ bị giới hạn bởi bộ nhớ máy tính.
  • float: số thực
  • complex: số phức, chẳng hạn 5+4j
  • list: dãy trong đó các phần tử của nó có thể được thay đổi, chẳng hạn [8, 2, 'b', -1.5]. Kiểu dãy khác với kiểu mảng (array) thường gặp trong các ngôn ngữ lập trình ở chỗ các phần tử của dãy không nhất thiết có kiểu giống nhau. Ngoài ra phần tử của dãy còn có thể là một dãy khác.
  • tuple: dãy trong đó các phần tử của nó không thể thay đổi.
  • str: chuỗi ký tự. Từng ký tự trong chuỗi không thể thay đổi. Chuỗi ký tự được đặt trong dấu nháy đơn, hoặc nháy kép.
  • dict: từ điển, còn gọi là "hashtable": là một cặp các dữ liệu được gắn theo kiểu {từ khóa: giá trị}, trong đó các từ khóa trong một từ điển nhất thiết phải khác nhau. Chẳng hạn {1: "Python", 2: "Pascal"}
  • set: một tập không xếp theo thứ tự, ở đó, mỗi phần tử chỉ xuất hiện một lần.

Ngoài ra, Python còn có nhiều kiểu dữ liệu khác. Xem thêm trong phần "Các kiểu dữ liệu" bên dưới.

Module[ | ]

Python cho phép chia chương trình thành các module để có thể sử dụng lại trong các chương trình khác. Nó cũng cung cấp sẵn một tập hợp các modules chuẩn mà lập trình viên có thể sử dụng lại trong chương trình của họ. Các module này cung cấp nhiều chức năng hữu ích, như các hàm truy xuất tập tin, các lời gọi hệ thống, trợ giúp lập trình mạng (socket),…

Đa năng[ | ]

Python là một ngôn ngữ lập trình đơn giản nhưng rất hiệu quả.

  • So với Unix shell, Python hỗ trợ các chương trình lớn hơn và cung cấp nhiều cấu trúc hơn.
  • So với C, Python cung cấp nhiều cơ chế kiểm tra lỗi hơn. Nó cũng có sẵn nhiều kiểu dữ liệu cấp cao, ví dụ như các mảng (array) linh hoạt và từ điển (dictionary) mà ta sẽ phải mất nhiều thời gian nếu viết bằng C.

Python là một ngôn ngữ lập trình cấp cao có thể đáp ứng phần lớn yêu cầu của lập trình viên:

Multiple paradigms (đa biến hóa)[ | ]

Python là một ngôn ngữ đa biến hóa (multiple paradigms). Có nghĩa là, thay vì ép buộc mọi người phải sử dụng duy nhất một phương pháp lập trình, Python lại cho phép sử dụng nhiều phương pháp lập trình khác nhau: hướng đối tượng, có cấu trúc, chức năng, hoặc chỉ hướng đến một khía cạnh. Python kiểu kiểu động và sử dụng bộ thu gom rác để quản lý bộ nhớ. Một đặc điểm quan trọng nữa của Python là giải pháp tên động, kết nối tên biến và tên phương thức lại với nhau trong suốt thực thi của chương trình.

Sự tương đương giữa true và một giá trị khác 0[ | ]

Cũng như C/C++, bất kì một giá trị khác 0 nào cũng tương đương với true và ngược lại, một giá trị 0 tương đương với false. Như vậy:

 if a != 0:

tương đương với

 if a:

Cú pháp[ | ]

Sau đây là cú pháp cơ bản nhất của ngôn ngữ Python:

Khối lệnh[ | ]

Khác với đa số ngôn ngữ họ C sử dụng cặp ngoặc ngọn { } để phân chia khối lệnh, Python sử dụng lùi đầu dòng (indentation) như dấu cách hay tab để biểu thị khối lệnh. Các lệnh nằm cùng mức lùi đầu dòng sẽ cùng thuộc một khối. Để biểu thị một khối rỗng Python có từ khoá "pass".

Toán tử[ | ]

+ - * /  // (phép chia số nguyên)  % (chia lấy dư)  ** (lũy thừa)
~ (not)  & (and)  | (or)  ^ (xor)
<< (left shift)  >> (right shift)
== (bằng)  <=  >=    != (khác)

Python sử dụng ký pháp trung tố thường gặp trong các ngôn ngữ lập trình khác.

Các kiểu dữ liệu[ | ]

  • Kiểu số
    1234585396326 (số nguyên dài  hạn)  -86.12   7.84E-04
    2j     3 + 8j
    
  • Kiểu chuỗi (string)
  • Kiểu bộ (tuple)
    (1, 2.0, 3)   (1,)    ("Hello",1,())
    
  • Kiểu danh sách (list)
    [4.8, -6]    ['a','b']
    
  • Kiểu từ điển (dictionary)
    {"Hanoi":"Vietnam", "Haiphong":"Vietnam", "Hochiminh":"Vietnam", "Netherlands":"Amsterdam", "France":"Paris"}
    

Chú thích[ | ]

1 # dòng chú thích
1 "" " đa chú thích
2     đa chú thích
3     đa chú thích " ""

Lệnh gán[ | ]

1 tên biến = biểu thức
2 x = 23.8
3 y = -x ** 2
4 z1 = z2 = x + y
5 loiChao = "Hello!"
6 
7 i += 1    # tăng biến i thêm 1 đơn vị

In giá trị[ | ]

1 print biểu thức
2 print (7 + 8) / 2.0
3 print (2 + 3j) * (4 - 6j)

Nội suy chuỗi (string interpolation)

1 print "Hello %s" %("world!")
2 print "i = %d" %i
3 print "a = %.2f and b = %.3f" %(a,b)

Cấu trúc rẽ nhánh[ | ]

  • Dạng 1:
    if biểu_thức_điều_kiện:
        # lệnh...
    
  • Dạng 2:
    if biểu_thức_điều_kiện:
        # lệnh...
    else:
        # lệnh...
    
  • Dạng 3:
    if biểu_thức_điều_kiện_1:
        # lệnh... (được thực hiện nếu biểu_thức_điều_kiện_1 là đúng/true)
    elif biểu_thức_điều_kiện_2:
        # lệnh... (được thực hiện nếu biểu_thức_điều_kiện_1 là sai/false, nhưng biểu_thức_điều_kiện_2 là đúng/true)
    else:
        # lệnh... (được thực hiện nếu tất cả các biểu thức điều kiện đi kèm if và elif đều sai)
    

Cấu trúc lặp[ | ]

1 while biểu_thức_đúng:
2     # lệnh...
1 for phần_tử in dãy:
2     # lệnh...
1 L = ["Ha Noi", "Hai Phong", "TP Ho Chi Minh"]
2 for thanhPho in L:
3     print thanhPho
4 
5 for i in range(10):
6     print i

Hàm[ | ]

1 def tên_hàm (tham_biến_1, tham_biến_2, tham_biến_n):
2     # lệnh...
3     return giá_trị_hàm
1 def binhPhuong(x):
2     return x*x

Hàm với tham số mặc định:

1 def luyThua(x, n=2):
2    """Lũy thừa với số mũ mặc định là 2"""
3    return x**n
4 
5 print luyThua(3)   # 9
6 print luyThua(2,3) # 8

Lớp[ | ]

 1 class Tên_Lớp_1:
 2     #...
 3 
 4 class Tên_Lớp_2(Tên_Lớp_1):
 5     """Lớp 2 kế thừa lớp 1"""
 6     x = 3  # biến thành viên của lớp
 7     #
 8     def phương_thức(self, tham_biến):
 9         #...
10 
11 # khởi tạo
12 a = Tên_Lớp_2()
13 print a.x
14 print a.phương_thức(m)  # m là giá trị gán cho tham biến

List Comprehension[ | ]

List Comprehension là dạng cú pháp đặc biệt (syntactic sugar) (mới có từ Python 2.x) cho phép thao tác trên toàn bộ dãy (list) mà không cần viết rõ vòng lặp. Chẳng hạn y là một dãy mà mỗi phần tử của nó bằng bình phương của từng phần tử trong dãy x:

y = [xi**2 for xi in x]

Xử lý ngoại lệ[ | ]

try:
    câu_lệnh
except Loại_Lỗi:
    thông báo lỗi

Tốc độ thực hiện[ | ]

Là một ngôn ngữ thông dịch, Python có tốc độ thực hiện chậm hơn nhiều lần so với các ngôn ngữ biên dịch như Fortran, C,... Trong số các ngôn ngữ thông dịch, Python được đánh giá nhanh hơn Ruby  Tcl, nhưng chậm hơn Lua.[30]

Các đặc điểm mới trong Python 3.x[ | ]

Nội dung phần này được trích từ tài liệu[31] của Guido van Rossum. Phần này không liệt kê đầy đủ tất cả các đặc điểm; chi tiết xin xem tài liệu nói trên.

Một số thay đổi cần lưu ý nhất[ | ]

  • Lệnh print trở thành hàm print(). Theo đó sau print() ta cần nhớ gõ vào cặp ngoặc ():
    print("Goodbye")
    print(2+3)
    
  • Trả lại kết quả không còn là list trong một số trường hợp.
    • dict.keys(), dict.items(), dict.values() kết quả cho ra các "view" thay vì list.
    • map  filter trả lại các iterator.
    • range bây giờ có tác dụng như xrange, và không trả lại list.
  • So sánh

Không còn hàm cmp, và cmp(a, b) có thể được thay bằng (a > b) - (a < b)

  • Số nguyên
    • Kiểu long được đổi tên thành int.
    • 1/2 cho ta kết quả là số thực chứ không phải số nguyên.
    • Không còn hằng số sys.maxint
    • Kiểu bát phân được ký hiệu bằng 0o thay vì 0, chẳng hạn 0o26.
  • Phân biệt văn bản - dữ liệu nhị phân thay vì Unicode - chuỗi 8-bit
    • Tất cả chuỗi văn bản đều dưới dạng Unicode, nhưng chuỗi Unicode mã hóa lại là dạng dữ liệu nhị phân. Dạng mặc định là UTF-8.
    • Không thể viết u"a string" để biểu diễn chuỗi như trong các phiên bản 2.x

Các thay đổi về cú pháp[ | ]

Cú pháp mới[ | ]

  • Các tham biến chỉ chấp nhận keyword: Các tham biến phía sau *args phải được gọi theo dạng keyword.
  • Từ khóa mới nonlocal. Muốn khai báo một biến x với có phạm vi ảnh hưởng rộng hơn, nhưng chưa đến mức toàn cục, ta dùng nonlocal x.
  • Gán giá trị vào các phần tử tuple một cách thông minh, chẳng hạn có thể viết (a, *rest, b) = range(5) để có được a = 0; b = [1,2,3]; c = 4.
  • Dictionary comprehension, chẳng hạn {k: v for k, v in stuff} thay vì dict(stuff).
  • Kiểu nhị phân, chẳng hạn b110001.

Cú pháp được thay đổi[ | ]

  • raise [biểu_thức [from biểu_thức]]
  • except lệnh as biến
  • Sử dụng metaclass trong đối tượng:
    class C(metaclass=M):
        pass
    
    Cách dùng biến __metaclass__ không còn được hỗ trợ.

Cú pháp bị loại bỏ[ | ]

  • Không còn dấu ``, thay vì đó, dùng repr.
  • Không còn so sánh <> (dùng !=).
  • Không còn các lớp kiểu classic.
Nguồn: Wikipedia

Tổng số điểm của bài viết là: 5 trong 1 đánh giá

Xếp hạng: 5 - 1 phiếu bầu
Click để đánh giá bài viết

  Ý kiến bạn đọc

Mã bảo mật   
Đăng nhập
Hãy đăng nhập thành viên để trải nghiệm đầy đủ các tiện ích trên site
Thăm dò ý kiến

Bạn là sinh viên hệ nào?

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây