Pertanyaan Bagaimana tepatnya fungsi python () berfungsi?


Di halaman dokumen python untuk any, kode yang setara untuk any() fungsi diberikan sebagai:

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

Bagaimana fungsi ini tahu elemen apa yang ingin saya uji jika memanggilnya dalam formulir ini?

any(x > 0 for x in list)

Dari definisi fungsi, yang bisa saya lihat adalah bahwa saya melewati objek yang dapat diulang. Bagaimana for loop tahu saya mencari sesuatu > 0?


75
2018-05-12 08:18


asal


Jawaban:


Jika Anda menggunakan any(lst) kamu melihatnya lst adalah iterable, yang merupakan daftar beberapa item. Jika terkandung [0, False, '', 0.0, [], {}, None] (yang semuanya memiliki nilai boolean False) kemudian any(lst) akan menjadi False. Jika lst juga berisi hal-hal berikut [-1, True, "X", 0.00001] (semua yang dievaluasi True) kemudian any(lst) akan menjadi True.

Dalam kode yang Anda posting, x > 0 for x in lst, ini adalah jenis yang berbeda dari iterable, yang disebut a ekspresi generator. Sebelum ekspresi generator ditambahkan ke Python, Anda akan membuat a daftar pemahaman, 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 yang 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 True(s) dan False(s), nilai-nilai akan dihasilkan sebagai any fungsi iterates melalui nilai-nilai yang dihasilkan satu per satu oleh ekspresi generator. Dan, sejak any sirkuit pendek, itu akan berhenti iterasi segera setelah melihat yang pertama True nilai. Ini akan sangat berguna jika Anda dibuat 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 sebagainya any dapat kembali True.

Jika Anda telah membuat file daftar pemahamanPertama, Python harus membuat daftar milyaran elemen di memori, dan kemudian meneruskannya any. Tetapi dengan menggunakan ekspresi generator, Anda dapat memiliki fungsi builtin Python seperti any dan all keluar lebih awal, segera setelah True atau False nilai terlihat.


112
2018-05-12 08:38



>>> 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

Itu hanya mengurangi beberapa baris kode menjadi satu. Anda tidak perlu menulis kode panjang seperti:

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) dalam panggilan fungsi itu menciptakan ekspresi generator misalnya.

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


True
True
False
True
False

Yang any menggunakan, dan shortcircuits pada pertemuan objek pertama yang mengevaluasi True


19
2018-05-12 08:21



Itu karena iterable-nya

(x > 0 for x in list)

Perhatikan itu x > 0 kembali baik True atau False dan dengan demikian Anda memiliki iterable dari boolean.


5
2018-05-12 08:20



Cukup katakan, setiap () apakah ini bekerja: sesuai dengan kondisi bahkan jika itu memenuhi satu nilai yang memenuhi dalam daftar, itu mengembalikan benar, kalau tidak mengembalikan salah.

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