कैसे अजगर किसी भी () समारोह काम करता है?


113

के लिए अजगर डॉक्स पृष्ठ में any, any()फ़ंक्शन के लिए समान कोड निम्नानुसार दिया गया है:

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

इस फ़ंक्शन को यह कैसे पता चलता है कि इस रूप में कॉल करने पर मैं किस तत्व का परीक्षण करना चाहता हूं?

any(x > 0 for x in list)

फ़ंक्शन परिभाषा से, सभी मैं देख सकता हूं कि मैं एक चलने योग्य ऑब्जेक्ट पास कर रहा हूं। forपाश को कैसे पता चलता है कि मैं कुछ खोज रहा हूँ > 0?

जवाबों:


166

यदि आप उपयोग any(lst)करते हैं तो आप देखते हैं कि lstयह चलने योग्य है, जो कुछ वस्तुओं की सूची है। यदि इसमें समाहित होता [0, False, '', 0.0, [], {}, None](जिसमें सभी का मूलांक मान होता है False) तो any(lst)होगा False। यदि lstनिम्न में से कोई भी सम्‍मिलित है [-1, True, "X", 0.00001](सभी का मूल्‍यांकन True) तो any(lst)होगा True।

आपके द्वारा पोस्ट किए गए कोड में x > 0 for x in lst, यह एक अलग प्रकार का चलने योग्य है, जिसे जनरेटर अभिव्यक्ति कहा जाता है । इससे पहले कि जनरेटर भाव अजगर को जोड़ा गया था, तो आप एक बनाया होगा सूची समझ है, जो बहुत समान दिखता है, लेकिन आसपास के साथ []की: [x > 0 for x in lst]। से lstयुक्त [-1, -2, 10, -4, 20], तो आप इस मिलेगा comprehended सूची : [False, False, True, False, True]। यह आंतरिक मान तब anyफ़ंक्शन में पास हो जाता है, जो Trueकम से कम एक Trueमान होता है।

लेकिन साथ जनरेटर भाव , अजगर नहीं रह गया है की है कि आंतरिक सूची बनाने के लिए है True(s)और False(s)मूल्यों के रूप में उत्पन्न हो जाएगा, anyजनरेटर अभिव्यक्ति द्वारा एक समय में एक उत्पन्न मूल्यों के माध्यम से समारोह दोहराता। और , anyशॉर्ट-सर्किट के बाद से , जैसे ही यह पहला Trueमूल्य देखता है, यह चलना बंद कर देगा । यह विशेष रूप से आसान होगा यदि आपने lstकुछ का उपयोग करके बनाया lst = range(-1,int(1e9))(या xrangeयदि आप Python2.x का उपयोग कर रहे हैं )। भले ही यह अभिव्यक्ति एक अरब से अधिक प्रविष्टियों को उत्पन्न करेगी, anyकेवल तीसरी प्रविष्टि के रूप में दूर तक जाना होगा जब यह हो जाता है 1, जो इसके लिए मूल्यांकन करता Trueहै x>0, और इसलिए anyवापस आ सकता है True।

यदि आपने एक सूची समझ बनाई है , तो पहले पायथन को स्मृति में अरब-तत्व सूची बनाना होगा, और फिर उसे पास करना होगा any। लेकिन एक जनरेटर अभिव्यक्ति का उपयोग करके , आप पाइथन के अंतर्निहित कार्यों को पसंद कर सकते हैं anyऔर जैसे allही Trueया एक Falseमूल्य देखा जाता है , जल्दी से तोड़ सकते हैं ।


25
यह भी उल्लेख के लायक है कि any(x > 0 for x in list)सिर्फ एक चीनी के लिए चीनी है any((x > 0 for x in list))।
— जॉर्ज

3
आपको Noneउन तत्वों की सूची में शामिल होना चाहिए जिनके बूलियन मूल्य हैंFalse
— आलोक मैसूर

2
@Georg में जोड़कर, वाक्यगत शर्करा के लिए विशेष नहीं है any। def b(x): return x; print b(x > 1 for x in xs) # prints <generator object ..
— industryworker3595112

@georg इस स्पष्टीकरण के लिए धन्यवाद। यह एक बहुत ही महत्वपूर्ण बिंदु है जो किसी भी कोष्ठक के साथ कोड का परीक्षण करते समय मुझे उलझन में था।
— मासायोमाजिक

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

यह सिर्फ एक में कई लाइन कोड को कम करता है। आपको लंबा कोड लिखने की ज़रूरत नहीं है:

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

23

(x > 0 for x in list) उस फ़ंक्शन कॉल में एक जनरेटर अभिव्यक्ति बनाता है उदा।

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


True
True
False
True
False

जिसका anyउपयोग करता है, और मूल्यांकन करने वाली पहली वस्तु का सामना करने पर शॉर्टक्रीट्स करता हैTrue


7

यह है क्योंकि चलने योग्य है

(x > 0 for x in list)

ध्यान दें कि या x > 0तो वापस आती है या इस प्रकार आपके पास बूलियन्स के चलने योग्य है।TrueFalse


7

सीधे शब्दों में, कोई भी () यह काम करता है: शर्त के अनुसार भले ही वह सूची में एक पूरा करने वाले मूल्य का सामना करता है, यह सही है, अन्यथा यह गलत है।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.