Chuyển đến nội dung chính
Mô-đun 6 · Bài học 1 trong tổng số 421/36 trong khóa học~12 min
Bài học theo mô-đun (1/4)

Danh sách hiểu

hiểu danh sách là một biểu thức xây dựng danh sách bằng cách áp dụng một phép biến đổi (và tùy chọn một bộ lọc) thành một phép lặp. Đó là Cách Pythonic để viết for + append trên một dòng.

Python
# stile imperativo (verboso)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# stile pythonico
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

Cú pháp đầy đủ

Python
[espressione for elemento in iterabile if condizione]
  • biểu thức: những gì cần đưa vào danh sách kết quả
  • cho phần tử trong iterable: vòng lặp nguồn
  • điều kiện if (tùy chọn): chỉ giữ lại các phần tử khớp
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

if/else bên trong biểu thức (ternary)

Để chuyển đổi có điều kiện (chứ không phải bộ lọc), hãy sử dụng ternary biểu thức TRƯỚC for:

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

Đa cho: sản phẩm Descartes

Bạn có thể lồng nhiều mệnh đề for:

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

Thứ tự của mệnh đề for là "ngoài trước trong", như thể chúng là các vòng lặp lồng nhau.

Khi nào KHÔNG sử dụng sự hiểu biết

  • Logic phức tạp có nhiều nhánh if/else lồng nhau → sử dụng vòng lặp rõ ràng.
  • Tác dụng phụ (in, ghi file) → vòng lặp, không hiểu.
  • Nhiều hơn 2 cấp độ lồng nhau → một vòng lặp được đặt tên rõ ràng hầu như luôn tốt hơn.

Hiểu danh sách lồng nhau

Bạn có thể xâu chuỗi nhiều vòng lặp for trong một lần hiểu danh sách. Ví dụ: để làm phẳng một ma trận (danh sách các danh sách) thành một danh sách phẳng duy nhất, bạn có thể viết:

Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]

Thứ tự của các vòng lặp phản ánh chính xác thứ tự lồng của các vòng lặp for truyền thống.

Hãy thử nó

tập thể dục#python.m6.l1.e1
Nỗ lực: 0Đang tải…

Cho `nums = [1, 2, 3, 4, 5, 6]`, hãy dựng `square_squares` với các bình phương chỉ gồm các số chẵn. Đánh giá `bình phương chẵn`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

nếu n % 2 == 0 ở cuối.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#python.m6.l1.e2
Nỗ lực: 0Đang tải…

Cho `words = ['Ciao', 'Mondo', 'Python', 'Java']`, xây dựng `lengths` với độ dài MỌI từ và `short_words` chỉ với những từ ngắn hơn 5 ký tự. Đánh giá `(độ dài, từ_ngắn)`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Hai cách hiểu riêng biệt.

Giải pháp khả dụng sau 3 lần thử

Thử thách bổ sung

tập thể dục#python.m6.l1.e3
Nỗ lực: 0Đang tải…

Use a list comprehension to calculate the squares of only the even integers between 1 and 10 inclusive. Store the list in `even_squares` and evaluate it.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng range(1, 11) để lặp, if x % 2 == 0 để lọc và x**2 làm biểu thức.

Giải pháp khả dụng sau 3 lần thử