[인공지능사관학교] Python (2)

Suhyeon Lee·2025년 6월 10일

지난 시간 복습

ls1 = [10, 20, 30, 40]
tp1 = 10, 20, 30, 40
#  tp1 = (10,20,30,40) 이와 같이 선언해도 됨 
st1 = {10, 20, 30, 40}
print(type(ls1))
print(type(tp1))
print(type(st1))
print(ls1[0])
print(tp1[1])
print(st1[1])
  • list
    • []로 생성
    • 순서 있는 시퀀스 타입
      • 인덱싱, 슬라이싱 가능
    • 변경 가능(mutable)
      • 리스트 생성 후 요소 추가, 제거, 변경 가능
  • tuple
    • () 사용 또는 괄호 생략 가능
    • 요소 변경 불가(immutable)
    • 순서 있음 → 인덱싱, 슬라이싱 가능
  • set
    • {} 로 생성
      • set() 함수 사용해도 됨
    • 중복 허용 안 함
    • 순서 없음 → 인덱싱, 슬라이싱 불가능
    • 값을 직접 접근할 수 없음, 존재 여부는 확인 가능
  • dictionary
    • {} 로 생성
    • 키(key)와 값(value) 으로 이루어짐
      • 쌍 == couple
      • key: 변경할 수 없는 타입이어야 함 → '인덱스 역할'이니까
    • 순서 없음
특성listtuplesetdictionary
순서 유지유지유지XX
변경 가능성가능불가능가능값만 가능
중복 요소허용허용X키는 X, 값은 허용
접근 방법indexindex값 직접 접근 Xkey

연산자와 표현식

연산자(Operator)

  • 데이터를 처리하는 기호 또는 키워드
  • 피연산자(Operand): 연산자의 입력값

a=10a = 10

  • =: 연산자
  • a, 10: 피연산자
  • a = 10: 식
    • '식'에는 변수, 상수(들), 함수가 포함됨

산술 연산자

  • +: 덧셈
  • -: 뺄셈
  • *: 곱셈
  • /: 나눗셈
  • %: 나머지 → 정수 나누기
  • //: 몫 → 정수 나누기
  • **: 거듭제곱

예제

x = 5
y = 2
print(x**y) # 5^2 = 25

비교 연산자(관계 연산자) ★★★★★

  • ==: 두 값이 같으면 True
  • !=: 두 값이 다르면 True
  • >: 왼쪽 값이 크면 True
  • <: 오른쪽 값이 크면 True
  • >=: 왼쪽 값이 크거나 같으면 True
  • <=: 오른쪽 값이 크거나 같으면 True

예제

a = 10
b = 3
print(a>b) # 출력: True

논리 연산자

  • and: 둘 다 참이면 True
  • or: 하나라도 참이면 True
  • not: 참을 거짓으로, 거짓을 참으로 변환

진리표

예제

x = True
y = False 
print(x and y) # False
print(x or y) # True
print(not x) # False

할당 연산자(Assignment Operators)

  • 할당 연산자(Simple Assignment)
    • =(Assignment Operator): 값 할당 → 할당/대입 연산자
  • 복합 대입 연산자(Compound assignment operators): 연산과 할당을 합쳐놓은 것
    • +=(Addition Assignment): 더한 후 할당 (a+=5 → a=a+5)
    • -=(Subtraction Assignment): 뺀 후 할당
    • *=(Multiplication Assignment): 곱한 후 할당
    • /=(Division Assignment): 나눈 후 할당
    • %=(Remainder Assignment): 나머지를 구한 후 할당
    • **=(Exponent Assignment)
    • //=: 몫을 구한 후 할당

비트(bit) 연산자

  • &: AND
    • 두 비트가 모두 1이면 1
  • |: OR
    • 둘 중 하나라도 1이면 1
  • ^: XOR
    • 서로 다르면 1
  • ~: NOT
    • 비트 반전(보수연산)
  • <<: 왼쪽 시프트
    • 비트를 왼쪽으로 이동
  • >>: 오른쪽 시프트
    • 비트를 오른쪽으로 이동

예제

a = 5 # 101(2)
b = 3 # 011(2)
print(a&b) # 001(2) → 출력: 1
print(a|b) # 111(2) → 출력: 7
print(a^b) # 110(2) → 출력: 6
print(~a) # 출력: -6

When a is assigned the value 5, the expression ~a in Python calculates the bitwise NOT of a.
The bitwise NOT operator (~) inverts all the bits of the operand. In Python, integers are represented using two's complement. Therefore, the bitwise NOT of a number x is equivalent to -(x+1).
Given that a is 5, the binary representation of 5 is 00000101.
Applying the bitwise NOT (~) operation to 5:
→ Invert all bits: 11111010
→ Interpret the result as a two's complement number, which is equivalent to -(5+1) = -6.
Therefore, ~a evaluates to -6 when a is 5.

Bitwise NOT (~)

더 알아보기: 보수

  • 각 자리의 숫자의 합이 어느 일정한 수가 되게 하는 수
  • 보통 현재의 숫자에서 자릿수가 한 단계 올라가게 하기 위한 수

이해를 돕기 위해 10진수로 생각해보기
10진수에는 10의 보수와 9의 보수가 있음
10의 보수: 숫자의 합을 10의 제곱수로 만들어 주기 위해 더해야 하는 수
(각 자릿수의 값을 9에서 빼버리고 1을 더해서 얻을 수 있는 보수)
100(10)에 대한 10의 보수는 899+1 = 900
4(10)에 대한 10의 보수는 6 → 9-4+1
14(10)에 대한 10의 보수는 86 → 99-14+1
9의 보수: 숫자의 합을 '10의 제곱수-1'로 만들어 주기 위해 더해야 하는 수
(각 자릿수의 값을 9에서 빼버리고 얻을 수 있는 보수)
100(10)에 대한 9의 보수는 999-100 = 899
4(10)에 대한 9의 보수는 5 → 9-4
14(10)에 대한 9의 보수는 85 → 99-14

  • rr진법의 보수에서 NN에 대한 r1r-1의 보수는 최댓값N최댓값-N
    • 여기서 최대값은 해당 자릿수에서 가질 수 있는 최댓값
    • 1010(2)에 대한 1의 보수는 0101(2)
    • 1010(2)에 대한 2의 보수는 0110(2)
  • 2진법에서 1의 보수 구하기
    • 010의 1의 보수
      • 자릿수가 세 개이므로 111에서 010을 빼서 구함
    • 0010의 1의 보수
      • 자릿수가 네 개이므로 1111에서 0010을 빼서 구함
    • 간단하게 생각하면 1을 0으로 바꾸고 0을 1로 바꿔서 1의 보수를 구할 수 있음
  • 2진법에서 2의 보수 구하기
    • 1의 보수에다가 1을 더해주면 됨
    • 편하게 구하고 싶으면 뒤에서부터 처음 만나는 1까지는 그냥 적고 나머지는 0과 1을 반대로 적어주면 됨
      • 11010의 2의 보수를 구하는 경우 맨 뒤에서 처음 만나는 1까지(□□□10) 그냥 적고 나머지는 0과 1을 반대로 하면(00110) 완성: 00110(2)
  • 음수 표현하기 예시: 3비트
    • 최상위 비트는 부호를 나타냄
      • +3: 011 → 0은 +라는 부호를 나타내고 11은 3이라는 숫자를 나타냄
    • 음수로 표현하고자 한다면 양수 값에 해당하는 내용을 먼저 채워넣은 뒤 각각의 보수를 취하면 됨
1의 보수2의 보수
+3011011
+2010010
+1001001
+0000000
-0111000
-1110111
-2101110
-3100101

→ 1의 보수에서는 0이 두 개라는 단점이 존재

  • n비트로 정수 표현
    • 양수: 0 ~ 2n2^n-1
    • 정수: 2n1-2^{n-1} ~ 2n12^{n-1}-1
비트양수음수
80~255-128~127
160~65535-32768~32767
  • 연산하기
    • 2의 보수 더하기 연산(3비트)
    • 2의 보수 뺄셈
    • 1의 보수와 2의 보수 덧셈 비교

2의 보수

  • 10진수의 음수형
    • 컴퓨터는 뺄셈을 못하기 때문에 음수를 표현할 수 없음(0과 1뿐이니까) → 이 문제를 해결하기 위해 만든 것이 "2의 보수"
      • 컴퓨터는 가산, 즉 더하기밖에 몰라요:(
  • 1의 보수에서 더하기 1을 하면 된다.

10(10)

  • 2진수: 1010(2) → 4BIT / 00001010(2) → 8BIT
  • 1의 보수로 취한 값: 0101(2) / 11110101(2)
    • 1의 보수: 10진수의 숫자를 2진수로 변환한 후 1을 0으로, 0을 1로 바꾼 것. 정수형에만 사용 가능.
      • ~를 이용해서 바꿈
    • 하지만 0101(2)를 10진수로 표현하면 5고 11110101(2)는 245 아님?
      • 컴퓨터 입장에서는 아님…
    • 컴퓨터에서 가장 앞에 있는 비트는 부호비트(MSB)
      • 그럼 11110101(2)는 -117임? 아님… -11임…
  • 1의 보수로 바꾼 2진수에 1을 더하면: 11110110(2)
    • 이게 바로 컴퓨터가 인식하는 -10

기타 연산자

멤버 연산자

  • in: 특정 값이 리스트나 문자열에 포함되는지 확인
  • not in: 특정 값이 포함되지 않았는지 확인
print('a' in "apple") # True
print(5 in [1, 2, 3, 4]) # False

식별 연산자

  • is: 두 변수가 같은 객체인지 확인
  • is not: 두 변수가 다른 객체인지 확인
a = [1, 2, 3]
b = a
print(a is b) # True
print(a is not b) # False

cf.

a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # False
print(a is not b) # True

연산자 우선순위 ★★★

  1. 괄호: ()
  2. 거듭제곱: **
  3. 곱셈, 나눗셈, 몫, 나머지: *, /, //, %
  4. 덧셈, 뺄셈: +, -
  5. 비교 연산자: ==, !=, >, <, >=, <=
  6. 논리 연산자: not, and, or

실습 문제

  1. 두 개의 숫자를 입력(input)받아 사칙연산을 수행하세요. 그리고 그 결과를 출력하세요.
  2. x=10, y=3일 때 x가 y보다 크면 True를 출력하는 코드를 작성하세요.
  3. num=8일 때, num이 2의 배수인지 확인하여 True/False를 출력하는 코드를 작성하세요.
# 문제 1
a = int(input("첫 번째 숫자 입력:"))
b = int(input("두 번째 숫자 입력:"))
print(f"덧셈 결과: {a+b}")
print(f"뺄셈 결과: {a-b}")
print(f"곱셈 결과: {a*b}")
print(f"나눗셈 결과: {a/b}")

# 문제 2
x = 10
y = 3
print(x>y)

# 문제 3
num = 8
print(f"num은 2의 배수: {num%2 == 0}")
profile
2 B R 0 2 B

0개의 댓글