Python có một loại danh sách tích hợp sẵn tuyệt vời có tên là "list". Các 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 – 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
Bài tập có dấu = trên danh sách sẽ không tạo bản sao. Thay vào đó, phép gán khiến 2 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 vuông trống [ ]. Dấu "+" hoạt động để nối hai danh sách, vì vậy [1, 2] + [3, 4] tạo ra [1, 2, 3, 4] (điều này giống như + với chuỗi).
ĐỐI VỚI VÀ ĐỊA ĐIỂM
Các cấu trúc *for* và *in* của Python cực kỳ hữu ích và cách sử dụng chúng đầu tiên chúng ta sẽ thấy là với danh sách. Cấu trúc *cho* -- for var in list
– là một cách dễ dàng để xem từng phần tử trong một danh sách (hoặc một tập hợ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 kiểu, nên tên biến là một cách quan trọng để bạn có thể theo dõi tình hình. (Điều này khiến bạn hơi nhầm lẫn. Khi biết nhiều hơn về python, bạn sẽ thấy các tham chiếu đến Gợi ý nhập để giúp bạn thêm nội dung nhập vào định nghĩa hàm. Python không sử dụng các gợi ý về kiểu này khi chạy chương trình của bạn. Các API này được các chương trình khác, chẳng hạn 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ư linters/trình kiểm tra kiểu để xác thực xem các hàm của bạn có được gọi hay không có đối số tương thích).
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ỉ nên ghi nhớ cú pháp của các cấu trúc này. Có thể bạn sẽ có thói quen lặp lại đối với các ngôn ngữ khác, trong đó bạn bắt đầu lặp lại theo cách thủ công qua một tập hợp, trong đó trong Python bạn chỉ nên sử dụng cho/in.
Bạn cũng có thể dùng hàm for/in để thao tác với 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ả ký tự trong một chuỗi.
Phạm vi
Hàm dải ô(n) trả về các số 0, 1, ... n-1 và dải ô(a, b) trả về a, a+1, ... b-1 -- cho đến nhưng không bao gồm số cuối cùng. Sự kết hợp giữa hàm for-loop và Range() cho phép bạn tạo một số truyền thống cho vòng lặp:
## 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í xây dựng 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()).
Trong khi vòng lặp
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. Vòng lặp for/in ở trên giải quyết trường hợp phổ biến là lặp lại qua mọi phần tử trong danh sách, nhưng vòng lặp while cho bạn toàn quyền kiểm soát đối với số chỉ mục. Sau đây là vòng lặp while truy cập vào từng 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 pháp 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 mà chỉ sửa đổi danh sách gốc.
- list.insert(index, elem) -- chèn phần tử tại chỉ mục đã cho, dịch 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 một 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 giá trị 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 phiên bản đầu tiên của phần tử đã cho và xoá phần tử đó (gửi ValueError nếu không có)
- list.sort() -- sắp xếp danh sách tại chỗ (không trả lại 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ả lại danh sách)
- list.pop(index) – xoá và trả về phần tử tại chỉ mục đã cho. Trả về phần tử ở ngoài cùng bên phải nếu chỉ mục bị bỏ qua (gần như trái ngược 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 hay bất kỳ thứ gì) 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 một 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 tương tự như với chuỗi và cũng có thể 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
Để luyện tập tài liệu trong phần này, hãy thử giải các bài toán trong list1.py không dùng tính năng sắp xếp (trong Bài tập cơ bản).