इफ-स्टेटमेंट में पायथन के && (तार्किक-और) के बराबर


827

यहाँ मेरा कोड है:

def front_back(a, b):
  # +++your code here+++
  if len(a) % 2 == 0 && len(b) % 2 == 0:
    return a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):] 
  else:
    #todo! Not yet done. :P
  return

मैं IF सशर्त में त्रुटि प्राप्त कर रहा हूं ।
मैं क्या गलत कर रहा हूं?


10
स्पष्ट रूप से सर्जियो ने जानना चाहा कि उनका कोड क्यों तोड़ा गया था, लेकिन मैंने सवाल के शीर्षक में थोड़ा और पढ़ा। वैसे भी && उपलब्ध क्यों नहीं होगा? == और = उपलब्ध हैं (लेकिन अलग है और यह नहीं है, मुझे पता है)। इस सिंटैक्स को शामिल क्यों नहीं किया गया? व्यक्तिगत प्राथमिकता?
फिजियोथैमिकल

5
@ vgm64: निरर्थक सिंटैक्स को क्यों शामिल किया गया है जो किसी एक पहलू में सुधार नहीं करता है?
कोनराड रुडोल्फ

27
यह मुझे लगता है कि दुभाषिया को एक "क्रिप्टोकरेंसी: अवैध वाक्यविन्यास" का प्रिंट आउट लेने के बजाय यह पता लगाना चाहिए कि उपयोगकर्ता ने उपयोग किया है &&और उन्हें सुझाव दें कि वे andइसके बजाय कीवर्ड का उपयोग करना चाहते हैं । समान ++अन्य भाषाओं की तरह और अन्य आम ऑपरेटरों के लिए चला जाता है ।
आर्टऑफवर्फ

3
@physicsmichael "एक होना चाहिए, और अधिमानतः केवल एक, स्पष्ट तरीके से करना चाहिए।" import this
निक टी।

3
@KonradRudolph यह भाषा के पहलुओं को पूरी तरह से सुधारता है। यह उन लोगों के लिए अधिक सुसंगत और सहज है, जिन्होंने कभी किसी अन्य भाषा का उपयोग किया है। तथ्य यह है कि यह सवाल मौजूद है और इसमें उतना ही ट्रैफ़िक है जितना यह स्पष्ट रूप से इस मुद्दे को लोगों के लिए एक आम चिपके बिंदु के रूप में उजागर करता है।
jterm

जवाबों:


1468

आप andइसके बजाय चाहते हैं &&


2
मुझे इसके लिए क्या करना चाहिए: यदि x == 'n' और y == 'a' या y == 'b': <कुछ करें> क्या यह काम करेगा?! @ChristopheD
diffracteD

7
@diffracteD: का प्रयोग करें अगर आप मानक ऑपरेटर पूर्वता (जो तुम यहाँ के बारे में जानने कर सकते हैं: ओवरराइड करना चाहते कोष्ठकों ibiblio.org/g2swap/byteofpython/read/operator-precedence.html )
ChristopheD

3
मुझे यह पसंद है कि डेविड टिटेरेंको ने कट-एन-पेस्ट का उदाहरण दिया
एलेक्सक्स रोश

7
मैं दोनों टाइप करने के बाद यहां पहुंचा &&और मुझे ANDएक त्रुटि मिली (लोअरकेस शब्द के लिए अजगर से अपेक्षा नहीं थी and)।
Xeoncross

2
मुझे लगता है कि आपको उपयोग और देखना चाहिए: stackoverflow.com/questions/36921951/…
user1761806

229

अजगर का उपयोग करता है andऔर orसशर्त।

अर्थात

if foo == 'abc' and bar == 'bac' or zoo == '123':
  # do something

5
भूल मत कि अजगर भी नहीं है (अच्छी तरह से, और!)
inspectorG4dget

9
क्या आपका उदाहरण "(यदि यह और यह) या कि" या "यदि यह और (यह या वह)" का मूल्यांकन करता है?
जेफ

12
@Jeff आपका पहला तरीका। and से अधिक पूर्वता है or
ब्यूज

1
@ यह ऐसा लगता है कि "या" आपके द्वारा लिंक की गई तालिका में अधिक है
मैट

5
@ टेबल सबसे कम पूर्वता से उच्चतम तक जाती है। यदि आप बूलियन बीजगणित का अध्ययन कर चुके हैं, तो यह याद रखना आसान है; "या" जोड़ है और "और" गुणा है।
माइकल स्ट्राउड

48

मैं IF सशर्त में त्रुटि प्राप्त कर रहा हूं। मैं क्या गलत कर रहा हूं?

वहाँ कारण है कि आपको लगता SyntaxErrorहै कि &&पायथन में कोई ऑपरेटर नहीं है । इसी तरह ||और मान्य पायथन ऑपरेटर नहीं! हैं ।

कुछ संचालक जिन्हें आप अन्य भाषाओं से जानते हैं, उनमें पायथन में एक अलग नाम है। तार्किक ऑपरेटरों &&और ||वास्तव में कहा जाता है andऔर or। इसी तरह तार्किक निषेध ऑपरेटर !को कहा जाता है not

तो आप बस लिख सकते हैं:

if len(a) % 2 == 0 and len(b) % 2 == 0:

या और भी:

if not (len(a) % 2 or len(b) % 2):

कुछ अतिरिक्त जानकारी (जो काम में आ सकती है):

मैंने इस तालिका में ऑपरेटर "समकक्ष" को संक्षेप में प्रस्तुत किया है:

+------------------------------+---------------------+
|  Operator (other languages)  |  Operator (Python)  |
+==============================+=====================+
|              &&              |         and         |
+------------------------------+---------------------+
|              ||              |         or          |
+------------------------------+---------------------+
|              !               |         not         |
+------------------------------+---------------------+

पायथन प्रलेखन भी देखें : 6.11। बूलियन ऑपरेशन

तार्किक संचालकों के अलावा पायथन के पास बिटवाइज़ / बाइनरी ऑपरेटर भी हैं:

+--------------------+--------------------+
|  Logical operator  |  Bitwise operator  |
+====================+====================+
|        and         |         &          |
+--------------------+--------------------+
|         or         |         |          |
+--------------------+--------------------+

पाइथन में कोई बिटवाइज़ निगेटिव नहीं है (बस बिटवाइज़ उलटा ऑपरेटर है ~- लेकिन यह बराबर नहीं है not)।

6.6 भी देखें यूनिरी अंकगणित और बिटवाइज़ / बाइनरी ऑपरेशन और 6.7। बाइनरी अंकगणितीय संचालन

लॉजिकल ऑपरेटर्स (कई अन्य भाषाओं की तरह) में यह फायदा है कि ये शॉर्ट-सर्कुलेटेड होते हैं। इसका मतलब है कि यदि पहले ऑपरेंड पहले से ही परिणाम को परिभाषित करता है, तो दूसरे ऑपरेटर का मूल्यांकन बिल्कुल नहीं किया जाता है।

यह दिखाने के लिए मैं एक फ़ंक्शन का उपयोग करता हूं जो बस एक मूल्य लेता है, इसे प्रिंट करता है और इसे फिर से लौटाता है। यह देखना आसान है कि प्रिंट स्टेटमेंट के कारण वास्तव में क्या मूल्यांकन किया गया है:

>>> def print_and_return(value):
...     print(value)
...     return value

>>> res = print_and_return(False) and print_and_return(True)
False

जैसा कि आप देख सकते हैं कि केवल एक प्रिंट स्टेटमेंट निष्पादित किया जाता है, इसलिए पायथन वास्तव में सही ऑपरेंड पर भी नहीं दिखता है।

बाइनरी ऑपरेटरों के लिए यह मामला नहीं है। वे हमेशा दोनों ऑपरेंड का मूल्यांकन करते हैं:

>>> res = print_and_return(False) & print_and_return(True);
False
True

लेकिन अगर पहला ऑपरेंड पर्याप्त नहीं है, तो निश्चित रूप से, दूसरे ऑपरेटर का मूल्यांकन किया जाता है:

>>> res = print_and_return(True) and print_and_return(False);
True
False

इसे सारांशित करने के लिए यहां एक और तालिका दी गई है:

+-----------------+-------------------------+
|   Expression    |  Right side evaluated?  |
+=================+=========================+
| `True` and ...  |           Yes           |
+-----------------+-------------------------+
| `False` and ... |           No            |
+-----------------+-------------------------+
|  `True` or ...  |           No            |
+-----------------+-------------------------+
| `False` or ...  |           Yes           |
+-----------------+-------------------------+

Trueऔर Falseप्रतिनिधित्व करते हैं क्या bool(left-hand-side), वे होने की जरूरत नहीं है रिटर्न Trueया Falseवे सिर्फ वापस जाने के लिए की जरूरत है, Trueया Falseजब boolउन्हें (1) पर कहा जाता है।

तो Pseudo-Code (!) andऔर orफ़ंक्शंस इन जैसे काम करते हैं:

def and(expr1, expr2):
    left = evaluate(expr1)
    if bool(left):
        return evaluate(expr2)
    else:
        return left

def or(expr1, expr2):
    left = evaluate(expr1)
    if bool(left):
        return left
    else:
        return evaluate(expr2)

ध्यान दें कि यह छद्म कोड है न कि पायथन कोड। पाइथन में आप कॉल किए गए फ़ंक्शंस नहीं बना सकते andया orक्योंकि ये कीवर्ड हैं। इसके अलावा, आपको "मूल्यांकन" या कभी भी उपयोग नहीं करना चाहिए if bool(...)

अपने स्वयं के वर्गों के व्यवहार को अनुकूलित करना

इस अंतर्निहित boolकॉल का उपयोग यह अनुकूलित करने के लिए किया जा सकता है कि आपकी कक्षाएं कैसे व्यवहार करती हैं and, orऔर not

यह दिखाने के लिए कि यह कैसे अनुकूलित किया जा सकता है मैं इस वर्ग का उपयोग करता हूं जो फिर से printकुछ ट्रैक करता है कि क्या हो रहा है:

class Test(object):
    def __init__(self, value):
        self.value = value

    def __bool__(self):
        print('__bool__ called on {!r}'.format(self))
        return bool(self.value)

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return "{self.__class__.__name__}({self.value})".format(self=self)

तो आइए देखें कि इन ऑपरेटरों के साथ संयोजन में उस वर्ग के साथ क्या होता है:

>>> if Test(True) and Test(False):
...     pass
__bool__ called on Test(True)
__bool__ called on Test(False)

>>> if Test(False) or Test(False):
...     pass
__bool__ called on Test(False)
__bool__ called on Test(False)

>>> if not Test(True):
...     pass
__bool__ called on Test(True)

यदि आपके पास कोई __bool__विधि नहीं है, तो पायथन यह भी जाँचता है कि क्या वस्तु में कोई __len__विधि है और यदि यह शून्य से अधिक मान देता है। यदि आप एक अनुक्रम कंटेनर बनाते हैं, तो यह जानना उपयोगी हो सकता है।

4.1 भी देखें सत्य मूल्य परीक्षण

NumPy सरणियाँ और उपवर्ग

संभवतः मूल प्रश्न के दायरे से थोड़ा परे लेकिन अगर आप NumPy सरणियों या उपवर्गों (जैसे पंडास सीरीज या डेटाफ़्रेम) के साथ काम कर रहे हैं, तो अंतर्निहित boolकॉल खतरनाक हो जाएगी ValueError:

>>> import numpy as np
>>> arr = np.array([1,2,3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

>>> import pandas as pd
>>> s = pd.Series([1,2,3])
>>> bool(s)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> s and s
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

इन मामलों में आप NumPy से तार्किक और फ़ंक्शन का उपयोग कर सकते हैं जो एक तत्व-वार and(या or) करता है:

>>> np.logical_and(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([False, False,  True, False])
>>> np.logical_or(np.array([False,False,True,True]), np.array([True, False, True, False]))
array([ True, False,  True,  True])

यदि आप बूलियन सरणियों के साथ काम कर रहे हैं, तो आप भी बाइनरी ऑपरेटरों का उपयोग कर सकते हैं NumPy के साथ, ये तत्व-वार (लेकिन बाइनरी भी) तुलना करते हैं:

>>> np.array([False,False,True,True]) & np.array([True, False, True, False])
array([False, False,  True, False])
>>> np.array([False,False,True,True]) | np.array([True, False, True, False])
array([ True, False,  True,  True])

(1)

कि boolऑपरेंड पर कॉल को वापस लौटना है Trueया Falseपूरी तरह से सही नहीं है। यह सिर्फ पहला ऑपरेंड है जो इसे __bool__विधि में एक बूलियन वापस करने की आवश्यकता है :

class Test(object):
    def __init__(self, value):
        self.value = value

    def __bool__(self):
        return self.value

    __nonzero__ = __bool__  # Python 2 compatibility

    def __repr__(self):
        return "{self.__class__.__name__}({self.value})".format(self=self)

>>> x = Test(10) and Test(10)
TypeError: __bool__ should return bool, returned int
>>> x1 = Test(True) and Test(10)
>>> x2 = Test(False) and Test(10)

ऐसा इसलिए है क्योंकि andवास्तव में पहला ऑपरेंड वापस आता है अगर पहला ऑपरेंड मूल्यांकन करता है Falseऔर अगर यह मूल्यांकन करता है Trueतो यह दूसरा ऑपरेंड लौटाता है:

>>> x1
Test(10)
>>> x2
Test(False)

इसी तरह के लिए orलेकिन बस के आसपास अन्य तरीके:

>>> Test(True) or Test(10)
Test(True)
>>> Test(False) or Test(10)
Test(10)

हालांकि यदि आप उन्हें एक ifबयान में उपयोग करते हैं, तो परिणाम पर ifभी स्पष्ट रूप से कॉल करेगा bool। तो ये महीन बिंदु आपके लिए प्रासंगिक नहीं हो सकते हैं।


36

दो टिप्पणियाँ:

  • पायथन में तार्किक संचालन के लिए उपयोग andऔर or
  • 2 के बजाय इंडेंट करने के लिए 4 रिक्त स्थान का उपयोग करें। आप बाद में खुद को धन्यवाद देंगे क्योंकि आपका कोड सभी के कोड के समान ही दिखाई देगा। देखें पीईपी 8 अधिक जानकारी के लिए।

10

आप C, C ++ जैसे तार्किक कार्यों का उपयोग करते हैं andऔरor करते हैं। जैसा शाब्दिक andहै &&और orहै||


इस मजेदार उदाहरण पर एक नज़र डालें,

मान लीजिए कि आप पाइथन में लॉजिक गेट्स बनाना चाहते हैं:

def AND(a,b):
    return (a and b) #using and operator

def OR(a,b):
    return (a or b)  #using or operator

अब उन्हें कॉल करने का प्रयास करें:

print AND(False, False)
print OR(True, False)

यह आउटपुट होगा:

False
True

उम्मीद है की यह मदद करेगा!



5

संभवतः यह इस कार्य के लिए सबसे अच्छा कोड नहीं है, लेकिन काम कर रहा है -

def front_back(a, b):

 if len(a) % 2 == 0 and len(b) % 2 == 0:
    print a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):]

 elif len(a) % 2 == 1 and len(b) % 2 == 0:
    print a[:(len(a)/2)+1] + b[:(len(b)/2)] + a[(len(a)/2)+1:] + b[(len(b)/2):] 

 elif len(a) % 2 == 0 and len(b) % 2 == 1:
     print a[:(len(a)/2)] + b[:(len(b)/2)+1] + a[(len(a)/2):] + b[(len(b)/2)+1:] 

 else :
     print a[:(len(a)/2)+1] + b[:(len(b)/2)+1] + a[(len(a)/2)+1:] + b[(len(b)/2)+1:]

-3

एक एकल &(डबल नहीं &&) पर्याप्त है या जैसा कि शीर्ष उत्तर बताता है कि आप 'और' का उपयोग कर सकते हैं। पंडों में भी मैंने यही पाया

cities['Is wide and has saint name'] = (cities['Population'] > 1000000) 
& cities['City name'].apply(lambda name: name.startswith('San'))

यदि हम "और" को "और" से प्रतिस्थापित करते हैं, तो यह काम नहीं करेगा।


1
एकल और शॉर्ट-सर्किट की अभिव्यक्ति नहीं होगी (जिसका अर्थ है कि दोनों का मूल्यांकन पहली अभिव्यक्ति के वापसी मूल्य की परवाह किए बिना किया जाएगा)
user528025

-4

हो सकता है कि इसके साथ और इसके बजाय% अधिक तेज़ और मंटैन पठनीयता हो

अन्य परीक्षण भी / विषम

एक्स भी है? x% 2 == 0

x विषम है? x% 2 == 0 नहीं

शायद बिटवाइज़ और 1 के साथ अधिक स्पष्ट है

x विषम है? x & 1

एक्स भी है? x & 1 नहीं (विषम नहीं)

def front_back(a, b):
    # +++your code here+++
    if not len(a) & 1 and not len(b) & 1:
        return a[:(len(a)/2)] + b[:(len(b)/2)] + a[(len(a)/2):] + b[(len(b)/2):] 
    else:
        #todo! Not yet done. :P
    return

-4

सशर्त में "और" का उपयोग। मैं ज्यूपिटर नोटबुक में आयात करते समय अक्सर इसका उपयोग करता हूं:

def find_local_py_scripts():
    import os # does not cost if already imported
    for entry in os.scandir('.'):
        # find files ending with .py
        if entry.is_file() and entry.name.endswith(".py") :
            print("- ", entry.name)
find_local_py_scripts()

-  googlenet_custom_layers.py
-  GoogLeNet_Inception_v1.py

14
यह सवाल लगभग 7 साल पहले पूछा गया था और इसका जवाब दिया गया था। आपका उत्तर उन उत्तरों को क्या जोड़ता है जो पहले से ही यहाँ हैं? सामान्य तौर पर, जब तक आपके पास कहने के लिए कुछ नया नहीं होता है, आपको एक पुराने प्रश्न का नया उत्तर नहीं जोड़ना चाहिए - जहां पुराने को कई वर्षों के रूप में मापा जाता है - जब पहले से ही अच्छे उत्तर उपलब्ध हों।
जोनाथन लेफ़लर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.