Hàm any () của python hoạt động chính xác như thế nào?


113

Trong trang tài liệu python cho any, mã tương đương cho any()hàm được đưa ra là:

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

Làm thế nào để hàm này biết được phần tử tôi muốn kiểm tra nếu gọi nó ở dạng 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 để forvòng lặp biết tôi đang tìm kiếm thứ gì đó > 0?

Câu trả lời:


166

Nếu bạn sử dụng, any(lst)bạn thấy đó lstlà có thể lặp lại, đó là danh sách một số mục. Nếu nó chứa [0, False, '', 0.0, [], {}, None](tất cả đều có giá trị boolean False) thì any(lst)sẽ là False. Nếu lstcũng chứa bất kỳ điều nào sau đây [-1, True, "X", 0.00001](tất cả đều đánh giá đến True) thì 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 trình tạo . Trước khi biểu thức máy phát điện đã được thêm vào Python, bạn đã có thể tạo ra một sự hiểu biết danh sách , trông rất giống nhau, nhưng với xung quanh []'s: [x > 0 for x in lst]. Từ lstchứa [-1, -2, 10, -4, 20], bạn sẽ có được điều này danh sách thấu hiểu : [False, False, True, False, True]. Giá trị nội bộ này sau đó sẽ được chuyển đến anyhàm, giá trị này sẽ trả về True, vì có ít nhất một Truegiá trị.

Nhưng với biểu thức trình tạo , Python không còn phải tạo danh sách nội bộ đó True(s)False(s), các giá trị sẽ được tạo khi anyhàm lặp qua các giá trị được tạo lần lượt bởi biểu thức trình tạo. , vì anyngắn mạch, nó sẽ ngừng lặp lại ngay khi nhìn thấy Truegiá trị đầu tiên . Điều này sẽ đặc biệt hữu ích nếu bạn đã tạo lstbằng cách sử dụng thứ gì đó như lst = range(-1,int(1e9))(hoặc xrangenế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 nhập, nhưng anychỉ phải đi xa đến mục nhập thứ ba khi nó đến 1, đánh giá Truecho x>0và vì vậy anycó thể trả về True.

Nếu bạn đã tạo danh sách dễ hiểu , trước tiên Python sẽ phải tạo danh sách tỷ phần tử trong bộ nhớ, sau đó chuyển nó vào any. Nhưng bằng cách sử dụng một biểu thức trình tạo , bạn có thể có các hàm nội trang của Python giống như anyallđột phá sớm, ngay sau khi một Truehoặc Falsegiá trị được nhìn thấy.


25
Nó cũng sẽ đáng nói rằng any(x > 0 for x in list)chỉ là một cú pháp đường cho any((x > 0 for x in list)).
georg

3
Bạn nên thêm Nonevào danh sách các yếu tố có giá trị boolean củaFalse
Alok Mysore

2
Thêm vào @georg, đường cú pháp không phải là đặc biệt any. def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
industryworker3595112

@georg Cảm ơn bạn đã làm rõ điều này. Đây là một điểm thực sự quan trọng khiến tôi bối rối khi kiểm tra mã với bất kỳ dấu ngoặc nào.
MasayoMusic

39
>>> 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ỉ giảm một số dòng mã thành một. Bạn không cần phải viết mã dài dòng như:

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

23

(x > 0 for x in list) trong lời gọi hàm đó tạo ra một biểu thức trình tạo 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 anysử dụng và các phím tắt khi gặp đối tượng đầu tiên đánh giáTrue


7

Đó là bởi vì có thể lặp lại là

(x > 0 for x in list)

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


7

Nói một cách đơn giản, any () thực hiện điều 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, nếu không 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
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.