Jika Anda menggunakan, any(lst)
Anda melihat bahwa lst
iterable, yang merupakan daftar beberapa item. Jika itu berisi [0, False, '', 0.0, [], {}, None]
(yang semuanya memiliki nilai boolean False
) maka any(lst)
akan False
. Jika lst
juga berisi salah satu dari yang berikut [-1, True, "X", 0.00001]
(semuanya mengevaluasi untuk True
) maka any(lst)
akan True
.
Dalam kode yang Anda posting,, x > 0 for x in lst
ini adalah jenis iterable yang berbeda, yang disebut ekspresi generator . Sebelum ekspresi Generator ditambahkan ke Python, Anda akan menciptakan pemahaman daftar , yang terlihat sangat mirip, tetapi dengan sekitarnya []
's: [x > 0 for x in lst]
. Dari lst
mengandung [-1, -2, 10, -4, 20]
, Anda akan mendapatkan ini daftar dipahami : [False, False, True, False, True]
. Nilai internal ini kemudian akan diteruskan ke any
fungsi, yang akan kembali True
, karena setidaknya ada satu True
nilai.
Tetapi dengan ekspresi generator , Python tidak lagi harus membuat daftar internal tersebut True(s)
dan False(s)
, nilai akan dihasilkan saat any
fungsi melakukan iterasi melalui nilai yang dihasilkan satu per satu oleh ekspresi generator. Dan , karena any
korsleting, iterasi akan berhenti segera setelah ia melihat nilai pertama True
. Ini akan sangat berguna jika Anda membuat lst
menggunakan sesuatu seperti lst = range(-1,int(1e9))
(atau xrange
jika Anda menggunakan Python2.x ). Meskipun ungkapan ini akan menghasilkan lebih dari satu miliar entri, any
hanya harus pergi sejauh entri ketiga ketika sampai 1
, yang mengevaluasi True
untuk x>0
, dan any
dapat kembali True
.
Jika Anda telah membuat pemahaman daftar , Python pertama-tama harus membuat daftar miliar elemen di memori, dan kemudian meneruskannya ke any
. Tetapi dengan menggunakan ekspresi generator , Anda dapat memiliki fungsi bawaan Python seperti any
dan all
keluar lebih awal, segera setelah nilai True
atau False
terlihat.
any(x > 0 for x in list)
itu hanyalah gula sintaksis untukany((x > 0 for x in list))
.None
ke daftar elemen yang memiliki nilai booleanFalse
any
.def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
Itu hanya mengurangi beberapa baris kode menjadi satu. Anda tidak perlu menulis kode yang panjang seperti:
sumber
(x > 0 for x in list)
dalam pemanggilan fungsi itu menciptakan ekspresi generator misalnya.Yang
any
menggunakan, dan sirkuit pendek saat menghadapi objek pertama yang mengevaluasiTrue
sumber
Itu karena iterable adalah
Perhatikan bahwa
x > 0
mengembalikan salah satuTrue
atauFalse
dan dengan demikian Anda memiliki boolean yang dapat diulang.sumber
Cukup dengan mengatakan, any () melakukan pekerjaan ini: sesuai dengan kondisi bahkan jika ia menemukan satu nilai yang memenuhi dalam daftar, ia mengembalikan true, jika tidak ia mengembalikan salah.
sumber