Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Python nổi tiếng vì cho phép bạn viết mã thanh lịch, dễ viết và gần như dễ đọc như tiếng Anh thuần túy. Một trong những tính năng đặc biệt nhất của ngôn ngữ này là khả năng hiểu danh sách mà bạn có thể sử dụng để tạo chức năng mạnh mẽ trong một dòng mã. Tuy nhiên, nhiều nhà phát triển gặp khó khăn trong việc tận dụng triệt để các tính năng nâng cao hơn của khả năng hiểu danh sách trong Python. Một số lập trình viên thậm chí sử dụng chúng quá nhiều, điều này có thể dẫn đến mã kém hiệu quả và khó đọc hơn

Khi kết thúc hướng dẫn này, bạn sẽ hiểu toàn bộ sức mạnh của khả năng hiểu danh sách Python và cách sử dụng các tính năng của chúng một cách thoải mái. Bạn cũng sẽ hiểu được những đánh đổi khi sử dụng chúng để bạn có thể xác định khi nào các phương pháp khác phù hợp hơn

Trong hướng dẫn này, bạn sẽ học cách

  • Viết lại vòng lặp và lệnh gọi
    >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    3 dưới dạng hiểu danh sách trong Python
  • Chọn giữa các cuộc gọi hiểu, vòng lặp và
    >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    3
  • Nâng cao khả năng hiểu của bạn với logic có điều kiện
  • Sử dụng hiểu để thay thế
    >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    5
  • Hồ sơ mã của bạn để giải quyết các câu hỏi về hiệu suất

Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn

Cách tạo danh sách trong Python

Có một số cách khác nhau để bạn có thể tạo danh sách trong Python. Để hiểu rõ hơn về sự đánh đổi của việc sử dụng khả năng hiểu danh sách trong Python, trước tiên hãy xem cách tạo danh sách bằng các phương pháp này

Loại bỏ các quảng cáo

Sử dụng vòng lặp >>> squares = [i * i for i in range(10)] >>> squares [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 6

Loại vòng lặp phổ biến nhất là vòng lặp

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6. Bạn có thể sử dụng vòng lặp
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6 để tạo danh sách các phần tử trong ba bước

  1. Khởi tạo một danh sách trống
  2. Lặp lại một lần lặp hoặc phạm vi phần tử
  3. Nối từng phần tử vào cuối danh sách

Nếu bạn muốn tạo một danh sách chứa mười ô vuông hoàn hảo đầu tiên, thì bạn có thể hoàn thành các bước này trong ba dòng mã

>>>

>>> squares = []
>>> for i in range(10):
..     squares.append(i * i)
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Ở đây, bạn khởi tạo một danh sách trống,

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
9. Sau đó, bạn sử dụng vòng lặp
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6 để lặp lại trên
new_list = [expression for member in iterable]
1. Cuối cùng, bạn nhân từng số với chính nó và nối kết quả vào cuối danh sách

Sử dụng đối tượng >>> squares = [i * i for i in range(10)] >>> squares [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 3

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3 cung cấp một cách tiếp cận thay thế dựa trên lập trình chức năng. Bạn truyền vào một hàm và một iterable, và
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3 sẽ tạo một đối tượng. Đối tượng này chứa đầu ra mà bạn sẽ nhận được khi chạy từng phần tử có thể lặp lại thông qua hàm được cung cấp

Ví dụ, hãy xem xét một tình huống trong đó bạn cần tính giá sau thuế cho một danh sách các giao dịch

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3

Ở đây, bạn có một

new_list = [expression for member in iterable]
5 có thể lặp lại và một hàm
new_list = [expression for member in iterable]
6. Bạn chuyển cả hai đối số này cho
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3 và lưu trữ đối tượng kết quả trong
new_list = [expression for member in iterable]
8. Bạn có thể dễ dàng chuyển đổi đối tượng bản đồ này thành danh sách bằng cách sử dụng
new_list = [expression for member in iterable]
9

Sử dụng danh sách hiểu

Hiểu danh sách là cách thứ ba để tạo danh sách. Với cách tiếp cận tao nhã này, bạn có thể viết lại vòng lặp

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6 từ ví dụ đầu tiên chỉ trong một dòng mã

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Thay vì tạo một danh sách trống và thêm từng phần tử vào cuối, bạn chỉ cần xác định đồng thời danh sách và nội dung của nó bằng cách tuân theo định dạng này

>>>

new_list = [expression for member in iterable]

Mọi khả năng hiểu danh sách trong Python bao gồm ba yếu tố

  1. >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    21 là chính thành viên, lệnh gọi phương thức hoặc bất kỳ biểu thức hợp lệ nào khác trả về giá trị. Trong ví dụ trên, biểu thức
    >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    22 là bình phương của giá trị phần tử
  2. >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    23 là đối tượng hoặc giá trị trong danh sách hoặc có thể lặp lại. Trong ví dụ trên, giá trị thành viên là
    >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    24
  3. >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    25 là một danh sách, tập hợp, trình tự, trình tạo hoặc bất kỳ đối tượng nào khác có thể trả về từng phần tử của nó cùng một lúc. Trong ví dụ trên, iterable là
    new_list = [expression for member in iterable]
    
    1

Bởi vì yêu cầu về biểu thức rất linh hoạt nên khả năng hiểu danh sách trong Python hoạt động tốt ở nhiều nơi mà bạn sẽ sử dụng

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3. Bạn có thể viết lại ví dụ về giá với khả năng hiểu danh sách của riêng mình

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2

Điểm khác biệt duy nhất giữa cách triển khai này và

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3 là khả năng hiểu danh sách trong Python trả về một danh sách, không phải đối tượng bản đồ

Loại bỏ các quảng cáo

Lợi ích của việc sử dụng danh sách hiểu

Khả năng hiểu danh sách thường được mô tả là Pythonic hơn các vòng lặp hoặc

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3. Nhưng thay vì mù quáng chấp nhận đánh giá đó, bạn nên hiểu lợi ích của việc sử dụng khả năng hiểu danh sách trong Python khi so sánh với các lựa chọn thay thế. Sau này, bạn sẽ tìm hiểu về một vài tình huống trong đó các giải pháp thay thế là lựa chọn tốt hơn

Một lợi ích chính của việc sử dụng khả năng hiểu danh sách trong Python là nó là một công cụ duy nhất mà bạn có thể sử dụng trong nhiều tình huống khác nhau. Ngoài việc tạo danh sách tiêu chuẩn, khả năng hiểu danh sách cũng có thể được sử dụng để ánh xạ và lọc. Bạn không phải sử dụng một cách tiếp cận khác cho từng tình huống

Đây là lý do chính tại sao khả năng hiểu danh sách được coi là Pythonic, vì Python bao gồm các công cụ đơn giản, mạnh mẽ mà bạn có thể sử dụng trong nhiều tình huống khác nhau. Là một lợi ích bổ sung, bất cứ khi nào bạn sử dụng khả năng hiểu danh sách trong Python, bạn sẽ không cần phải nhớ thứ tự thích hợp của các đối số như khi bạn gọi

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3

Khả năng hiểu danh sách cũng mang tính khai báo hơn so với vòng lặp, điều đó có nghĩa là chúng dễ đọc và dễ hiểu hơn. Vòng lặp yêu cầu bạn tập trung vào cách tạo danh sách. Bạn phải tạo danh sách trống theo cách thủ công, lặp qua các phần tử và thêm từng phần tử vào cuối danh sách. Với khả năng hiểu danh sách trong Python, thay vào đó, bạn có thể tập trung vào những gì bạn muốn đưa vào danh sách và tin tưởng rằng Python sẽ đảm nhận việc xây dựng danh sách diễn ra như thế nào

Làm thế nào để nâng cao khả năng hiểu của bạn

Để hiểu toàn bộ giá trị mà tính năng hiểu danh sách có thể cung cấp, bạn nên hiểu phạm vi chức năng có thể có của chúng. Bạn cũng sẽ muốn hiểu những thay đổi sắp xảy ra với khả năng hiểu danh sách trong Python 3. 8

Sử dụng logic có điều kiện

Trước đó, bạn đã thấy công thức này về cách tạo khả năng hiểu danh sách

>>>

new_list = [expression for member in iterable]

Mặc dù công thức này chính xác nhưng nó cũng hơi thiếu sót. Một mô tả đầy đủ hơn về công thức hiểu thêm hỗ trợ cho các điều kiện tùy chọn. Cách phổ biến nhất để thêm logic điều kiện vào khả năng hiểu danh sách là thêm điều kiện vào cuối biểu thức

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
4

Ở đây, câu điều kiện của bạn xuất hiện ngay trước dấu ngoặc đóng

Các điều kiện rất quan trọng vì chúng cho phép hiểu danh sách để lọc ra các giá trị không mong muốn, thông thường sẽ yêu cầu gọi tới

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
5

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6

Trong khối mã này, câu lệnh điều kiện lọc ra bất kỳ ký tự nào trong

new_list = [expression for member in iterable]
2 không phải là nguyên âm

Điều kiện có thể kiểm tra bất kỳ biểu thức hợp lệ nào. Nếu bạn cần một bộ lọc phức tạp hơn, thì bạn thậm chí có thể chuyển logic điều kiện sang một chức năng riêng biệt

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
8

Tại đây, bạn tạo một bộ lọc phức tạp

new_list = [expression for member in iterable]
3 và chuyển hàm này làm câu lệnh điều kiện để bạn hiểu danh sách. Lưu ý rằng giá trị thành viên
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
24 cũng được truyền dưới dạng đối số cho hàm của bạn

Bạn có thể đặt điều kiện ở cuối câu lệnh để lọc đơn giản, nhưng nếu bạn muốn thay đổi giá trị thành phần thay vì lọc ra thì sao?

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1

Với công thức này, bạn có thể sử dụng logic có điều kiện để chọn từ nhiều tùy chọn đầu ra có thể. Ví dụ: nếu bạn có một danh sách giá, thì bạn có thể muốn thay thế giá âm bằng

new_list = [expression for member in iterable]
5 và giữ nguyên các giá trị dương

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
30

Ở đây, biểu thức của bạn

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
24 chứa một câu điều kiện,
new_list = [expression for member in iterable]
7. Điều này yêu cầu Python xuất giá trị của
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
24 nếu số dương, nhưng thay đổi
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
24 thành
new_list = [expression for member in iterable]
5 nếu số âm. Nếu điều này có vẻ quá sức, thì có thể hữu ích nếu xem logic điều kiện là chức năng của chính nó

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
31

Bây giờ, câu lệnh điều kiện của bạn được chứa trong

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
41 và bạn có thể sử dụng nó như một phần của biểu thức hiểu danh sách của mình

Loại bỏ các quảng cáo

Sử dụng cách hiểu tập hợp và từ điển

Mặc dù khả năng hiểu danh sách trong Python là một công cụ phổ biến, nhưng bạn cũng có thể tạo khả năng hiểu bộ và từ điển. Khả năng hiểu tập hợp gần giống hệt như khả năng hiểu danh sách trong Python. Sự khác biệt là thiết lập mức độ hiểu đảm bảo đầu ra không chứa bản sao. Bạn có thể tạo khả năng hiểu tập hợp bằng cách sử dụng dấu ngoặc nhọn thay vì dấu ngoặc

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
32

Khả năng hiểu tập hợp của bạn đưa ra tất cả các nguyên âm duy nhất mà nó tìm thấy trong

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
42. Không giống như danh sách, bộ không đảm bảo rằng các mục sẽ được lưu theo bất kỳ thứ tự cụ thể nào. Đây là lý do tại sao thành viên đầu tiên của tập hợp là
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
43, mặc dù nguyên âm đầu tiên trong
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
42 là
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
24

Việc hiểu từ điển cũng tương tự, với yêu cầu bổ sung là xác định khóa

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
33

Để tạo từ điển

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
9, bạn sử dụng dấu ngoặc nhọn (
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
47) cũng như cặp khóa-giá trị (
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
48) trong biểu thức của mình

Sử dụng toán tử Walrus

Trăn 3. 8 sẽ giới thiệu biểu thức gán hay còn gọi là toán tử hải mã. Để hiểu cách bạn có thể sử dụng nó, hãy xem xét ví dụ sau

Giả sử bạn cần thực hiện 10 yêu cầu đối với API sẽ trả về dữ liệu nhiệt độ. Bạn chỉ muốn trả lại kết quả lớn hơn 100 độ F. Giả sử rằng mỗi yêu cầu sẽ trả về dữ liệu khác nhau. Trong trường hợp này, không có cách nào sử dụng khả năng hiểu danh sách trong Python để giải quyết vấn đề. Công thức

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
49 không cung cấp cách nào để điều kiện gán dữ liệu cho một biến mà biểu thức có thể truy cập

Toán tử hải mã giải quyết vấn đề này. Nó cho phép bạn chạy một biểu thức đồng thời gán giá trị đầu ra cho một biến. Ví dụ sau đây cho thấy điều này có thể thực hiện được như thế nào, sử dụng

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
60 để tạo dữ liệu thời tiết giả

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
34

Bạn sẽ không thường xuyên cần sử dụng biểu thức gán bên trong phần hiểu danh sách trong Python, nhưng đó là một công cụ hữu ích để bạn sử dụng khi cần thiết

Khi nào không sử dụng hiểu danh sách trong Python

Khả năng hiểu danh sách rất hữu ích và có thể giúp bạn viết mã thanh lịch, dễ đọc và gỡ lỗi, nhưng chúng không phải là lựa chọn phù hợp cho mọi trường hợp. Chúng có thể làm cho mã của bạn chạy chậm hơn hoặc sử dụng nhiều bộ nhớ hơn. Nếu mã của bạn kém hiệu quả hơn hoặc khó hiểu hơn, thì có lẽ tốt hơn là chọn một giải pháp thay thế

Coi chừng hiểu lồng nhau

Khả năng hiểu có thể được lồng vào nhau để tạo các tổ hợp danh sách, từ điển và bộ trong một bộ sưu tập. Ví dụ: giả sử một phòng thí nghiệm khí hậu đang theo dõi nhiệt độ cao ở năm thành phố khác nhau trong tuần đầu tiên của tháng Sáu. Cấu trúc dữ liệu hoàn hảo để lưu trữ dữ liệu này có thể là cách hiểu danh sách Python được lồng trong cách hiểu từ điển

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
35

Bạn tạo bộ sưu tập bên ngoài

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
61 với khả năng hiểu từ điển. Biểu thức là một cặp khóa-giá trị, chứa đựng một cách hiểu khác. Mã này sẽ nhanh chóng tạo danh sách dữ liệu cho từng thành phố trong
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
62

Danh sách lồng nhau là một cách phổ biến để tạo ma trận, thường được sử dụng cho mục đích toán học. Hãy nhìn vào khối mã dưới đây

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
36

Khả năng hiểu danh sách bên ngoài

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
63 tạo ra sáu hàng, trong khi khả năng hiểu danh sách bên trong
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
64 lấp đầy mỗi hàng này bằng các giá trị

Cho đến nay, mục đích của mỗi cách hiểu lồng nhau là khá trực quan. Tuy nhiên, có những tình huống khác, chẳng hạn như làm phẳng các danh sách lồng nhau, trong đó logic được cho là khiến mã của bạn trở nên khó hiểu hơn. Lấy ví dụ này, sử dụng cách hiểu danh sách lồng nhau để làm phẳng ma trận

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
37

Mã để làm phẳng ma trận ngắn gọn nhưng có thể không trực quan để hiểu cách thức hoạt động của nó. Mặt khác, nếu bạn sử dụng vòng lặp

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6 để làm phẳng cùng một ma trận, thì mã của bạn sẽ đơn giản hơn nhiều

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
38

Bây giờ bạn có thể thấy rằng mã đi qua một hàng của ma trận tại một thời điểm, lấy ra tất cả các phần tử trong hàng đó trước khi chuyển sang hàng tiếp theo

Mặc dù cách hiểu danh sách lồng nhau một dòng có vẻ giống Pythonic hơn, nhưng điều quan trọng nhất là viết mã mà nhóm của bạn có thể dễ dàng hiểu và sửa đổi. Khi bạn chọn cách tiếp cận của mình, bạn sẽ phải đưa ra quyết định dựa trên việc bạn nghĩ rằng khả năng hiểu giúp ích hay làm tổn hại khả năng đọc

Loại bỏ các quảng cáo

Chọn Trình tạo cho Bộ dữ liệu lớn

Khả năng hiểu danh sách trong Python hoạt động bằng cách tải toàn bộ danh sách đầu ra vào bộ nhớ. Đối với các danh sách nhỏ hoặc thậm chí có kích thước trung bình, điều này thường ổn. Nếu bạn muốn tính tổng bình phương của một nghìn số nguyên đầu tiên, thì việc hiểu danh sách sẽ giải quyết vấn đề này một cách đáng ngưỡng mộ

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
39

Nhưng nếu bạn muốn tính tổng bình phương của một tỷ số nguyên đầu tiên thì sao? . Đó là bởi vì Python đang cố gắng tạo một danh sách với một tỷ số nguyên, tiêu tốn nhiều bộ nhớ hơn so với máy tính của bạn muốn. Máy tính của bạn có thể không có tài nguyên cần thiết để tạo một danh sách khổng lồ và lưu trữ nó trong bộ nhớ. Nếu bạn vẫn cố làm thì máy của bạn có thể chạy chậm hoặc thậm chí bị hỏng

Khi kích thước của danh sách trở nên có vấn đề, việc sử dụng trình tạo thay vì hiểu danh sách trong Python thường hữu ích. Trình tạo không tạo một cấu trúc dữ liệu lớn, duy nhất trong bộ nhớ mà thay vào đó trả về một cấu trúc có thể lặp lại. Mã của bạn có thể yêu cầu giá trị tiếp theo từ khả năng lặp lại nhiều lần nếu cần hoặc cho đến khi bạn đi đến cuối chuỗi của mình, trong khi chỉ lưu trữ một giá trị tại một thời điểm

Nếu bạn tính tổng một tỷ ô vuông đầu tiên bằng một trình tạo, thì chương trình của bạn có thể sẽ chạy trong một thời gian, nhưng nó sẽ không khiến máy tính của bạn bị treo. Ví dụ dưới đây sử dụng một trình tạo

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
0

Bạn có thể biết đây là trình tạo vì biểu thức không được bao quanh bởi dấu ngoặc hoặc dấu ngoặc nhọn. Tùy chọn, các trình tạo có thể được bao quanh bởi dấu ngoặc đơn

Ví dụ trên vẫn đòi hỏi nhiều công việc, nhưng nó thực hiện các thao tác một cách lười biếng. Do lười đánh giá, các giá trị chỉ được tính khi chúng được yêu cầu rõ ràng. Sau khi trình tạo tạo ra một giá trị (ví dụ:

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
66), nó có thể thêm giá trị đó vào tổng đang chạy, sau đó loại bỏ giá trị đó và tạo giá trị tiếp theo (
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
67). Khi hàm tổng yêu cầu giá trị tiếp theo, chu trình sẽ bắt đầu lại. Quá trình này giữ cho dung lượng bộ nhớ nhỏ

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3 cũng hoạt động một cách lười biếng, có nghĩa là bộ nhớ sẽ không thành vấn đề nếu bạn chọn sử dụng nó trong trường hợp này

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
1

Tùy thuộc vào việc bạn thích biểu thức trình tạo hay

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3

Hồ sơ để tối ưu hóa hiệu suất

Vì vậy, cách tiếp cận nào nhanh hơn? . Nếu không, thì tốt nhất là chọn bất kỳ cách tiếp cận nào dẫn đến mã sạch nhất

Nếu bạn đang ở trong một tình huống mà hiệu suất là quan trọng, thì tốt nhất bạn nên lập hồ sơ các cách tiếp cận khác nhau và lắng nghe dữ liệu.

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
80 là một thư viện hữu ích để xác định thời gian cần thiết để chạy các đoạn mã. Bạn có thể sử dụng
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
80 để so sánh thời gian chạy của các vòng lặp
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3,
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6 và khả năng hiểu danh sách

>>>

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2

Tại đây, bạn xác định ba phương thức, mỗi phương thức sử dụng một cách tiếp cận khác nhau để tạo danh sách. Sau đó, bạn yêu cầu

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
80 chạy từng chức năng đó 100 lần mỗi chức năng.
>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
80 trả về tổng thời gian cần thiết để chạy 100 lần thực thi đó

Như mã chứng minh, sự khác biệt lớn nhất là giữa cách tiếp cận dựa trên vòng lặp và

>>> squares = [i * i for i in range(10)]
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3, với vòng lặp mất nhiều thời gian hơn 50% để thực thi. Điều này có quan trọng hay không phụ thuộc vào nhu cầu của ứng dụng của bạn

Sự kết luận

Trong hướng dẫn này, bạn đã học cách sử dụng khả năng hiểu danh sách trong Python để hoàn thành các tác vụ phức tạp mà không làm cho mã của bạn trở nên quá phức tạp

Bây giờ bạn có thể

  • Đơn giản hóa các vòng lặp và cuộc gọi
    >>> squares = [i * i for i in range(10)]
    >>> squares
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    3 với khả năng hiểu danh sách khai báo
  • Nâng cao khả năng hiểu của bạn với logic có điều kiện
  • Tạo tập hợp và hiểu từ điển
  • Xác định khi nào độ rõ ràng hoặc hiệu suất của mã yêu cầu một phương pháp thay thế

Bất cứ khi nào bạn phải chọn một phương pháp tạo danh sách, hãy thử nhiều cách triển khai và cân nhắc cách triển khai nào dễ đọc và dễ hiểu nhất trong trường hợp cụ thể của bạn. Nếu hiệu suất là quan trọng, thì bạn có thể sử dụng các công cụ lập hồ sơ để cung cấp cho bạn dữ liệu có thể hành động thay vì dựa vào linh cảm hoặc phỏng đoán về những gì hoạt động tốt nhất

Hãy nhớ rằng mặc dù khả năng hiểu danh sách Python được chú ý rất nhiều, nhưng trực giác và khả năng sử dụng dữ liệu của bạn khi cần thiết sẽ giúp bạn viết mã rõ ràng phục vụ cho nhiệm vụ sắp tới. Cuối cùng, đây là chìa khóa để tạo mã Pythonic của bạn

Đánh dấu là đã hoàn thành

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Hiểu cách hiểu danh sách Python

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Gửi cho tôi thủ thuật Python »

Giới thiệu về James Timmins

Làm cách nào để bạn chọn người dùng từ danh sách trong python?
Làm cách nào để bạn chọn người dùng từ danh sách trong python?

James là nhà tư vấn phần mềm và nhà phát triển Python. Khi anh ấy không viết Python, anh ấy thường viết về nó dưới dạng blog hoặc sách

» Thông tin thêm về James


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Aldren

Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Geir Arne

Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Jaya

Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Joanna

Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Mike

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Làm cách nào để bạn chọn người dùng từ danh sách trong python?

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi