Search
📝

TIL 22/07/18 (월)

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
논리 연산자도 우선순위가 존재
notandor

논리 연산자의 단축 평가

결과가 확실한 경우 첫번째 값만 확인하고 반환
and 연산에서 첫번째 값이 False인 경우 무조건 False
or 연산에서 첫번째 값이 True인 경우 무조건 True
0False, 1True

컨테이너

여러 개의 값(데이터)를 담을 수 있는 것(객체)
서로 다른 자료형 저장이 가능
컨테이너의 분류
시퀀스형: 순서가 있는 데이터(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
keyvalues
어떤 형태든 상관없음

딕셔너리의 생성

중괄호({}) 또는 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, floatint: 단, 형식에 맞는 문자열만 정수로 변환 가능
# 문자열은 암시적 타입 변환이 되지 않음 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(참고), intfloat: 단, 형식에 맞는 문자열만 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, dictstr
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으로 준비하면서 기본적인 문법들은 자연스럽게 습득이 됐었지만, 이렇게 체계적으로 배우고 학습한 것은 처음이다.
사용 횟수가 적어 손에 덜 익은 셋 연산자나, 딕셔너리 같은 개념들을 다시 한번 다지고 갈 수 있어서 만족스럽다.
문자열에서 삼중 따옴표 기능을 앞으로 잘 써먹을 수 있을 것 같다.
그 전까지는 코드 문장이 길어져도 여러 줄로 나누지 못하고 쭉 이어서 작성했었다.
논리 연산자에 우선 순위가 있다라는 사실도 처음 알게 되었다.
앞으로 복잡한 논리 연산과 마주친다면 잘 써먹어 봐야겠다!