Để trả lời câu hỏi đầu tiên của bạn về việc tại sao một danh sách các giá trị rỗng không được xem là trống rỗng, đó là bởi vì nó có chứa một cái gì đó, ngay cả khi những điều bản thân họ có sản phẩm nào. Hãy nghĩ về nó như một cái hộp rỗng.
Đoạn mã dưới đây cho thấy một cách để sửa đổi chức năng foo()
để thực hiện những gì bạn muốn (và kiểm tra nó). Ý niệm của bạn về những gì một danh sách trống là đáng ngạc nhiên khó khăn để đưa ra, một phần vì nó chạy ngược với những gì ngôn ngữ chính nó xem xét trống rỗng.Như bạn có thể thấy tất cả các logic đối phó với việc xác định xem danh sách là "trống" theo định nghĩa của bạn đã được chuyển vào một chức năng riêng biệt gọi là empty_list()
vì điều đó có thể có ít để làm với phần còn lại của những gì foo()
phải hoàn thành. Nó không quá phức tạp và nếu không có gì khác nên cung cấp cho bạn một điểm khởi đầu tốt.
Ngoài ra, bạn không nói nên làm gì nếu đối số được truyền không phải là danh sách bất kỳ loại nào hoặc là danh sách nhưng không chỉ chứa các danh sách hoặc chuỗi khác, vì vậy, nó sẽ tăng TypeError
ngoại lệ - một cái gì đó tương tự như cách hầu hết các hàm Python tích hợp trả lời khi điều này xảy ra với chúng. Dưới đây là các mẫu mã và đầu ra thử nghiệm của nó:
try:
string_type = basestring
except NameError: # probably Python 3.x
string_type = str
class _NULL(object): # unique marker object
def __repr__(self): return '<nothing>'
_NULL = _NULL()
def empty_list(arg=_NULL):
arg = arg if arg is not _NULL else []
if not isinstance(arg, (list, string_type)):
raise TypeError
elif isinstance(arg, string_type):
return not len(arg)
else:
return len(arg) == 0 or all(empty_list(e) for e in arg)
def foo(list_=None):
if list_ is None or empty_list(list_):
print 'list is empty'
else:
print 'list is not empty'
testcases = [
_NULL,
[],
[''],
['', ''],
['', ['']],
['abc'],
['', 'abc'],
[False],
[None],
[0],
[0.0],
[0L],
[0j],
[42],
[{}],
[{'':0}],
[{'a':1}],
False,
None,
0,
0.0,
0L,
0j,
42,
{},
{'':0},
{'a':1},
]
for arg in testcases:
call = 'foo({!r:s}) ->'.format(arg)
print '{!s:>20s}'.format(call),
try:
foo() if arg is _NULL else foo(arg)
except TypeError:
print 'illegal argument exception'
Dưới đây là đầu ra nó tạo ra với Python 2.7:
foo(<nothing>) -> list is empty
foo([]) -> list is empty
foo(['']) -> list is empty
foo(['', '']) -> list is empty
foo(['', ['']]) -> list is empty
foo(['abc']) -> list is not empty
foo(['', 'abc']) -> list is not empty
foo([False]) -> illegal argument exception
foo([None]) -> illegal argument exception
foo([0]) -> illegal argument exception
foo([0.0]) -> illegal argument exception
foo([0L]) -> illegal argument exception
foo([0j]) -> illegal argument exception
foo([42]) -> illegal argument exception
foo([{}]) -> illegal argument exception
foo([{'': 0}]) -> illegal argument exception
foo([{'a': 1}]) -> illegal argument exception
foo(False) -> illegal argument exception
foo(None) -> list is empty
foo(0) -> illegal argument exception
foo(0.0) -> illegal argument exception
foo(0L) -> illegal argument exception
foo(0j) -> illegal argument exception
foo(42) -> illegal argument exception
foo({}) -> illegal argument exception
foo({'': 0}) -> illegal argument exception
foo({'a': 1}) -> illegal argument exception
Lưu ý- Tôi hiểu trong trường hợp x = [ ''] danh sách thực sự là không trống nhưng vẫn còn nó bạn biết nó có sản phẩm nào :) (hoặc nó không có giá trị/dữ liệu có thể được sử dụng) –
Bạn đang thực sự ** cố gắng làm gì? Tại sao bạn ** muốn ** '['', '']' được coi là "trống"? –
['', ''] không phải là vấn đề lớn .... cho tập hợp này (['', '']) có thể được sử dụng !! –