TIL (Today I Learned)
Why Python?
1.
알고리즘 코딩 테스트에 유리
•
C++이나 Java에 비해 코드가 짧고 직관적
•
특정 알고리즘 구현 시, 라이브러리 추가가 필요 없이 바로 소스코드 작성 가능
•
파이썬 기본 자료형이 제공하는 기능이 강력하여 별도의 라이브러리를 사용할 필요가 적음
2.
가장 많은 인기(Worldwide)
•
활용 분야가 점점 늘어나고 있음 (데이터 분석, AI 개발, 업무 자동화, 웹 개발 등)
Pyhon의 특징
1.
초심자가 배우기 쉬운 언어
•
문법이 다른 언어에 비해 간결하고, 타입을 선언할 필요도 없음.
2.
인터프리터(Interpreter) 언어
•
프로그래밍 언어를 기계어로 변환할 때 즉시 통역하듯이 1줄씩 변환
3.
객체 지향 프로그래밍 언어(Object Oriented Programming Language)
•
모든 것이 객체로 구현되어 있는 파이썬
변수 (Variable)
•
데이터를 저장하기 위해 사용
•
복잡한 값들을 쉽게 사용 가능 → 추상화
추상화(변수를 사용해야 하는 이유)
•
동일한 변수에 다른 데이터를 언제든 저장(할당) 가능
상수
변수의 할당
할당 연산자(=)를 통해 값을 할당(assignment)
같은 값을 동시에 할당도 가능
다른 값 동시에 할당 가능
각 변수의 값을 바꿔서 저장하기
임시 변수 활용
튜플 활용
식별자
•
변수 이름 규칙
◦
식별자 이름은 영문 알파벳, 언더스코어(_), 숫자로 구성
◦
첫 글자로 숫자 불가능
◦
길이 제한은 없고, 대소문자를 구별
산술 연산자 (Arithmetic Operator)
•
기본적인 사칙연산 및 수식 계산
◦
덧셈: +
◦
뺄셈: -
◦
곱셈: *
◦
나눗셈: /
◦
몫: //
◦
나머지: %
◦
거듭제곱: **
연산자 우선순위
•
기본적으로 수학에서의 우선순위와 동일
◦
괄호 → 곱하기 & 나누기 → 더하기 & 빼기
자료형 (Data Type)
•
프로그래밍에서 사용할 수 있는 데이터의 종류
자료형의 분류
•
수치형(Numeric)
◦
int: 정수(integer)
◦
float: 부동소수점 실수(floating point number)
◦
complex: 복소수(complex number)
•
문자열(String)
•
불린(Boolean)
•
None
수치형: 정수 자료형 (int)
•
정수를 표현하는 자료형
◦
0, 100, -200 등
◦
일반적인 수학 연산(사칙 연산) 가능
진수 표현
•
여러 진수 표현 가능
◦
2진수(binary): 0b
◦
8진수(octal): 0o
◦
16진수(hexadecimal): 0x
수치형: 실수 자료형 (float)
•
유리수와 무리수를 포함하는 실수를 표현하는 자료형
•
0.1, 1000.0, -0.001 등
실수 연산시 주의사항 (부동 소수점)
•
실수 값 처리 시 의도하지 않은 값이 나올 수 있음
print(3.2 - 3.1) # 0.0000000000000009
print(1.2 - 1.1) # 0.9999999999999987
Python
•
원인은 부동 소수점 때문
◦
컴퓨터는 2진수, 사람은 10진수를 사용
◦
10진수 0.1을 2진수로 표현하면 0.0001100110011001100110..같이 무한대로 반복
◦
무한대 숫자를 그대로 저장할 순 없어서 근사값으로 표현
▪
0.1의 경우 정확히 0.1로 표현이 불가능하고 그 근사값으로 표현하게 됨
→ Floating point rounding error
•
해결법
◦
실수값 비교 시에 항상 주의
매우 작은 수보다 작은지 확인하거나 math 모듈 활용
문자열 자료형 (String)
•
모든 문자는 str 타입
•
문자열은 작은따옴표('') 또는 큰따옴표("")를 통해 표기
PEP8에서는 소스코드 내 하나의 문장부호를 선택하여 유지하도록 함
중첩 따옴표
•
따옴표 안에 따옴표를 표현하는 경우
작은따옴표가 들어 있는 경우 큰따옴표로 문자열 생성
큰따옴표가 들어 있는 경우 작따옴표로 문자열 생성
삼중 따옴표 (Triple Quotes)
•
작은따옴표나 큰따옴표를 삼중으로 사용
따옴표 안에 따옴표를 넣을때, 여러 줄을 나눠 입력할 떄 편리
Escape sequence
•
역슬래시(backslash)뒤에 특정 문자가 와서 특수한 기능을 하는 문자 조합
◦
줄 바꿈: \n
◦
탭: \t
◦
캐리지 리턴: \r
◦
널(Null): \0
◦
\: \
◦
단일인용부호(’): \'
◦
이중인용부호(”): \''
사용 예시
문자열 연산
•
덧셈
문자열 덧셈은 문자열을 연결
•
곱셈
곱한 횟수 만큼 문자열을 반복 연결
String Interpolation (변수를 활용하여 문자열을 만드는 법)
%-formatting
str.format()
•
f-strings: python 3.6+
name = "Kim"
score = 4.5
print(f'Hello, {name}! 성적은 {score}') # Hello, Kim! 성적은 4.5
import datetime
today = datetime.datetime.now()
print(today) # 2022-07-18 16:28:15.200411
print(f'오늘은 {today:%y}년 {today:%m}월 {today:%d}일') # dhsmfdms 22년 07월 18일
pi = 3.141592
print(f'원주율은 {pi:.3}. 반지름이 2일 때 원의 넓이는 {pi*2*2}')
# 원주율은 3.14. 반지름이 2일떄 원의 넓이는 12.566368
Python
None
•
값이 없음을 표현
•
일반적으로 반환 값이 없는 함수에서 사용
불린형 (Boolean)
•
참과 거짓을 표현하는 논리 자료형
•
True 또는 False 값을 가짐
•
비교 / 논리 연산에 활용
비교 연산자
•
수학에서 등호와 부등호와 동일한 개념
•
주로 조건문에서 값을 비교할 때 사용
True / False 값을 리턴
비교 연산자의 종류
•
미만: <
•
이하: <=
•
초과: >
•
이상: >=
•
같음: ==
•
같지 않음: !=
•
객체 아이덴티티(OOP): is
•
객체 아이덴티티가 아닌 경우: is not
논리 연산자
•
여러 가지 조건이 있을 때
◦
AND: 모든 조건을 만족
◦
OR: 여러 조건 중 하나만 만족
•
일반적으로 비교연산자와 함께 사용
◦
A and B: A와 B 모두 True시, True
◦
A or B: A와 B 모두 False시, False
◦
Not: True를 False로, False를 True로
사용 예시
논리 연산자 주의사항
•
Falsy: False는 아니지만 False로 취급되는 다양한 값
◦
0, 0.0, (), [], {}, None, “”(빈 문자열)
◦
False로 취급되는 값 외엔 True
•
논리 연산자도 우선순위가 존재
not → and → or 순
논리 연산자의 단축 평가
•
결과가 확실한 경우 첫번째 값만 확인하고 반환
◦
and 연산에서 첫번째 값이 False인 경우 무조건 False
◦
or 연산에서 첫번째 값이 True인 경우 무조건 True
0은 False, 1은 True
컨테이너
•
여러 개의 값(데이터)를 담을 수 있는 것(객체)
◦
서로 다른 자료형 저장이 가능
•
컨테이너의 분류
◦
시퀀스형: 순서가 있는 데이터(Ordered)
▪
리스트
▪
튜플 : 불변형
▪
레인지 : 불변형
◦
비시퀀스형: 순서가 없는 데이터(Unordered)
▪
셋
▪
딕셔너리
리스트 (List)
•
여러 개의 값을 순서가 있는 구조로 저장하고 싶을 때 사용
•
생성 후 내용 변경 가능 → 가변형
리스트의 생성과 접근
list_a = []
list_b = [1, 2, 3]
list_c = ['Life', 'is', 'too', 'short']
list_d = [1, 2, 3, 'Python', ['리스트', '안에', '리스트']]
Python
•
대괄호([]) 또는 list()를 통해 생성
◦
어떠한 자료형도 저장 가능, 리스트 안에 리스트 저장도 가능
•
순서가 있는 시퀀스로 index를 통해 접근 가능
◦
index로 값에 대한 접근: list[i]
리스트의 생성과 접근 예시
리스트의 생성과 접근 Quiz
튜플 (Tuple)
•
여러 개의 값을 순서가 있는 구조로 저장하고 싶을 때 사용
◦
리스트와 차이점: 생성후 담고 있는 값 변경 불가 → 불변형
항상 소괄호 형태로 사용
튜플의 생성과 접근
•
소괄호(()) 또는 tuple()을 통해 생성
•
튜풀은 수정 불가능한(immutable) 시퀀스로 index를 통해 접근 가능
◦
index로 값에 대한 접근: tuple[i]
# 값 접근
a = (1, 2, 3, 1)
print(a[1]) # 2
# 값 변경 불가능
a[1] = '3' # TypeError: 'tuple' object does not support item assignment
Python
튜플 생성 시 주의사항
•
단일 항목의 경우
◦
반드시 값 뒤에 쉼표를 붙여서
•
복수 항목의 경우
◦
마지막 값 뒤에 쉼표는 없어도 되지만, 넣는 것을 권장
둥근 괄호를 사용해서 튜플 생성
둥근 괄호 없이 튜플 생성
튜플 대입 (Tuple assignmnet)
•
우변의 값을 좌변의 변수에 한번에 할당하는 과정
x, y = 1, 2
print(x, y) # 1, 2
# 실제로 tuple로 처리
x, y = (1, 2)
print(x, y) # 1, 2
Python
•
튜플은 일반적으로 파이썬 내부에서 활용
◦
함수 복수의 값을 반환할 때도 활용
레인지 (Range)
•
숫자의 시퀀스를 나타내기 위해 사용
print(range(4)) # range(0, 4)
# 담겨 있는 숫자를 확인하기 위해 리스트로 형변환
print(list(range(4)) # [0, 1, 2, 3)
print(type(range(4))) # <class 'range'>
Python
•
주로 반복문과 함께 사용됨
레인지의 사용 방법
기본형: range(n)
범위 지정: range(n, m) → n부터 m-1까지의 숫자 시퀀스
범위 및 스텝 지정: range(n, m, s) → n부터 m-1까지의 s만큼 증가시키는 숫자 시퀀스
슬라이싱 연산자
•
인덱스와 콜론을 사용하여 문자열의 특정 부분만 자르기 가능
•
콜론을 기준으로 앞 인덱스의 문자는 포함, 뒤 인덱스의 문자는 미포함
# 리스트([1:4]에서 1은 포함 4는 미포함)
print([1, 2, 3, 5][1:4]) # [2, 3, 5]
# 튜플
print((1, 2, 3)[:2]) # (1, 2)
# range
print(range(10)[5:8]) # range(5, 8)
# 문자열
print('abcd'[2:4]) # cd
# 즉정 간격으로 슬라이싱도 가능
print([1, 2, 3, 5][1:4:2]) # [2, 3]
print((1, 2, 3)[0:4:2]) # (1, 3)
print(range(10)[1:5:3]) # range(1, 5, 3)
print('abcdefg'[1:3:2]) # b
Python
문자열 슬라이싱 Quiz
셋 (Set)
•
중복되는 요소 없이, 순서에 상관없는 데이터들의 묶음
◦
중복되는 원소가 있다면 하나만 저장
◦
순서가 없어 인덱스로 접근 불가능
•
수학에서의 집합을 표현한 컨테이너
◦
집합 연산 가능(여집합을 표현하는 연산자는 별도로 존재 X)
◦
중복되는 값 존재 X
•
담겨 있는 요소 삽입, 변경, 삭제 가능 → 가변형
셋의 생성
중괄호({}) 또는 set()을 통해 생성
순서가 없어 별도의 값에 접근 불가능
셋 사용하기
•
다른 컨테이너에서 중복된 값을 쉽게 제거 가능
◦
단 그 이후 순서가 무시된다는 점을 감안 필요
주어진 리스트에서 고유한 지역의 개수는?
아래의 리스트에서 고유한 지역을 등장한 순서대로 출력하시오.
셋 연산자
•
합집합: |
•
교집합: &
•
차집합: -
•
대칭차집합: ^ → 교집합 영역을 제외한 전부
A_set = {1, 2, 3, 4}
B_set = {1, 2, 3, "Hello", (1, 2, 3)}
print(A_Set | B_set) # {1, 2, 3, 4, (1, 2, 3), 'Hello'}
print(A_Set & B_set) # {1, 2, 3}
print(B_Set - A_set) # {(1, 2, 3), 'Hello'}
print(A_Set ^ B_set) # {'Hello', 4, (1, 2, 3)}
Python
딕셔너리 (Dictionary)
•
key-value 쌍으로 이루어진 자료형(3.7부터는 ordered, 이하는 unordered)
•
딕셔너리의 key
◦
key는 변경 불가능한 데이터만 활용 가능
▪
string, integer, float, boolean, tuple, range
•
각 key의 values
◦
어떤 형태든 상관없음
딕셔너리의 생성
•
중괄호({}) 또는 dict()을 통해 생성
•
key를 통해 value에 접근
dict_a = {}
print(type(dict_a)) # <class 'dict'>
dict_b = dict()
print(type(dict_b)) # <class 'dict'>
dict_a = {'a': 'apple', 'b': 'banana', 'list': [1, 2, 3]}
print(dict_a) # {'a': 'apple', 'b': 'banana', 'list': [1, 2, 3]}
print(dict_a['list]) # [1, 2, 3]
dict_b = dict(a='apple', b='banana', list=[1, 2, 3])
print(dict_b) # {'a': 'apple', 'b': 'banana', 'list': [1, 2, 3]}
Python
형 변환 (Typecasting)
•
파이썬에서 데이터 형태는 서로 변환 가능
•
암시적 형 변환(Implicit)
◦
사용자가 의도하지 않고, 파이썬 내부적으로 자료형을 변환하는 경우
•
명시적 형 변환(Explicit)
◦
사용자가 특정 함수를 활용하여 의도적으로 자료형을 변환하는 경우
암시적 형 변환
•
bool
print(True + 3) # 4
Python
•
Numeric type (int, float)
print(3 + 5.0) # 8.0
Python
명시적 형 변환
•
int
◦
str, float → int: 단, 형식에 맞는 문자열만 정수로 변환 가능
# 문자열은 암시적 타입 변환이 되지 않음
print('3' + 4) # TypeError: can only concatenate str (not "int") to str
# 명시적 타입 변환이 필요
print(int('3') + 4 # 7
# 정수 형식이 아닌 경우 타입 변환 불가능
print(int('3.5') + 5) # ValueError: invalid literal for int() with base 10: '3.5'
Python
•
float
◦
str(참고), int → float: 단, 형식에 맞는 문자열만 float로 변환 가능
print('3.5' + 3.5) # TypeError: can only concatenate str (not "float") to str
# 정수 형식인 경우에도 float로 타입 변환
print(float('3')) # 3.0
# float 형식이 아닌 경우 타입 변환 불가능
print(float('3/4') + 5.3) # ValueError: could not convert string to float: '3/4'
Python
•
str
◦
int, float, list, tuple, dict → str
print(str(1)) # 1
print(str(1.0)) # 1.0
print(str([1, 2, 3])) # [1, 2, 3]
print(str((1, 2, 3))) # (1, 2, 3)
print(str({1, 2, 3})) # {1, 2, 3}
Python
컨테이너 간의 형 변환
string | list | tuple | range | set | dictionary | |
string | O | O | X | O | X | |
list | O | O | X | O | X | |
tuple | O | O | X | O | X | |
range | O | O | O | O | X | |
set | O | O | O | X | X | |
dictionary | O | O
(only key) | O
(only key) | X | O
(only key) |
WIF (What I Felt)
•
Python 인트로부터 시작해서
변수, 연산자, 자료형, 컨테이너, 슬라이싱, 형변환까지 다양한 개념들을 학습했다.
•
코딩 테스트를 Python으로 준비하면서 기본적인 문법들은 자연스럽게 습득이 됐었지만,
이렇게 체계적으로 배우고 학습한 것은 처음이다.
•
사용 횟수가 적어 손에 덜 익은 셋 연산자나, 딕셔너리 같은 개념들을 다시 한번 다지고 갈 수 있어서 만족스럽다.
•
문자열에서 삼중 따옴표 기능을 앞으로 잘 써먹을 수 있을 것 같다.
◦
그 전까지는 코드 문장이 길어져도 여러 줄로 나누지 못하고 쭉 이어서 작성했었다.
•
논리 연산자에 우선 순위가 있다라는 사실도 처음 알게 되었다.
◦
앞으로 복잡한 논리 연산과 마주친다면 잘 써먹어 봐야겠다!