Câu hỏi Hàm python () hoạt động như thế nào?


Trong trang tài liệu python cho any, mã tương đương cho any() chức năng được cho là:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

Làm thế nào để chức năng này biết những gì yếu tố tôi muốn thử nghiệm nếu gọi nó trong hình thức này?

any(x > 0 for x in list)

Từ định nghĩa hàm, tất cả những gì tôi có thể thấy là tôi đang truyền một đối tượng có thể lặp lại. Làm thế nào để for vòng lặp biết tôi đang tìm kiếm thứ gì đó > 0?


76
2018-05-12 08:18


gốc




Các câu trả lời:


Nếu bạn dùng any(lst) bạn thấy điều đó lst là một danh sách của một số mục. Nếu nó chứa [0, False, '', 0.0, [], {}, None] (tất cả đều có giá trị boolean của False) sau đó any(lst) sẽ là False. Nếu lst cũng chứa bất kỳ điều nào sau đây [-1, True, "X", 0.00001] (tất cả đều đánh giá True) sau đó any(lst) sẽ là True.

Trong mã bạn đã đăng, x > 0 for x in lst, đây là một loại khác có thể lặp lại, được gọi là biểu thức máy phát. Trước khi các biểu thức máy phát điện được thêm vào Python, bạn sẽ tạo ra danh sách hiểutrông rất giống nhau, nhưng với xung quanh []'S: [x > 0 for x in lst]. Từ lst có chứa [-1, -2, 10, -4, 20], bạn sẽ nhận được điều này danh sách được hiểu: [False, False, True, False, True]. Giá trị nội bộ này sau đó sẽ được chuyển đến any hàm sẽ trả về True, vì có ít nhất một True giá trị.

Nhưng vơi biểu thức máy phát, Python không còn phải tạo danh sách nội bộ đó nữa True(s) và False(s), các giá trị sẽ được tạo dưới dạng any chức năng lặp lại thông qua các giá trị được tạo ra tại một thời điểm bằng biểu thức máy phát. , kể từ đó any ngắn mạch, nó sẽ dừng lặp lại ngay sau khi nó thấy đầu tiên True giá trị. Điều này đặc biệt hữu ích nếu bạn đã tạo lst sử dụng một cái gì đó như lst = range(-1,int(1e9)) (hoặc là xrange nếu bạn đang sử dụng Python2.x). Mặc dù biểu thức này sẽ tạo ra hơn một tỷ mục, any chỉ phải đi xa như mục thứ ba khi nó được 1, đánh giá True cho x>0, và như vậy any có thể trở lại True.

Nếu bạn đã tạo danh sách hiểu, Trước tiên Python sẽ phải tạo danh sách tỷ lệ phần trăm trong bộ nhớ, và sau đó chuyển nó đến any. Nhưng bằng cách sử dụng biểu thức máy phát, bạn có thể có các hàm dựng sẵn của Python như any và all thoát ra sớm, ngay sau khi True hoặc là False giá trị được nhìn thấy.


112
2018-05-12 08:38



Nó cũng đáng nói đến là any(x > 0 for x in list) chỉ là một cú pháp cú pháp cho any((x > 0 for x in list)). - georg
Bạn nên thêm Nonevào danh sách các phần tử có giá trị boolean của False - Alok Mysore
Thêm vào @georg, đường cú pháp không đặc biệt any. def b(x): return x; print b(x > 1 for x in xs) # prints <generator object .. - industryworker3595112


>>> names = ['King', 'Queen', 'Joker']
>>> any(n in 'King and john' for n in names)
True

>>> all(n in 'King and Queen' for n in names)
False

Nó chỉ làm giảm một vài dòng mã thành một. Bạn không phải viết mã dài như:

for n in names:
    if n in 'King and john':
       print True
    else:
       print False

21
2018-06-08 07:29





(x > 0 for x in list) trong đó gọi hàm tạo ra một biểu thức máy phát điện ví dụ.

>>> nums = [1, 2, -1, 9, -5]
>>> genexp = (x > 0 for x in nums)
>>> for x in genexp:
        print x


True
True
False
True
False

Cái nào any sử dụng, và shortcircuits gặp phải đối tượng đầu tiên đánh giá True


19
2018-05-12 08:21





Đó là vì khả năng lặp lại là

(x > 0 for x in list)

Lưu ý rằng x > 0 trả về một trong hai True hoặc là False và do đó bạn có một booleans có thể lặp lại.


5
2018-05-12 08:20





Nói đơn giản, bất kỳ () nào làm việc này: theo điều kiện ngay cả khi nó gặp một giá trị thỏa mãn trong danh sách, nó trả về true, ngược lại nó trả về false.

list = [2,-3,-4,5,6]

a = any(x>0 for x in lst)

print a:
True


list = [2,3,4,5,6,7]

a = any(x<0 for x in lst)

print a:
False

4
2018-05-05 09:37