

매년 프로그래밍 언어의 순위를 공개하는 기업인 티오베(TIOBE)의 지수를 보면 알 수 있듯, 파이썬은 현재 압도적인 1위를 차지하고 있는 언어다.
그 이유에는 인공지능(AI)와 데이터 사이언스(Data Science)의 부상과 더불어 TensorFlow, PyTorch 같은 핵심 AI 프레임워크들의 기본 언어가 파이썬이 됨에 있다. 또한 간결하고 명확한 문법, 다양한 라이브러리 지원, 낮은 진입장벽, 탁월한 가독성과 유지보수성 등의 이유가 있다.
AI 모델링을 위해 기본인 파이썬의 기본 명령어 부터 시작해 되돌아 보며 정리하고, 헷갈리는 부분을 되짚고자 한다.
print('Hello Python')
print("""반갑습니다""")
print("010","1234","5678", sep="-")
print("줄이 안 바뀜", end=" ")
print('''이어쓰기''')
# ✅ 출력 결과
# Hello Python
# 반갑습니다
# 010-1234-5678
# 줄이 안 바뀜 이어쓰기
', ", ''', """print(내용, sep=구분자, end=끝문자)파이썬은 변수 선언 시 자료형을 자동으로 인식한다.
_ 사용 가능a=1
a,type(a)
b=55.5
b,type(b)
# ✅ 출력 결과
# (1, <class 'int'>)
# (55.5, <class 'float'>)
참고: jupyter에서는
display를 제공해주는데,print()없이 그냥 입력해도 나온다.
c=True
d="A"
e="Python"
print(c,type(c))
print(d,type(d))
print(e,type(e))
# ✅ 출력 결과
# True <class 'bool'>
# A <class 'str'>
# Python <class 'str'>
lang="Java"
print(lang)
lang="Python"
print(lang)
# ✅ 출력 결과
# Java
# Python
title="HTML"
Title="CSS"
print(title,Title)
# ✅ 출력 결과
# HTML CSS
# 여러 변수 선언 가능 - tuple -> 파이썬은 tuple이 있어서 좋음
name, age, email="홍길동", 30, "honggildong@naver.com"
print(name, age, email)
print(type(name), type(age), type(email))
# ✅ 출력 결과
# 홍길동 30 honggildong@naver.com
# <class 'str'> <class 'int'> <class 'str'>
튜플(tuple)은 파이썬에서만 사용할 수 있는 기능으로, 이를 이용해 여러 변수를 동시에 선언할 수 있다.
# 2apple=2 # 첫글자는 문자 or _
# my$var=10 # 특수문자 포함 X
# print=2 # 예약어 사용 X
# my var=10 # 공백 X
x=10
y=22
print(x,type(x))
print(y,type(y))
# ✅ 출력 결과
# 10 <class 'int'>
# 22 <class 'int'>
bin_num=0b1010 # (1*2^3)+(0*2^2)+(1*2^1)+(0*2^0)
oct_num=0o12 # (1*8^1)+(2*8^0)
hex_num=0xA # A-10, B-11, ..., F-15
print(bin_num, type(bin))
print(oct_num, type(oct))
print(hex_num, type(hex))
# ✅ 출력 결과
# 10 <class 'int'>
# 10 <class 'int'>
# 10 <class 'int'>
- 2진수(binary, 0~1)
- bin=0b1010
- print(bin)
- 10 ← = 10
- 8진수(octal, 0~7)
- oct=0o12
- print(oct)
- 10 ← = 10
- 16진수(hexadecimal, 0~15, A-10, B-11, C-12, .., F-15)
- hex=0xA
- print(hex)
- 10 ← = 10
num=3.13
val=3.1415e2 # 3.1415 * 10^2
print(num,type(num))
print(val,type(val))
# ✅ 출력 결과
# 3.13 <class 'float'>
# 314.15 <class 'float'>
flag1=True
flag2=False
print(flag1,flag2)
# ✅ 출력 결과
# True False
a=10
b=3
print(a + b) # 덧셈 (10 + 3 = 13)
print(a - b) # 뺄셈 (10 - 3 = 7)
print(a * b) # 곱셈 (10 * 3 = 30)
print(a / b) # 나눗셈 (10 / 3 = 3.333...)
print(a // b) # 몫 (10 // 3 = 3)
print(a % b) # 나머지 (10 % 3 = 1)
print(a ** b) # 거듭제곱 (10 ** 3 = 1000)
x=10
y=20
print(x == y) # 같음 (False)
print(x != y) # 다름 (True)
print(x > y) # x가 y보다 큼 (False)
print(x < y) # x가 y보다 작음 (True)
print(x >= y) # x가 y보다 크거나 같음 (False)
print(x <= y) # x가 y보다 작거나 같음 (True)
두 값을 비교하여 true/false를 반환한다.
a=True
b=False
print(a and b) # AND (False)
print(a or b) # OR (True)
print(not a) # NOT (False)
boolean 값을 처리하고, 주로 조건문에서 사용된다.
조금 더 알아보자면 아래와 같다.
num=10
result1=num>0 and num<20 # 10>0 and 10<20 -> true and true -> true
result2=num==10 or num==20 # 10==10 or 10==20 -> true or false -> true
result3=num%2==0 # 10%2==0 -> 0==0 -> true
result4=not(num%2==0) # not(10%2==0) -> not(0==0) -> not(true) -> false
print(result1)
print(result2)
print(result3)
print(result4)
# ✅ 출력 결과
# True
# True
# True
# False
lst=[1, 2, 3, 4, 5] # list는 예약어 이므로 lst라고 써야함
print(3 in lst) # 3이 리스트에 있음 (True)
print(6 not in lst) # 6이 리스트에 없음 (True)
값이 시퀀스 자료형(리스트, 튜플, 문자열 등)에 포함되어 있는지 확인한다.
x=10 # 할당(대입) 연산자
# 복합 할당(대입) 연산자
x+=5 # x=x + 5
print(x) # 15
x-=3 # x=x - 3
print(x) # 12
x*=2 # x=x * 2
print(x) # 24
x/=4 # x=x / 4
print(x) # 6.0
a=[1, 2, 3]
b=a # b는 a와 같은 객체를 참조
print(a is b) # True
print(a is not b) # False
주소 비교 연산자: is와 is not을 사용하여 두 객체가 동일한 객체인지 비교한다.
x=10 # 1010 (2진수)
y=4 # 0100 (2진수)
print(x & y) # 비트 AND (0)
print(x | y) # 비트 OR (14)
print(x ^ y) # 비트 XOR (14)
print(~x) # 비트 NOT (~10 == -11)
# 비트 이동 연산
print(x << 1) # 왼쪽으로 1비트 이동 (10100 -> 20)
print(x >> 1) # 오른쪽으로 1비트 이동 (0010 -> 5)
비트 연산은 비트 단위(2진수)로 연산한다.
특히 비트 NOT의 경우, 보수의 개념을 잘 알아두는 것이 중요하다.
~x와 -(x+1)은 같다고 생각하면 편한데, 이에 대해 좀 더 알아보면 다음과 같다.
x=10 이를 2진수로 변환하면 0000 1010이다.
여기서 ~x와 같이 ~가 붙는다면, 비트를 모두 반전시켜 1111 0101이 된다.
0000 1010 -> 1111 0101
이 값은 2의 보수 방식에서 -11을 의미하는데, 2의 보수란 주어진 2진수에서 모든 비트를 반전시킨 후, +1을 하는 방식을 말한다.
좀 더 자세히 설명하면 다음과 같다.
나온 1111 0101은 2의 보수 형식에서 음수를 나타낸다.
(비트가 1로 시작한다면 그 값은 음수를 나타낸다.)
그리고 1111 0101을 2의 보수로 해석하려면, 2단계로 처리하는데,
1111 0101 -> 0000 1010
+1을 더한다.0000 1010 + 1 = 0000 1011
마지막으로 앞서 설명했듯이 원래 비트가 1로 시작했기 때문에, 이 값은 음수가 된다. 따라서, 최종적으로 -11이 나온다.
# 복소수 연산
z1=2 + 3j
z2=1 + 4j
print(z1 + z2) # (3 + 7j)
print(z1 * z2) # (-10+11j)
복소수 연산자
Q1. print() 함수 안에서 출력값들 사이에 구분자를 넣으려면 end를 사용해야 한다.
A1. X / sep 매개변수를 사용해야한다.
Q2. $tar라는 변수명은 선언 가능하다.
A2. X / 변수명에 특수문자를 사용할 수 없다.
Q3. x = 10일 때, x >> 1의 결과는 5이다.
A3. O / 1010 -> 0101 -> 5
Q4. a = 10과 b = 3일 때, a // b는 3이다.
A4. O / 몫을 반환
Q5. 2진수 0b1010과 8진수 0o12의 값은 동일하다.
A5. O
Q6. x = 5일때, x ^ 3의 결과는 6이다.
A6. O / ^는 XOR이므로 101 ^ 011 = 110 -> 6
Q7. z1 = 2 + 3j와 z2 = 1 + 4j일 때, z1 * z2는 (2+11j)이다.
A7. X / = 2+11j-12 = (-10+11j)