Thành ngữ Python để trả về mục đầu tiên hoặc Không có


271

Tôi chắc chắn có một cách đơn giản hơn để làm điều này mà không xảy ra với tôi.

Tôi đang gọi một loạt các phương thức trả về một danh sách. Danh sách có thể trống. Nếu danh sách không trống, tôi muốn trả về mục đầu tiên; nếu không, tôi muốn trả về Không. Mã này hoạt động:

my_list = get_list()
if len(my_list) > 0: return my_list[0]
return None

Dường như với tôi rằng nên có một thành ngữ một dòng đơn giản để làm điều này, nhưng đối với cuộc sống của tôi, tôi không thể nghĩ về nó. Lanhung?

Biên tập:

Lý do tôi đang tìm kiếm một biểu thức một dòng ở đây không phải là tôi thích mã cực kỳ ngắn gọn, mà bởi vì tôi phải viết rất nhiều mã như thế này:

x = get_first_list()
if x:
    # do something with x[0]
    # inevitably forget the [0] part, and have a bug to fix
y = get_second_list()
if y:
    # do something with y[0]
    # inevitably forget the [0] part AGAIN, and have another bug to fix

Những gì tôi muốn làm chắc chắn có thể được thực hiện bằng một chức năng (và có thể sẽ được):

def first_item(list_or_none):
    if list_or_none: return list_or_none[0]

x = first_item(get_first_list())
if x:
    # do something with x
y = first_item(get_second_list())
if y:
    # do something with y

Tôi đã đăng câu hỏi vì tôi thường ngạc nhiên bởi những biểu thức đơn giản trong Python có thể làm gì và tôi nghĩ rằng viết một hàm là một việc ngớ ngẩn để làm nếu có một biểu thức đơn giản có thể thực hiện thủ thuật. Nhưng nhìn thấy những câu trả lời này, có vẻ như một chức năng giải pháp đơn giản.


28
btw, trên Python 2.6+ bạn có thể sử dụng next(iter(your_list), None)thay vì first_item(your_list)giả sử your_listlà không None( get_first_list()get_second_list()phải luôn trả về một lần lặp).
jfs

1
Tôi nghĩ ý bạn là next(iter(your_list)), vì nếu bạn cung cấp một đối số thứ hai cho iter, bạn đang nói với nó rằng đối số thứ nhất có thể gọi được.
Robert Rossney

7
Không, Noneđây là tham số thứ hai cho next(), không iter(). next()trả về tham số thứ hai của nó nếu được đưa ra thay vì tăng StopIterationnếu your_listtrống.
jfs

Giải pháp được đề xuất bởi @JFSebastian tồn tại với câu hỏi trùng lặp: stackoverflow.com/a/18533669/144408
shahjapan

Câu trả lời:


204

Python 2.6+

next(iter(your_list), None)

Nếu your_listcó thể là None:

next(iter(your_list or []), None)

Python 2.4

def get_first(iterable, default=None):
    if iterable:
        for item in iterable:
            return item
    return default

Thí dụ:

x = get_first(get_first_list())
if x:
    ...
y = get_first(get_second_list())
if y:
    ...

Một tùy chọn khác là nội tuyến các chức năng trên:

for x in get_first_list() or []:
    # process x
    break # process at most one item
for y in get_second_list() or []:
    # process y
    break

Để tránh breakbạn có thể viết:

for x in yield_first(get_first_list()):
    x # process x
for y in yield_first(get_second_list()):
    y # process y

Ở đâu:

def yield_first(iterable):
    for item in iterable or []:
        yield item
        return

1
Tùy chọn cuối cùng đó gần như chính xác những gì tôi đang tìm kiếm: rõ ràng, nó hoạt động và nó không yêu cầu tôi xác định một chức năng mới. Tôi sẽ nói "chính xác" nếu việc phá vỡ bằng cách nào đó không cần thiết, bởi vì nguy cơ bỏ qua nó không đáng kể. Nhưng cách tiếp cận này có vòng sự thật.
Robert Rossney

Ồ, tôi không thích điều này cả. Nếu bất kỳ mục nào trong danh sách đánh giá Sai, giá trị đó sẽ bị loại bỏ và thay thế. Nếu bạn có một chuỗi trống ""trong danh sách, nó sẽ bị loại bỏ và được thay thế bằng một danh sách trống []. Nếu bạn có 0, cũng được thay thế bằng []. Nếu bạn có Falsetrong đó, cũng thay thế. V.v. Bạn có thể thoát khỏi điều này trong một trường hợp cụ thể, nhưng đây là một thói quen xấu để phát triển.
steveha

4
@steveha: bool(lst) cho chúng tôi biết liệu len(lst) > 0nó không cho chúng tôi biết bất cứ điều gì về các mục lstchứa, ví dụ: bool([False]) == True;biểu thức [False] or []trả về [False], điều tương tự là [0] or [] nó trả về [0].
jfs

@RobertRossney: Tôi đã thêm yield_first()để tránh breaktuyên bố.
jfs

1
@ThomasAhle: cả hai đều đúng. Tôi đã cập nhật câu trả lời để cung cấp giải pháp cho trường hợp không phải là Không có.
jfs

217

Cách tốt nhất là đây:

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

Bạn cũng có thể làm điều đó trong một dòng, nhưng lập trình viên khó đọc hơn nhiều:

return (get_list()[:1] or [None])[0]

Giáo sư. Nên đã đề cập đây là một ứng dụng Python 2.4.
Robert Rossney

15
@Adam: tương lai có thể sử dụngnext(iter(your_list), None)
jfs

@JFSebastian thực sự next(iter(your_list))là đủ
Brad Johnson

13
@BradleagheJohnson: sai rồi. Nó tăng StopIteration thay vì quay lại Nonenhư OP yêu cầu. Hãy thử : next(iter([])).
jfs

72
(get_list() or [None])[0]

Cần làm việc.

BTW Tôi không sử dụng biến list, vì nó ghi đè list()hàm dựng sẵn .

Chỉnh sửa: Tôi đã có một phiên bản đơn giản hơn một chút, nhưng sai ở đây trước đó.


4
Điều này rất thông minh và hiệu quả, nhưng tôi nghĩ "return foo [0] nếu foo khác Không" như đề xuất của efotinis thì dễ theo dõi hơn một chút để bảo trì.
Jay

3
Câu hỏi là yêu cầu giải pháp một dòng, vì vậy tôi loại trừ.
đệ quy

Cả hai biểu thức này đều hoạt động nếu get_list () trả về Không; bạn nhận được đối tượng "TypeError: 'noneType' là không thể mô tả được." hoặc "TypeError: loại toán hạng không được hỗ trợ cho +: 'noneType' và 'list'."
Robert Rossney

4
Trong câu hỏi, nó nói rằng các phương thức trả về danh sách, trong đó Không có cái nào không phải là một. Vì vậy, đưa ra các yêu cầu, tôi vẫn tin rằng cả hai đều làm việc.
đệ quy

Nên hoạt động ngay bây giờ nếu get_list () trả về Không vì nó không được đăng ký hoặc thêm nữa.
Robert

32

Cách thành ngữ python nhất là sử dụng next () trên iterator vì danh sách có thể lặp lại . giống như những gì @JFSebastian đưa ra trong nhận xét vào ngày 13 tháng 12 năm 2011.

next(iter(the_list), None)Điều này trả về Không nếu the_listtrống. xem tiếp () Python 2.6+

hoặc nếu bạn biết chắc chắn the_listkhông trống:

iter(the_list).next()xem iterator.next () Python 2.2+


1
Điều này có lợi thế là bạn không phải gán danh sách của mình cho một biến như return l[0] if l else Nonenếu danh sách đó là libcomp. Khi danh sách thực sự là một genexpr, điều này thậm chí còn tốt hơn vì bạn không phải xây dựng toàn bộ danh sách như trongnext(iter(x for x in range(10) if x % 2 == 0), None)
RubenLaguna

Nếu bạn biết chắc chắn the_listkhông trống, bạn sẽ viết the_list[0].
kaya3

12

Nếu bạn thấy mình đang cố gắng thực hiện điều đầu tiên (hoặc Không có) từ việc hiểu danh sách, bạn có thể chuyển sang một trình tạo để làm điều đó như sau:

next((x for x in blah if cond), None)

Pro: hoạt động nếu blah không thể lập chỉ mục Con: đó là cú pháp lạ. Nó rất hữu ích trong khi hack xung quanh và lọc các thứ trong ipython.


11

Giải pháp của OP đã gần kề, chỉ có một vài điều để làm cho nó trở nên nhiều Pythonic hơn.

Đối với một, không cần phải có chiều dài của danh sách. Danh sách trống trong Python đánh giá thành Sai trong kiểm tra nếu. Chỉ cần nói đơn giản

if list:

Ngoài ra, đó là một ý tưởng rất tồi để gán cho các biến trùng lặp với các từ dành riêng. "danh sách" là một từ dành riêng trong Python.

Vì vậy, hãy thay đổi điều đó thành

some_list = get_list()
if some_list:

Một điểm thực sự quan trọng mà rất nhiều giải pháp ở đây bỏ lỡ là tất cả các hàm / phương thức Python đều trả về Không theo mặc định . Hãy thử như sau.

def does_nothing():
    pass

foo = does_nothing()
print foo

Trừ khi bạn cần trả về Không để kết thúc chức năng sớm, không cần thiết phải trả lại Không rõ ràng. Khá ngắn gọn, chỉ cần trả lại mục đầu tiên, nếu nó tồn tại.

some_list = get_list()
if some_list:
    return list[0]

Và cuối cùng, có lẽ điều này đã được ngụ ý, nhưng chỉ để rõ ràng (vì rõ ràng là tốt hơn ngầm định ), bạn không nên có chức năng của mình lấy danh sách từ một chức năng khác; chỉ cần vượt qua nó như là một tham số. Vì vậy, kết quả cuối cùng sẽ là

def get_first_item(some_list): 
    if some_list:
        return list[0]

my_list = get_list()
first_item = get_first_item(my_list)

Như tôi đã nói, OP đã ở gần đó và chỉ một vài cú chạm cho nó hương vị Python mà bạn đang tìm kiếm.


1
Tại sao 'danh sách' là một từ dành riêng trong python? Hoặc, quan trọng hơn, nơi mà nó nói rằng 'danh sách' là một từ máy chủ lưu trữ trong python? Hoặc, quan trọng hơn, làm thế nào bạn xác minh rằng 'danh sách' là một từ dành riêng trong python? Xem xét rằng tôi có thể khai báo một biến có tên 'danh sách', nó rõ ràng không phải là một từ dành riêng.
Lasse V. Karlsen

2
Điểm lấy. Các từ thực sự dành riêng trong Python có thể được tìm thấy ở đây tinyurl.com/424663 Tuy nhiên, nên xem xét các hàm và kiểu dựng sẵn là dành riêng. list () thực sự tạo ra một danh sách. Tương tự với dict, phạm vi, v.v.
gotgenes

Tôi sẽ kết hợp hai dòng cuối cùng, loại bỏ biến tạm thời (trừ khi bạn cần thêm my_list). Điều đó cải thiện khả năng đọc.
Svante

Đây là khá nhiều câu trả lời tôi đã hướng tới.
Robert Rossney

1
get_first_itemnên chấp nhận một defaulttham số (như dict.get) mặc định là Không. Do đó, giao diện chức năng giao tiếp rõ ràng những gì xảy ra nếu my_listtrống.
jfs

3
for item in get_list():
    return item

Điều này ngắn gọn và đẹp.
gotgenes

Đáng thương thay, nó không hoạt động; nó ném ra một đối tượng "TypeError: 'noneType' không thể lặp lại" nếu get_list () trả về Không có.
Robert Rossney

Để sửa: "cho mục trong get_list () hoặc []:"
Itsadok

5
Câu hỏi rõ ràng giả sử get_list trả về một danh sách. len và getitem được gọi vào kết quả của nó.
A. Coady

2

Thẳng thắn mà nói, tôi không nghĩ có một thành ngữ tốt hơn: bạn rõ ràng và ngắn gọn - không cần bất cứ điều gì "tốt hơn". Có thể, nhưng đây thực sự là một vấn đề của hương vị, bạn có thể thay đổi if len(list) > 0:với if list:- một danh sách trống sẽ luôn luôn đánh giá thành Sai.

Trên một lưu ý liên quan, Python không phải là Perl (không có ý định chơi chữ!), Bạn không cần phải lấy mã tuyệt vời nhất có thể.
Trên thực tế, mã tồi tệ nhất tôi đã thấy trong Python, cũng rất tuyệt :-) và hoàn toàn không thể nhầm lẫn.

Nhân tiện, hầu hết các giải pháp tôi đã thấy ở đây không xem xét khi danh sách [0] ước tính thành Sai (ví dụ: chuỗi rỗng hoặc 0) - trong trường hợp này, tất cả đều trả về Không và không phải là phần tử chính xác.


Trong Python, nó được coi là phong cách tốt để viết if lst:hơn là if len(lst) > 0:. Ngoài ra, không sử dụng từ khóa Python làm tên biến; nó kết thúc trong nước mắt. Nó được sử dụng phổ biến Lhoặc lstlà tên biến cho một số danh sách. Tôi chắc chắn trong trường hợp này bạn không có ý đề nghị thực sự sử dụng listlàm tên biến, bạn chỉ có nghĩa là "một số danh sách". Và, +1 cho "khi lst [0] ước tính thành Sai".
steveha

Vâng, tôi chỉ đang duy trì cùng một loại tên của OP, để rõ ràng hơn. Nhưng bạn chắc chắn đúng: cần luôn chú ý không ghi đè các từ khóa Python.
cướp

2

Thành ngữ Python để trả về mục đầu tiên hoặc Không có?

Cách tiếp cận Pythonic nhất là những gì 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 tôi đọc câu hỏi. Đây là cách sử dụng nó, đầu tiên nếu danh sách trống có thể được truyề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ừ một get_listhàm:

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

Những cách khác được chứng minh để làm điều này ở đây, với lời giải thích

for

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 ở đây, hoàn toàn trả về Nonenếu get_listtrả về một danh sách trống. Mã rõ ràng dưới đây là chính xác tương đương:

for item in get_list():
    return item
return None

if some_list

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 ẩn None. Điều này sẽ thích hợp 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 những gì đang xảy ra. Nhưng nếu chúng ta viết cho khả năng đọc và bảo trì, chúng ta cũng nên thêm phần rõ ràng return Nonevào cuối:

some_list = get_list()
if some_list:
    return some_list[0]

cắt or [None]và chọn chỉ số zeroth

Câu hỏi này cũng nằm trong câu trả lời được bình chọn nhiều nhất:

return (get_list()[:1] or [None])[0]

Các lát cắ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ớ. Sau đây nên được thực hiện nhiều hơn. Để giải thích, ortrả về phần tử thứ hai nếu phần tử thứ nhất nằm Falsetrong ngữ cảnh boolean, vì vậy nếu get_listtrả về một danh sách trống, biểu thức có trong ngoặc đơn sẽ trả về một danh sách với 'Không', sau đó sẽ được 0chỉ mục truy cập :

return (get_list() or [None])[0]

Cái tiếp theo sử dụng thực tế và trả về mục thứ hai nếu mục thứ nhất nằm Truetrong ngữ cảnh boolean và vì nó tham chiếu my_list hai lần, nên không tốt hơn biểu thức ternary (và về mặt kỹ thuật không phải là một lớp lót):

my_list = get_list() 
return (my_list and my_list[0]) or None

next

Sau đó, chúng ta có cách sử dụng thông minh của nội dung nextiter

return next(iter(get_list()), None)

Để giải thích, itertrả về một iterator bằng một .nextphương thức. ( .__next__trong Python 3.) Sau đó, hàm dựng sẵn nextgọi .nextphương thức đó và nếu iterator hết, trả về mặc định mà chúng ta đưa ra , None.

biểu thức ternary dự phòng ( a if b else c) và quay trở lại

Những đ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 ở dạng tích cực thay vì phủ định. Vì get_listđượ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:

return None if not get_list() else get_list()[0]

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

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

Thậm chí tốt hơn, sử dụng một biến cục bộ để get_listchỉ được gọi một lần và bạn đã có giải pháp Pythonic được đề xuất trước tiên:

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

2

Về thành ngữ, có một công thức itertools được gọi là nth.

Từ công thức nấu ăn itertools:

def nth(iterable, n, default=None):
    "Returns the nth item or a default value"
    return next(islice(iterable, n, None), default)

Nếu bạn muốn một lớp lót, hãy xem xét việc cài đặt một thư viện thực hiện công thức này cho bạn, ví dụ more_itertools:

import more_itertools as mit

mit.nth([3, 2, 1], 0)
# 3

mit.nth([], 0)                                             # default is `None`
# None

Một công cụ khác có sẵn mà chỉ trả về mục đầu tiên, được gọi more_itertools.first.

mit.first([3, 2, 1])
# 3

mit.first([], default=None)
# None

Các itertools này chia tỷ lệ chung cho bất kỳ lần lặp nào, không chỉ cho các danh sách.



1

Vì tò mò, tôi chạy theo thời gian trên hai trong số các giải pháp. Giải pháp sử dụng câu lệnh return để kết thúc sớm vòng lặp for tốn kém hơn một chút trên máy của tôi với Python 2.5.1, tôi nghi ngờ điều này phải làm với việc thiết lập vòng lặp.

import random
import timeit

def index_first_item(some_list):
    if some_list:
        return some_list[0]


def return_first_item(some_list):
    for item in some_list:
        return item


empty_lists = []
for i in range(10000):
    empty_lists.append([])

assert empty_lists[0] is not empty_lists[1]

full_lists = []
for i in range(10000):
    full_lists.append(list([random.random() for i in range(10)]))

mixed_lists = empty_lists[:50000] + full_lists[:50000]
random.shuffle(mixed_lists)

if __name__ == '__main__':
    ENV = 'import firstitem'
    test_data = ('empty_lists', 'full_lists', 'mixed_lists')
    funcs = ('index_first_item', 'return_first_item')
    for data in test_data:
        print "%s:" % data
        for func in funcs:
            t = timeit.Timer('firstitem.%s(firstitem.%s)' % (
                func, data), ENV)
            times = t.repeat()
            avg_time = sum(times) / len(times)
            print "  %s:" % func
            for time in times:
                print "    %f seconds" % time
            print "    %f seconds avg." % avg_time

Đây là những khoảng thời gian tôi nhận được:

danh sách trống:
  index_first_item:
    0,748353 giây
    0,741086 giây
    0,741191 giây
    0,743543 giây avg.
  return_first_item:
    0,785511 giây
    0.822178 giây
    0,782846 giây
    0,796845 giây avg.
danh sách đầy đủ:
  index_first_item:
    0,762618 giây
    0,788040 giây
    0,786849 giây
    0,779169 giây avg.
  return_first_item:
    0,802735 giây
    0,878706 giây
    0,808781 giây
    0.830074 giây avg.
hỗn hợp:
  index_first_item:
    0,791129 giây
    0,743526 giây
    0,744441 giây
    0,759699 giây avg.
  return_first_item:
    0,784801 giây
    0,785146 giây
    0,840193 giây
    0,803380 giây avg.

0
try:
    return a[0]
except IndexError:
    return None

1
Các ngoại lệ thường không được sử dụng để kiểm soát dòng chảy.
Matt Green

Tôi không nghĩ làm cho mã này dài hơn và thêm xử lý ngoại lệ vào nó chính xác là thành ngữ tôi đang tìm kiếm.
Robert Rossney

3
Nhưng đây là một thành ngữ Python phổ biến! Vì lý do hiệu suất, bạn có thể không sử dụng nó; bạn sẽ có được hiệu suất tốt hơn if len(a) > 0:nhưng đây được coi là phong cách tốt. Lưu ý rằng điều này thể hiện tốt vấn đề như thế nào: "cố gắng trích xuất phần đầu của danh sách và nếu điều đó không hiệu quả, hãy quay lại None". Google tìm kiếm "EAFP" hoặc xem tại đây: python.net/~goodger/projects/pycon/2007/idiomatic/ợi
steveha

@steveha Nó phụ thuộc vào dữ liệu của bạn. Nếu len (a) thường> 0 và len (a) <1 là trạng thái hiếm, việc bắt ngoại lệ sẽ thực sự hiệu quả hơn.
hạn

@limscoder, tôi đồng ý với bạn. Tôi chỉ không đi vào chi tiết khi nào bạn có thể không sử dụng nó vì lý do hiệu suất; Tôi không nói rằng bạn sẽ không bao giờ sử dụng điều này.
steveha

0
def head(iterable):
    try:
        return iter(iterable).next()
    except StopIteration:
        return None

print head(xrange(42, 1000)  # 42
print head([])               # None

BTW: Tôi sẽ làm lại chương trình chung của bạn thành một thứ như thế này:

lists = [
    ["first", "list"],
    ["second", "list"],
    ["third", "list"]
]

def do_something(element):
    if not element:
        return
    else:
        # do something
        pass

for li in lists:
    do_something(head(li))

(Tránh lặp lại bất cứ khi nào có thể)


0

Còn cái này thì sao:

(my_list and my_list[0]) or None

Lưu ý: Điều này sẽ hoạt động tốt cho danh sách các đối tượng nhưng nó có thể trả về câu trả lời không chính xác trong trường hợp danh sách số hoặc chuỗi theo các bình luận bên dưới.


Còn gì nữa ([0,1] and 0) or None!
Kenly

Đó là một điểm tốt ... Không an toàn khi sử dụng với các bộ sưu tập số ở dạng hiện tại :(
VitalyB 8/11/2016

Điều tương tự với (['','A'] and '') or None.
Kenly

Nếu my_list[0]được đánh giá là False, kết quả sẽ được None.
Kenly

2
my_list[0] if len(my_list) else None
Nicholas Hamilton

0

Không chắc đây là pythonic như thế nào nhưng cho đến khi có một chức năng đầu tiên trong thư viện tôi đưa nó vào nguồn:

first = lambda l, default=None: next(iter(l or []), default)

Đó chỉ là một dòng (phù hợp với màu đen) và tránh phụ thuộc.


-1

Sử dụng và và hoặc:

a = get_list()
return a and a[0] or None

-1

Có lẽ không phải là giải pháp nhanh nhất, nhưng không ai đề cập đến tùy chọn này:

dict(enumerate(get_list())).get(0)

Nếu get_list()có thể trở lại, Nonebạn có thể sử dụng:

dict(enumerate(get_list() or [])).get(0)

Ưu điểm:

-một đường thẳng

-bạn chỉ cần gọi get_list()một lần

-dễ hiểu


-1

Trường hợp sử dụng của tôi chỉ để đặt giá trị của một biến cục bộ.

Cá nhân tôi đã tìm thấy thử và ngoại trừ phong cách sạch hơn để đọc

items = [10, 20]
try: first_item = items[0]
except IndexError: first_item = None
print first_item

hơn là cắt một danh sách.

items = [10, 20]
first_item = (items[:1] or [None, ])[0]
print first_item

-1

Một số người đã đề nghị làm một cái gì đó như thế này:

list = get_list()
return list and list[0] or None

Điều đó hoạt động trong nhiều trường hợp, nhưng nó sẽ chỉ hoạt động nếu danh sách [0] không bằng 0, Sai hoặc một chuỗi rỗng. Nếu danh sách [0] là 0, Sai hoặc một chuỗi trống, phương thức sẽ trả về không chính xác Không có.

Tôi đã tạo ra lỗi này trong mã của riêng tôi quá nhiều lần!


3
Đây phải là một nhận xét dưới (các) câu trả lời thiếu sót hơn là một câu trả lời độc lập.
IJ Kennedy

-2

Bạn có thể sử dụng Phương pháp trích xuất . Nói cách khác, trích xuất mã đó thành một phương thức mà sau đó bạn gọi.

Tôi sẽ không cố nén nó nhiều hơn nữa, một lớp lót có vẻ khó đọc hơn phiên bản dài dòng. Và nếu bạn sử dụng Phương thức trích xuất, thì đó là một lớp lót;)



-3

không phải là con trăn thành ngữ tương đương với các toán tử ternary kiểu C

cond and true_expr or false_expr

I E.

list = get_list()
return list and list[0] or None

Nếu [0] là số 0 hoặc chuỗi trống (hoặc bất kỳ thứ gì khác đánh giá là sai), thì điều này sẽ trả về Không thay vì thực sự [0] là gì.
Adam Rosenfield
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.