ProgramingTip

if- 문에서의 && (논리 -and)에 해당

bestdevel 2020. 9. 29. 08:14
반응형

if- 문에서의 && (논리 -and)에 해당


내 코드는 다음과 달라집니다.

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 조건부에서 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?


당신이 원하는 것 and대신에 &&.


사용 andor조건.

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

두 가지 의견 :

  • 사용 andor성능에서 논리 연산을 위해.
  • 2 대신 4 개의 공백을 사용하여 쓰기 쓰기. 귀하의 코드는 거의 모든 사람의 코드와 동일하게 보일 것이 때문에 나중에 감사 할 것입니다. 자세한 내용은 PEP 8 을 참조하십시오.

IF 조건부에서 오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

당신이 얻는 이유 SyntaxError그래서 때문입니다 &&. 검증 ||하고 !있는 유효 하지 연산자.

다른 언어에서 알 수있는 일부 연산자는 Python에서 다른 이름을 사용합니다. 논리 연산자 &&와는 ||실제로라고 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         |
+------------------------------+---------------------+

Python 문서 : 6.11 도 참조하십시오 . 부울 연산 .

논리 연산자 외에도 Python에는 비트 / 이진 연산자도 있습니다.

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

보시다시피 하나의 print 문만 실행 가능한 Python은 실제로 피 연산 문제 해결합니다.

이항 연산자는입니다. 항상 두 피 연산 튼튼 모두 평가합니다.

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

및는 반환 되는 내용 TrueFalse나타내며 또는 일 필요가 없으며 반환해야 우리 하거나 언제 호출 되는지 나타냅니다 (1).bool(left-hand-side)TrueFalseTrueFalsebool

따라서 Pseudo-Code (!)에서 andor함수는 다음과 같이 작동합니다.

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)

이것은 Python 코드가 아닌 의사 코드입니다. 에서는 호출되는 파이썬 함수를 만들 수 없습니다 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__메서드 가 없으면 Python은 객체에 __len__메서드 가 있는지, 0보다 큰 값을 반환하는지도 확인합니다. 시퀀스 컨테이너를 만드는 경우에 유용 할 수 있습니다.

4.1을 참조하십시오 . 진실 가치 테스트 .

NumPy 배열 및 하위 클래스

아마도 원래 질문의 범위를 약간 벗어나지 만 NumPy 배열 또는 하위 클래스 (Pandas Series 또는 DataFrames와 같은)를 다루는 경우 암시 적 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에서 요소 별 (또는 ) 을 수행하는 논리 및 함수사용할 수 있습니다 .andor

>>> 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됩니다. 따라서 이러한 세부 사항은 귀하와 관련이 없을 수 있습니다.


나는 순전히 수학적 해결책으로 갔다.

def front_back(a, b):
  return a[:(len(a)+1)//2]+b[:(len(b)+1)//2]+a[(len(a)+1)//2:]+b[(len(b)+1)//2:]

당신이 사용 and하고or C, C ++에서 같은 논리 연산을 수행 할 수 있습니다. 마찬가지로 그대로 and입니다 &&하고 or있다|| .


이 재미있는 예를 살펴보십시오.

Python으로 논리 게이트를 빌드한다고 가정 해 보겠습니다.

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

도움이 되었기를 바랍니다!


아마도 이것은이 작업에 가장 적합한 코드는 아니지만 작동하고 있습니다.

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

조건부에서 "and"사용. Jupyter Notebook에서 가져올 때 자주 사용합니다.

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

single &(double &&아님)이면 충분하거나 최상위 답변에서 'and'를 사용할 수 있습니다. 팬더에서도 이걸 찾았어요

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

"&"를 "and"로 바꾸면 작동하지 않습니다.


아마도 & 대신 %가 더 빠르고 가독성이 좋습니다.

다른 테스트 짝수 / 홀수

x는 짝수입니까? x % 2 == 0

x는 홀수입니까? x % 2 아님 == 0

아마도 비트와 1로 더 명확 할 것입니다.

x는 홀수입니까? x 및 1

x는 짝수입니까? 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

참고 URL : https://stackoverflow.com/questions/2485466/pythons-equivalent-of-logical-and-in-an-if-statement

반응형