Python 'or'과 '|' 동작 차이

HS L·2023년 3월 21일
1

내일배움캠프

목록 보기
9/73
post-custom-banner

문제

1. 'if문'과 'or', '|'

  • 강의 수강중 나머지를 활용한 값의 출력대신 값을 지정해서 해당이 된다면 출력을 해보고 싶었다. 'or' 과 '|' 의 확인을 위해 코드 작성중 원하는 값이 나오지 않음
  • 주민등록번호를 입력했을때 뒷자리의 첫번째 숫자가 1 또는 3이면 '남자'를 출력하고 그렇지 않으면 '여자'를 출력한다.

    순서대로 1,2,3,4의 값으로 if문이 실행될것이다.

2. 어제 못다한 while문 활용, 원하는 값이 나올때까지 반복하기

  • 원하는 값 나올때까지 while문 재실행
  • 다시 실행하고자 하는 while함수를 한번 더 씌워서 적용 가능함.
    hello_game(hk)

시도

1. if문 내용 작성

  • 여러가지 경우를 시도해봄
    1-1. if num == 1 or 3
    -> 결과는 남자4줄..

    1-2. if int(num) == 1 or 3
    -> 같은 남자 4줄

    1-3. if int(num) == 1 | 3
    -> 여자 여자 남자 여자(3의 값만 남자로 출력)

    1-4. if int(num) == 1 | int(num) == 3
    -> 여자 여자 남자 여자 (3의 값만 남자로 출력)

    1-5. if (int(num) == 1 | int(num) == 3)
    -> 여자 여자 남자 여자

    1-6. if int(num) == 1 or int(num) == 3 #( 해결1 )
    if (int(num) == 1) | (int(num) == 3) #( 해결2 )
    -> 남자 여자 남자 여자

해결

1. or 사용

  • num의 값이 문자열이기 때문에 값을 비교할 수 있도록 정수로 바꿔줘야함
  • or로 고쳐 썼을때 원하는 값이 나옴

+ 1-1~1-5까지 값이 다르게 나온 이유

  • 비트연산자'|'과 논리연산자'or'적용방식의 차이, 그리고 if의 내용이 True or False 여부에따라 진행되는 두가지가 복합적으로 적용이 됨
  • if구문의 실행여부를 bool(True or False)값에 따라 진행을 하게 되는데, 비교값을 정확하게 맞춰주지 않으면 컴퓨터 자체가 입력값의 bool(True or False)값을 가져와 돌리게 됨.
    (보통 값이 존재하면 True, 존재하지 않으면 False).
    * if구문은 True여야 적용이되고 여러 조건이 있을때 적어도 하나의 True가 있는 경우 전체를 True로 인식하게 됨
  • 'or'과 '|'적용방식
  1. 'or' - 문장을 읽는 것 처럼 or을 기준으로 끊어서 순서대로 적용
  2. '|' - 먼저 계산하고 적용 (수학에서 덧셈 곱셈 복합연산에서 곱셈을 한가지 덩어리를 보는 것처럼)
  • 여러 시도결과 문자열의 경우 'True', 정수의 경우 '값' 또는 'True or False'로 해석할 수 있다. (정수의 경우 두가지로 해석해볼 수 있다고 말한건 '값⊃boolean')
    (정수는 True, 0은 False가 나온다.
    cf) print(bool(1)) -> True)

바이너리 관련해서 공부를 더 해봐야 될 것 같다.
비트연산자
양수 음수 바이너리

1-1. if num == 1 or 3
- num의 값이 문자열이기 때문에 원하는 값 도출할 수 없음.
- 논리연산자 or을 사용, 때문에 ('num == 1) or (3)의 bool값 비교
- num의 값이 순서대로 1~4가 들어갈때마다 앞의 값은 바뀌더라도 뒤에 3은 언제나 True
- if 안에서 True값이 하나라도 있으면 True로 보기때문에 결과값은 전부 '남자'

1-2. if int(num) == 1 or 3
- 위와 동일한 이유로 전부 다 '남자'가 출력된다.

1-3. if int(num) == 1 | 3
- 비트연산자 |을 사용, 때문에 이 구문은 if int(num) == 3이 된다.
- num의 값이 순서대로 1~4가 들어가게 되면 3일때만 True
- 따라서 결과값은 '여자' '여자' '남자' '여자'(3의 값만 남자로 출력)

1-4. if int(num) == 1 | int(num) == 3
- 비트연산자 |을 사용, 때문에 |로 묶여진 것을 먼저 계한다.
- 이 구문 이해에서 좀 헤맸다. 적용되는 방식은 다음과 같다.
if int(num) == (1 | int(num)) == 3
num의값을 순서대로 1~4 대입시

    - num = 1일때
    if 1 == 1 == 3 -> False
    - num = 2일때
    if 2 == 2 == 3 -> False
    - num = 3일때
    if 3 == 3 == 3 -> True
    - num = 4일때
    if 4 == 4 == 3 -> False
    따라서 결과값은 '여자' '여자' '남자' '여자'가 나온다.

1-5. if (int(num) == 1 | int(num) == 3)
- 위와 같은 이유로 '여자' '여자' '남자' '여자'

1-6.1 if int(num) == 1 or int(num) == 3
- 논리연산자 or이기 때문에 순서대로 num 1~4 대입
- 1과 3이 들어갔을때 하나라도 True가 생겨서 '남자'출력, 2와 4가 들어갔을때 둘다 False기때문에 둘다 '여자' 출력

1-6.2if (int(num) == 1) | (int(num) == 3)
- 비트연산자 |을 사용했지만 앞과 뒤를 한 덩어리로 묶어줬기 때문에 1-4의 예시와는 다르게 의도한 결과를 출력할 수 있음.
- num이 1과 3일때 True존재로 '남자'로 출력
- 2와 4일때 False만 존재하기 때문에 '여자'로 출력된다.

알게된 점

  • 값을 비교하게 되는 경우 정확한 명령어 사용으로 맞춰주는게 중요하다.
    원하는건 하나의 결과지만 거기까지 도출해내기 위한 방법은 여러가지를 생각해볼 수 있기 때문에 간단한 문제더라도 여러가지를 시도해보는 것도 공부가 많이 될 것 같다.
  • 정해진 값대로 계산하는 프로그래밍언어에 대해서도 공부가 필요할 것 같다.
  • 코드의 동작원리에 대한 공부도 추후 내가 다시 그 코드를 썼을때 기억에 잘 남을 것 같다.
profile
식이
post-custom-banner

0개의 댓글