Danh sách Python lấy phần tử đầu tiên

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

def get_first(l): 
    return l[0] if l else None

Và nếu danh sách được trả về từ hàm

l = get_list()
return l[0] if l else None
4

l = get_list()
return l[0] if l else None

Mới trong Python 3. 8, Biểu thức gán

Biể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ã),

l = get_list()
return l[0] if l else None
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

return l[0] if (l := get_list()) else None

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

if l := get_list():
    return l[0]
return None

Để 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ích

l = get_list() return l[0] if l else None 6

Khi 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

for item in get_list():
    return item

Điều này giả sử hàm kết thúc tại đây, hoàn toàn trả về

l = get_list()
return l[0] if l else None
7 nếu
l = get_list()
return l[0] if l else None
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

l = get_list()
return l[0] if l else None
0

l = 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

l = get_list()
return l[0] if l else None
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
return l[0] if (l := get_list()) else None
1 rõ ràng vào cuối

l = get_list()
return l[0] if l else None
4

lá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

l = get_list()
return l[0] if l else None
6

Lá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,

return l[0] if (l := get_list()) else None
3 trả về phần tử thứ hai nếu phần tử đầu tiên là
return l[0] if (l := get_list()) else None
4 trong ngữ cảnh boolean, vì vậy nếu
l = get_list()
return l[0] if l else None
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
return l[0] if (l := get_list()) else None
6

l = get_list()
return l[0] if l else None
1

Biể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à

return l[0] if (l := get_list()) else None
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)

l = get_list()
return l[0] if l else None
3

return l[0] if (l := get_list()) else None 8

Sau đó, chúng tôi có cách sử dụng thông minh sau đây của _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

l = get_list()
return l[0] if l else None
0

Để giải thích,

if l := get_list():
    return l[0]
return None
0 trả về một iterator với phương thức
if l := get_list():
    return l[0]
return None
2. (
if l := get_list():
    return l[0]
return None
3 bằng Python 3. ) Sau đó, hàm dựng sẵn
return l[0] if (l := get_list()) else None
8 gọi phương thức
if l := get_list():
    return l[0]
return None
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,
l = get_list()
return l[0] if l else None
7

biể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ì

l = get_list()
return l[0] if l else None
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

l = get_list()
return l[0] if l else None
1

Nghịch đảo tốt hơn

l = get_list()
return l[0] if l else None
2

Thậm chí tốt hơn, hãy sử dụng một biến cục bộ để

l = get_list()
return l[0] if l else None
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