2012-07-22 18 views
7

मैं उदारता पर वेब एप्लिकेशन इंजीनियरिंग कोर्स ले रहा हूं। मैंने देखा कि प्रशिक्षक and ऑपरेटर का उपयोग return कथन में उसकी सत्यापन विधि में करता है। और मुझे समझ में नहीं आया कि 2 तर्क वापस करना संभव है। मुझे लगता है, यह if कथन जैसा कुछ हो सकता है। क्या कोई यह समझा सकता है कि वास्तव में यह क्या है?बदले में "और" का उपयोग

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$") 
def valid_username(username): 
    return username and USER_RE.match(username) 

अग्रिम धन्यवाद:

यहाँ सत्यापन विधि है।

+0

'रिटर्न ए और बी' का अर्थ है 'वापसी (ए और बी) 'i.e.' x = a और b; वापसी x' – katrielalex

+2

जैसा कि नीचे दिए गए उत्तरों इंगित करते हैं, यह दो तर्कों को वापस नहीं कर रहा है। हालांकि, पायथन में, दो वस्तुओं का एक टुपल वापस करना बहुत आसान है, जो अन्य संदर्भों में उपयोगी हो सकता है। –

+1

इसे लिखने का एक और तरीका: 'USER_RE.match (उपयोगकर्ता नाम) वापस करें यदि उपयोगकर्ता नाम अन्य उपयोगकर्ता नाम' –

उत्तर

12

and ऑपरेटर मूल्यांकन करता है कि इसके दोनों तर्क tru-ish हैं, लेकिन थोड़ा आश्चर्यजनक तरीके से: सबसे पहले यह अपने बाएं तर्क की जांच करता है। यदि यह सत्य है, तो यह सही तर्क देता है। यदि बायां तर्क गलत है, तो यह बाएं तर्क देता है।

तो अपने कोड में अंतिम पंक्ति:

return username and USER_RE.match(username) 

में ही है के रूप में: अगर वे खाली नहीं हैं

if username: 
    return USER_RE.match(username) 
else: 
    return username 

स्ट्रिंग्स username तरह truish हैं। रेगेक्स match फ़ंक्शन एक ट्रूश मैच ऑब्जेक्ट देता है यदि पैटर्न मेल खाता है, और None लौटाता है, तो यह एक गलत मूल्य है, यदि यह मेल नहीं खाता है।

शुद्ध परिणाम यह है कि valid_username उपयोगकर्ता नाम खाली स्ट्रिंग नहीं है, और उपयोगकर्ता नाम दिए गए पैटर्न से मेल खाता है तो एक वास्तविक मूल्य लौटाएगा।

नोट करें "और" यहां दो मानों को वापस करने के साथ कुछ भी नहीं है, यह एक मान की गणना कर रहा है।

+0

+1 स्पष्ट स्पष्ट स्पष्टीकरण के लिए +1 – Levon

2

जब आप लॉजिकल ऑपरेटर का उपयोग करते हैं, तो यह नियमों के अनुसार जारी रहता है, इसलिए यह पहले कथन की सच्चाई का मूल्यांकन करता है और यदि यह सत्य नहीं है, तो यह एक गैर-सत्य मूल्य (पहले मामले में) देता है , '')।

print repr("" and "THIS IS POST AND") 
"" 

print "" or "THIS IS POST AND" 
THIS IS POST AND 

print None or "Something else" 
Something else 

जहां इस काम में आता है जब आप None की तरह कुछ पर एक न के बराबर विधि (जैसे लंबाई विशेषता) कॉल करने के लिए नहीं करना चाहती:

r = None 

s = [1,2,3,4] 

print r and len(r) 
None 

print s and len(s) 
4 

मामले तुम्हें तैनात में, मुद्दा यह है कि यदि उपयोगकर्ता नाम सत्य है तो आप केवल नियमित अभिव्यक्ति के खिलाफ उपयोगकर्ता नाम देखना चाहते हैं।

यह ध्यान रखना महत्वपूर्ण है कि and, और or दोनों शॉर्ट सर्किट। तो अगर आपको कुछ सच नहीं मिलता है, तो फ़ंक्शन नियमित अभिव्यक्ति का मूल्यांकन भी नहीं करेगा।

0

and सिर्फ एक बाइनरी ऑपरेटर है। return a and b संरचनात्मक रूप से return a + b या return a * b जैसा ही है, और उसी तरह काम करता है। अभिव्यक्ति का मूल्यांकन किया जाता है, तो इसका परिणाम return पर दिया जाता है, जो इसे कॉलर पर लौटाता है। return कथन में and का उपयोग करने के बारे में बिल्कुल कुछ भी नहीं है।

के रूप में नेड के जवाब से बहुत अच्छी तरह से बताया गया है, a and b का परिणाम सही-ish अगर दोनों की a और b सच-ish कर रहे हैं, और झूठे-ish अन्यथा है।यह शॉर्ट-सर्किट भी है यदि बाएं तर्क गलत-आश है, क्योंकि यह पूरे a and b अभिव्यक्ति के परिणाम को निर्धारित करने के लिए पर्याप्त है।

इस मामले में, एक खाली स्ट्रिंग उस नियमित अभिव्यक्ति से मेल नहीं खाती है, इसलिए ऑपरेशन पूरी तरह से तर्क के रूप में अनावश्यक माना जाता है। मुझे दृढ़ता से संदेह है कि इसका उपयोग यहां किया जा रहा है क्योंकि username को None मान दिया जा सकता है, जो नियमित अभिव्यक्ति मैच को अपवाद फेंकने का कारण बनता है। के बजाय username and USER_RE.match(username) का उपयोग करना मतलब है कि username के लिए कोई भी झूठा-आइस मान (None सहित) फ़ंक्शन को नियमित-अभिव्यक्ति मिलान का प्रयास किए बिना कुछ झूठी-आश वापस करने का कारण बनता है।

लेकिन फिर से, इसका return से कोई लेना देना नहीं है, यह केवल and काम करता है।

0

अजगर जानने के लिए शुरुआत के लिए, मुझे लगता है कि इस बयान

वापसी यूज़रनेम और USER_RE.match (उपयोगकर्ता नाम) को समझने के लिए मुश्किल है

क्या हम पहले नोटिस चाहिए कि, यह है विधि बूलियन वापस आ जाएगी (या तो झूठी है या सही पर लौट) यह वापस नहीं करता है स्ट्रिंग "उपयोगकर्ता नाम"

इतना आसान समझ यह है: अगर त नहीं है और उपयोगकर्ता नाम regex सत्यापन पास करता है, सत्य लौटाता है, अन्यथा झूठी

संबंधित मुद्दे