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.
# 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 đủ
[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
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:
[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:
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/elselồ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:
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ó
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`.
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
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)`.
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
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.
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ử