Saya mencoba memahami bagaimana fungsi bawaan any()
dan all()
Python bekerja.
Saya mencoba membandingkan tupel sehingga jika ada nilai yang berbeda maka akan kembali True
dan jika semuanya sama maka akan kembali False
. Bagaimana mereka bekerja dalam kasus ini untuk mengembalikan [False, False, False]?
d
adalah a defaultdict(list)
.
print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]
Setahu saya, ini harus keluar
# [False, True, False]
karena (1,1) sama, (5,6) berbeda, dan (0,0) sama.
Mengapa mengevaluasi ke False untuk semua tupel?
Jawaban:
Secara kasar Anda dapat memikirkan
any
danall
sebagai serangkaian operator logisor
danand
masing-masing.apa saja
any
akan kembaliTrue
ketika setidaknya salah satu elemennya adalah Kebenaran. Baca tentang Pengujian Nilai Kebenaran.semua
all
akan kembaliTrue
hanya ketika semua elemen adalah Truthy.Meja kebenaran
Catatan 1: Kasing iterable kosong dijelaskan dalam dokumentasi resmi, seperti ini
any
Karena tidak ada elemen yang benar, ia kembali
False
dalam kasus ini.all
Karena tidak ada elemen yang salah, ia kembali
True
dalam kasus ini.Catatan 2:
Hal lain yang penting untuk diketahui
any
danall
adalah, itu akan merusak eksekusi, saat mereka tahu hasilnya. Keuntungannya, seluruh iterable tidak perlu dikonsumsi. Sebagai contoh,Di sini,
(not (i % 6) for i in range(1, 10))
adalah ekspresi generator yang mengembalikanTrue
jika angka saat ini dalam 1 dan 9 adalah kelipatan 6.any
iteratesmultiples_of_6
dan ketika bertemu6
, ia menemukan nilai kebenaran, sehingga segera kembaliTrue
, dan sisanyamultiples_of_6
tidak diulang. Itulah yang kita lihat ketika kita mencetaklist(multiples_of_6)
, hasil7
,8
dan9
.Hal yang luar biasa ini digunakan dengan sangat cerdik dalam jawaban ini .
Dengan pemahaman dasar ini, jika kami melihat kode Anda, Anda tahu
yang memastikan bahwa, setidaknya salah satu nilai adalah Kebenaran tetapi tidak semuanya. Itu sebabnya ia kembali
[False, False, False]
. Jika Anda benar-benar ingin memeriksa apakah kedua angkanya tidak sama,sumber
bool(data) and all(...)
harus bekerja.any
danall
ambil iterables dan kembalikanTrue
jika ada dan semua (masing-masing) elemen tersebutTrue
.Jika iterables kosong,
any
kembaliFalse
, danall
kembaliTrue
.Saya menunjukkan
all
danany
untuk siswa di kelas hari ini. Mereka sebagian besar bingung tentang nilai kembali untuk iterables kosong. Menjelaskannya dengan cara ini menyebabkan banyak bola lampu menyala.Perilaku jalan pintas
Mereka,
any
danall
keduanya mencari kondisi yang memungkinkan mereka untuk berhenti mengevaluasi. Contoh pertama yang saya berikan mengharuskan mereka untuk mengevaluasi boolean untuk setiap elemen di seluruh daftar.(Perhatikan bahwa daftar literal tidak dengan sendirinya dievaluasi dengan malas - Anda bisa mendapatkannya dengan Iterator - tetapi ini hanya untuk tujuan ilustrasi.)
Berikut ini adalah implementasi Python dari semua dan semua:
Tentu saja, implementasi nyata ditulis dalam C dan jauh lebih berkinerja, tetapi Anda bisa mengganti yang di atas dan mendapatkan hasil yang sama untuk kode dalam jawaban ini (atau yang lain).
all
all
memeriksa elemen yang akanFalse
(sehingga dapat kembaliFalse
), lalu kembaliTrue
jika tidak ada satu punFalse
.any
Cara
any
kerjanya adalah ia memeriksa elemen yang akanTrue
(sehingga dapat mengembalikanTrue), then it returns
Falseif none of them were
True`.Saya pikir jika Anda mengingat perilaku jalan pintas, Anda akan secara intuitif memahami bagaimana mereka bekerja tanpa harus merujuk pada Tabel Kebenaran.
Bukti
all
danany
jalan pintas:Pertama, buat bising_iterator:
dan sekarang mari kita beralih daftar dengan berisik, menggunakan contoh-contoh kami:
Kita bisa melihat
all
pemberhentian pada cek boolean False pertama.Dan
any
berhenti pada cek True boolean pertama:Sumber
Mari kita lihat sumbernya untuk mengkonfirmasi hal di atas.
Inilah sumber untuk
any
:Dan inilah sumber untuk
all
:sumber
Python/bltinmodule.c
- saya menambahkannya di atas.Saya tahu ini sudah tua, tapi saya pikir mungkin membantu untuk menunjukkan seperti apa fungsi-fungsi ini dalam kode. Ini benar-benar menggambarkan logika, lebih baik daripada teks atau tabel IMO. Pada kenyataannya mereka diimplementasikan dalam C daripada Python murni, tetapi ini setara.
Secara khusus, Anda dapat melihat bahwa hasil untuk iterables kosong hanyalah hasil alami, bukan kasus khusus. Anda juga dapat melihat perilaku hubungan arus pendek; sebenarnya akan lebih banyak pekerjaan agar tidak terjadi hubungan arus pendek.
Ketika Guido van Rossum (pencipta Python) pertama kali mengusulkan penambahan
any()
danall()
, ia menjelaskannya hanya dengan memposting potongan kode di atas.sumber
Kode yang Anda tanyakan berasal dari jawaban saya yang diberikan di sini . Itu dimaksudkan untuk memecahkan masalah membandingkan beberapa bit array - yaitu koleksi
1
dan0
.any
danall
berguna ketika Anda dapat mengandalkan "kebenaran" nilai - yaitu nilainya dalam konteks boolean. 1 adalahTrue
dan 0 adalahFalse
, kenyamanan yang dijawab oleh leveraged. 5 kebetulan jugaTrue
, jadi ketika Anda mencampurnya ke dalam input yang mungkin Anda ... yah. Tidak bekerjaAnda bisa melakukan sesuatu seperti ini:
Itu tidak memiliki estetika dari jawaban sebelumnya (saya sangat suka tampilan
any(x) and not all(x)
), tetapi menyelesaikan pekerjaan.sumber
True
kapan nilainya berbeda, panjang set harus 2, bukan 1.sumber
sumber
Konsepnya sederhana:
sumber
sumber