Python có một loại danh sách tích hợp sẵn tuyệt vời có tên là "list". Giá trị cố định trong danh sách được viết trong dấu ngoặc vuông [ ]. Danh sách hoạt động tương tự như chuỗi – hãy sử dụng hàm len() và dấu ngoặc vuông [ ] để truy cập dữ liệu, với phần tử đầu tiên ở chỉ mục 0. (Xem tài liệu chính thức về danh sách python.org.)
colors = ['red', 'blue', 'green'] print(colors[0]) ## red print(colors[2]) ## green print(len(colors)) ## 3
Việc gán bằng dấu = trên danh sách sẽ không tạo bản sao. Thay vào đó, việc gán sẽ khiến hai biến trỏ đến một danh sách trong bộ nhớ.
b = colors ## Does not copy the list
"Danh sách trống" chỉ là một cặp dấu ngoặc đơn trống [ ]. Dấu "+" dùng để nối hai danh sách, vì vậy [1, 2] + [3, 4] sẽ trả về [1, 2, 3, 4] (tương tự như + với chuỗi).
FOR và IN
Các cấu trúc *for* và *in* của Python cực kỳ hữu ích và chúng ta sẽ thấy cách sử dụng đầu tiên của các cấu trúc này là với danh sách. Cấu trúc *for* (cho) – for var in list
– là một cách dễ dàng để xem từng phần tử trong danh sách (hoặc bộ sưu tập khác). Không thêm hoặc xoá khỏi danh sách trong quá trình lặp lại.
squares = [1, 4, 9, 16] sum = 0 for num in squares: sum += num print(sum) ## 30
Nếu bạn biết loại thông tin nào trong danh sách, hãy sử dụng tên biến trong vòng lặp để ghi lại thông tin đó, chẳng hạn như "num" hoặc "name" hoặc "url". Vì mã Python không có cú pháp nào khác để nhắc bạn về các loại, nên tên biến là cách chính để bạn nắm bắt được những gì đang diễn ra. (Điều này hơi gây hiểu lầm. Khi tiếp xúc nhiều hơn với python, bạn sẽ thấy các thông tin tham chiếu đến gợi ý về kiểu, cho phép bạn thêm thông tin nhập vào định nghĩa hàm. Python không sử dụng các gợi ý loại này khi chạy chương trình. Các chương trình khác như IDE (môi trường phát triển tích hợp) và các công cụ phân tích tĩnh như trình tìm lỗi mã nguồn/trình kiểm tra kiểu sử dụng các tệp này để xác thực xem các hàm của bạn có được gọi bằng các đối số tương thích hay không.)
Bản thân cấu trúc *in* là một cách dễ dàng để kiểm tra xem một phần tử có xuất hiện trong danh sách (hoặc tập hợp khác) hay không – value in collection
– kiểm tra xem giá trị có nằm trong tập hợp hay không, trả về True/False.
list = ['larry', 'curly', 'moe'] if 'curly' in list: print('yay') ## yay
Các cấu trúc for/in rất thường được dùng trong mã Python và hoạt động với các kiểu dữ liệu không phải danh sách, vì vậy bạn chỉ cần ghi nhớ cú pháp của các cấu trúc này. Bạn có thể có thói quen từ các ngôn ngữ khác, trong đó bạn bắt đầu lặp lại một tập hợp theo cách thủ công, trong khi ở Python, bạn chỉ nên sử dụng for/in.
Bạn cũng có thể sử dụng for/in để xử lý một chuỗi. Chuỗi này hoạt động như một danh sách các ký tự, vì vậy for ch in s: print(ch)
sẽ in tất cả các ký tự trong một chuỗi.
Phạm vi
Hàm range(n) trả về các số 0, 1, ... n-1 và range(a, b) trả về a, a+1, ... b-1 – lên đến nhưng không bao gồm số cuối cùng. Sự kết hợp giữa vòng lặp for và hàm range() cho phép bạn tạo một vòng lặp for số truyền thống:
## print the numbers from 0 through 99 for i in range(100): print(i)
Có một biến thể xrange() giúp tránh chi phí tạo toàn bộ danh sách cho các trường hợp nhạy cảm về hiệu suất (trong Python 3, range() sẽ có hành vi hiệu suất tốt và bạn có thể quên xrange()).
Vòng lặp while
Python cũng có vòng lặp while tiêu chuẩn. Các câu lệnh *break* và *continue* hoạt động như trong C++ và Java, làm thay đổi quy trình của vòng lặp trong cùng. Các vòng lặp for/in ở trên giải quyết trường hợp phổ biến là lặp lại mọi phần tử trong danh sách, nhưng vòng lặp while cho phép bạn toàn quyền kiểm soát các số chỉ mục. Dưới đây là một vòng lặp while truy cập vào mỗi phần tử thứ 3 trong danh sách:
## Access every 3rd element in a list i = 0 while i < len(a): print(a[i]) i = i + 3
Liệt kê phương thức
Dưới đây là một số phương thức danh sách phổ biến khác.
- list.append(elem) – thêm một phần tử vào cuối danh sách. Lỗi thường gặp: không trả về danh sách mới, chỉ sửa đổi danh sách ban đầu.
- list.insert(index, elem) – chèn phần tử tại chỉ mục đã cho, di chuyển các phần tử sang phải.
- list.extend(list2) thêm các phần tử trong list2 vào cuối danh sách. Việc sử dụng + hoặc += trên danh sách tương tự như việc sử dụng extend().
- list.index(elem) – tìm kiếm phần tử đã cho từ đầu danh sách và trả về chỉ mục của phần tử đó. Gửi một ValueError nếu phần tử không xuất hiện (sử dụng "in" để kiểm tra mà không có ValueError).
- list.remove(elem) – tìm kiếm thực thể đầu tiên của phần tử đã cho và xoá thực thể đó (gửi ValueError nếu không có)
- list.sort() – sắp xếp danh sách tại chỗ (không trả về danh sách). (Hàm được sắp xếp() hiển thị sau sẽ được ưu tiên.)
- list.reverse() – đảo ngược danh sách tại chỗ (không trả về danh sách)
- list.pop(index) – xoá và trả về phần tử ở chỉ mục đã cho. Trả về phần tử ở ngoài cùng bên phải nếu bạn bỏ qua chỉ mục (gần như ngược lại với append()).
Hãy lưu ý rằng đây là các *phương thức* trên đối tượng danh sách, trong khi len() là một hàm lấy danh sách (hoặc chuỗi hoặc bất kỳ nội dung nào) làm đối số.
list = ['larry', 'curly', 'moe'] list.append('shemp') ## append elem at end list.insert(0, 'xxx') ## insert elem at index 0 list.extend(['yyy', 'zzz']) ## add list of elems at end print(list) ## ['xxx', 'larry', 'curly', 'moe', 'shemp', 'yyy', 'zzz'] print(list.index('curly')) ## 2 list.remove('curly') ## search and remove that element list.pop(1) ## removes and returns 'larry' print(list) ## ['xxx', 'moe', 'shemp', 'yyy', 'zzz']
Lỗi thường gặp: lưu ý rằng các phương thức ở trên không *trả về* danh sách đã sửa đổi, mà chỉ sửa đổi danh sách ban đầu.
list = [1, 2, 3] print(list.append(4)) ## NO, does not work, append() returns None ## Correct pattern: list.append(4) print(list) ## [1, 2, 3, 4]
Tạo danh sách
Một mẫu phổ biến là bắt đầu danh sách dưới dạng danh sách trống [], sau đó sử dụng append() hoặc extend() để thêm các phần tử vào danh sách đó:
list = [] ## Start as the empty list list.append('a') ## Use append() to add elements list.append('b')
Liệt kê lát cắt
Lát cắt hoạt động trên danh sách giống như với chuỗi và cũng có thể được dùng để thay đổi các phần phụ của danh sách.
list = ['a', 'b', 'c', 'd'] print(list[1:-1]) ## ['b', 'c'] list[0:2] = 'z' ## replace ['a', 'b'] with ['z'] print(list) ## ['z', 'c', 'd']
Bài tập: list1.py
Để thực hành nội dung trong phần này, hãy thử các vấn đề trong list1.py không sử dụng tính năng sắp xếp (trong Bài tập cơ bản).