Cách tiếp cận Pythonic nhất là câu trả lời được đánh giá cao nhất đã thể hiện và đó là điều đầu tiên tôi nghĩ đến khi đọc câu hỏi. Đây là cách sử dụng nó, trước tiên nếu danh sách trống có thể được chuyển vào một hàm Show
Và nếu danh sách được trả về từ hàm 4
Mới trong Python 3. 8, Biểu thức gánBiểu thức gán sử dụng toán tử gán tại chỗ (được gọi một cách không chính thức là toán tử hải mã), 5, mới trong Python 3. 8, cho phép chúng tôi thực hiện kiểm tra và chỉ định tại chỗ, cho phép một lớp lót
Là một người dùng Python lâu năm, điều này có vẻ như chúng tôi đang cố gắng làm quá nhiều trên một dòng - tôi cảm thấy sẽ tốt hơn nếu làm theo cách được cho là có hiệu suất ngang nhau
Để hỗ trợ cho công thức này là bài luận của Tim Peter trong PEP đề xuất sự thay đổi này đối với ngôn ngữ. Anh ấy không đề cập đến công thức đầu tiên, nhưng dựa trên những công thức khác mà anh ấy thích, tôi không nghĩ anh ấy sẽ phiền Các cách khác được chứng minh để làm điều này ở đây, với lời giải thíchl = get_list() return l[0] if l else None 6Khi tôi bắt đầu cố gắng nghĩ ra những cách thông minh để làm điều này, đây là điều thứ hai tôi nghĩ đến
Điều này giả sử hàm kết thúc tại đây, hoàn toàn trả về 7 nếu 4 trả về một danh sách trống. Mã rõ ràng dưới đây là chính xác tương đương 0l = get_list() return l[0] if l else None 9Điều sau đây cũng được đề xuất (tôi đã sửa tên biến không chính xác) cũng sử dụng hàm ẩn 7. Điều này sẽ tốt hơn ở trên, vì nó sử dụng kiểm tra logic thay vì lặp lại có thể không xảy ra. Điều này sẽ dễ hiểu hơn ngay lập tức những gì đang xảy ra. Nhưng nếu chúng ta đang viết để dễ đọc và dễ bảo trì, chúng ta cũng nên thêm 1 rõ ràng vào cuối 4lát return l[0] if (l := get_list()) else None 2 và chọn chỉ mục zerothĐây cũng là câu trả lời được bình chọn nhiều nhất 6Lát là không cần thiết và tạo thêm một danh sách một mục trong bộ nhớ. Những điều sau đây sẽ hiệu quả hơn. Để giải thích, 3 trả về phần tử thứ hai nếu phần tử đầu tiên là 4 trong ngữ cảnh boolean, vì vậy nếu 4 trả về một danh sách trống, thì biểu thức chứa trong dấu ngoặc đơn sẽ trả về một danh sách có 'Không', danh sách này sau đó sẽ được truy cập bởi chỉ mục 6 1Biểu thức tiếp theo sử dụng thực tế đó và trả về mục thứ hai nếu mục đầu tiên là 7 trong ngữ cảnh boolean và vì nó tham chiếu my_list hai lần, nên nó không tốt hơn biểu thức bậc ba (và về mặt kỹ thuật không phải là biểu thức một lớp) 3return l[0] if (l := get_list()) else None 8Sau đó, chúng tôi có cách sử dụng thông minh sau đây của _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 0Để giải thích, 0 trả về một iterator với phương thức 2. ( 3 bằng Python 3. ) Sau đó, hàm dựng sẵn 8 gọi phương thức 2 đó và nếu trình vòng lặp đã cạn kiệt, trả về giá trị mặc định mà chúng tôi cung cấp, 7biểu thức bậc ba dư thừa (if l := get_list(): return l[0] return None 7) và quay lạiĐiều dưới đây đã được đề xuất, nhưng điều ngược lại sẽ tốt hơn, vì logic thường được hiểu rõ hơn theo hướng tích cực thay vì tiêu cực. Vì 4 được gọi hai lần, trừ khi kết quả được ghi nhớ theo một cách nào đó, điều này sẽ hoạt động kém 1Nghịch đảo tốt hơn 2Thậm chí tốt hơn, hãy sử dụng một biến cục bộ để 4 chỉ được gọi một lần và bạn đã thảo luận về giải pháp Pythonic được đề xuất trước tiên |