삶의 공유
[Python]코딩 테스트 준비 (Python 문법(2)) 본문
문자열 자료형
- 문자열 변수를 초기화 할때는 큰 따옴표(")나 작은 따옴표(')를 이용한다.
- 문자열 안에 큰따옴표나 작은따옴표가 포함되어야 하는 경우가 있다.
1) 전체 문자열을 큰 따옴표로 구성하는 경우, 내부적으로 작은 따옴표를 포함할 수 있다.
2) 전체 문제열을 작은 따옴표로 구성하는 경우, 내부적으로 큰따옴표를 포함 할 수 있다.
3) 혹은 백슬래쉬(\)를 사용하면, 큰 따옴표나 작은 따옴표를 원하는 만큼 포함 시킬수 있다.
data = 'Hello World'
print(data) #Hello World
data = "Don't you know \"Python\"?"
print(data) #Don't you know "Python"?
- 문자열 변수에 덧셈(+)을 이용하면 문자열이 더해져서 연결된다.
- 문자열 변수를 특정한 양의 정수와 곱하는 경우, 문자열이 그 값만큼 여러번 더해진다.
- 문자열에 대해서도 마찬가지로 인덱싱과 슬라이싱을 이용할 수 있다.
※ 다만 문자열은 특정 인덱스의 값을 변경할 수는 없다.
a = 'Hello'
b = 'World'
print(a + " "+ b) #Hello World
a = "String"
print(a*3) #StringStringString
a = "ABCDEF"
print(a[2:4]) #CD
튜플 자료형
- 튜플 자료형은 리스트와 유사하지만 다음과 같은 문법적 차이가 있다.
1) 튜플은 한번 선언된 값을 변경할 수 없다.
2) 리스트는 대괄호([ ])를 이용하지만, 튜플은 소괄호(( ))를 이용한다.
- 튜플은 리스트에 비해 상대적으로 공간 효율적이다.
a = (1,2,3,4,5,6,7,8,9)
# 네 번째 원소만 출력
print(a[3]) # 4
# 두 번째 원소부터 네 번째 원소 까지
print(a[1:4]) #(2, 3, 4)
a[2] = 7 # Error : TypeError: 'tuple' object does not support item assignment
※ 튜플을 사용하면 좋은 경우
1) 서로 다른 성질의 데이터를 묶어서 관리해야할 때
- 최단 경로 알고리즘에서는 (비용, 노드번호)의 형태로 튜플 자료형을 자주 사용한다.
2) 데이터의 나열을 해싱(Hasing)의 키값을 사용해야 할때
- 튜플은 변경이 불가능 하므로 리스트와 다르게 키 값으로 사용 될 수 있다.
3) 리스트 보다 메모리를 효율적으로 사용해야 할 때
사전 자료형
- 사전 자료형은 키(Key)와 값(Value)의 쌍을 데이터로 가지는 자료형이다.
: 앞서 다루었던 리스트나 튜플이 값을 순차적으로 저장하는 것과는 대비 된다.
- 사전 자료형은 키와 값의 쌍을 데이터로 가지며, 원하는 '변경 불가능(Immutable)자료형'을 키로 사용할 수 있다.
- 파이썬의 사전 자료형은 해시 테이블(Hash Table)을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코낫'] = 'Coconut'
print(data) # {'사과': 'Apple', '바나나': 'Banana', '코코낫': 'Coconut'}
if '사과' in data:
print("'사과'를 키로 가지는 데이터가 존재 합니다.") #'사과'를 키로 가지는 데이터가 존재 합니다.
Key | Value |
사과 | Apple |
바나나 | Banana |
코코넛 | Coconut |
data = dict()
data['사과'] = 'Apple'
data['바나나'] = 'Banana'
data['코코낫'] = 'Coconut'
# 키 데이터만 담은 리스트
key_list = data.keys()
# 값 데이터만 담은 리스트
value_list = data.values()
print(key_list) # dict_keys(['사과', '바나나', '코코낫'])
print(value_list) # dict_values(['Apple', 'Banana', 'Coconut'])
# 각 키의 따른 값을 하나씩 출력
for key in key_list:
print(data[key])
# Apple
# Banana
# Coconut
집합 자료형
- 집합은 다음과 같은 특징이 있다
1) 중복을 허용하지 않는다
2) 순서가 없다
- 집합은 리스트 혹은 문자열을 이용해서 초기화 할 수 있다.
1) 이 때 set()함수를 이용한다
- 혹은 중괄호({ }) 안에 각 원소를 콤마(,) 를 기준으로 구분하여 삽입함으로써 초기화 할 수 있다.
- 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.
# 집합 자료형 초기화 방법 1
data = set([1,1,2,3,4,4,5])
print(data) # {1, 2, 3, 4, 5}, 중복된 항목 제거
#집햅 자료형 초기화 방법 2
data = {1,1,2,3,4,4,5}
print(data) # {1, 2, 3, 4, 5}, 중복된 항목 제거
- 집합 자료형의 연산
1) 합집합 : 집합 A에 속하거나, B에 속하는 원소로 이루어진 집합
2) 교집합 : 집합 A에도 속하고 B에도 속하는 원소로 이루어진 집합
3) 차집합 : 집합 A의 원소 중에서 B에 속하지 않는 원소로 이루어진 집합
a = set([1,2,3,4,5])
b = set([3,4,5,6,7])
# 합집합
print(a|b) # {1,2,3,4,6,7}
# 교집합
print(a&b) # {3, 4, 5}
# 차집합
print(a-b) # {1, 2}
data = set([1,2,3])
print(data) # {1, 2, 3}
# 새로운 원소 추가
data.add(4)
print(data) # {1, 2, 3}
# 새로운 원소 여러개 추가
data.update([5, 6])
print(data) # {1, 2, 3, 4, 5, 6}
# 특정한 값을 갖는 원소 삭제
data.remove(3)
print(data) {1, 2, 4, 5, 6}
사전 자료형과 집합 자료형의 특징
리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있다.
사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없다.
: 사전의 키(Key) 혹은 집합의 원소(Element)를 이용해 0(1)의 시간 복잡도로 조회 한다.
파이썬의 기본 입출력
1) 모든 프로그램은 적절한 (약속된) 입출력 양식을 가지고 있다.
2) 포르그램 동작의 첫 번째 단계는 데이터를 입력 받거나 생성하는 것이다.
예시) 학생의 성적 데이터가 주어지고, 이를 내림 차순으로 정렬한 결과를 출력하는 프로그램
- input() 함수는 한 줄의 문자열을 입력 받는 함수
- map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용 할 때 사용 한다.
예시) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용한다
- list(map(int, input().split()))
예시) 공백을 기준으로 구분된 데이터의 개수가 많지 않다면, 단순히 다음과 같이 사용한다
- a, b, c = map(int, input().split())
# 데이터의 개수 입력
n = int(input()) # 5
# 각 데이터를 공백을 기준으로 구분하여 입력
data = list(map(int, input().split())) # 65 90 75 34 99
data.sort(reverse=True)
print(data) #[99, 90, 75, 65, 34]
빠르게 입력 받기
- 사용자로부터 입력을 최대한 빠르게 받아야 하는 경우가 있다. 파이썬의 경우 sys라이브러리에 정의되어 있는 sys.stdin.readline()메서드를 이용한다.
단, 입력 후 엔터(Enter)가 줄 바꿈 기호가 되므로 rstrip() 메서드를 함께 사용한다.
import sys
# 문자열 입력 받기
data = sys.stdin.readline().rstrip()
print(data)
자주 사용 되는 표준 출력 방법
파이썬에서 기본 출력은 print() 함수를 이용한다.
- 각 변수를 콤마(,)를 이용하여 띄어쓰기로 구분하여 출력 할 수 있다.
print()는 기본적으로 출력 이후에 줄바꿈으로 수행한다.
- 줄 바꿈을 원치 않는 경우 'end'속성을 이용할 수 있다.
a = 1
b = 2
print(a, b)
print(7, end = " ")
print(8, end = " ")
# 출력할 변수
answer = 7
print("정답은 " + str(answer) + "입니다.")
# output :
# 1 2
# 7 8 정답은 7입니다.
f - string 예제
파이썬 3.6부터 사용 가능하며, 문자열 앞에 접두사 'f'를 붙여 사용한다.
중괄호 안에 변수명을 기입하여 간단히 문자열과 정수를 함께 넣을 수 있다
answer = 7
print(f"정답은 {answer} 입니다.") # 정답은 7 입니다.
조건문
- 조건문은 프로그램의 흐름을 제어하는 문법
- 조건문을 이용해 조건에 따라서 프로그램의 로직을 설정 할 수 있다.
x = 15
if x >= 10:
print("x >= 10")
if x >= 0:
print("x >= 0")
if x >= 30:
print("x >= 30")
# output:
# x >= 10
# x >= 0
파이썬에서는 코드의 블록(Block)을 들여쓰기로(indent)로 지정한다.
들여쓰기
- 탭을 사용하는 쪽과 공백 문자(space)를 여러번 사용하는 쪽으로 두 진영이 있다.
- 파이썬 스타일 가이드 라인에서는 4개의 공백 문자를 사용하는 것을 표준으로 설정하고 있다.
조건문의 기본적인 형태는 if ~ elif ~ else 이다.
- 조건문을 사용 할 때 elif혹은 else부분은 경우에 따라서 사용하지 않아도 된다.
if 조건문 1:
# 조건문 1이 True일때 실행되는 코드
elif 조건문 2:
# 조건문 1에 해당하지 않고, 조건문 2가 True일 때 실행 되는 코드
else:
# 위의 모든 조건문이 모두 True값이 아닐 때 실행 되는 코드
성적 구간에 따른 학점 출력 예제
score = 85
if score >= 90:
print("학점 : A")
elif score >= 80:
print("학점 : B")
elif score >= 70:
print("학점 : C")
else:
print("학점 : F")
# output :
# 학점 : B
if True or False:
print("Yes")
if True and False:
print("No")
# output :
# Yes
파이썬의 pass 키워드
아무것도 처리 하고 싶지 않을 때 pass 키워드를 사용한다
score = 85
if score >= 90:
pass
elif score >= 80:
print("학점 : B")
elif score >= 70:
print("학점 : C")
else:
print("학점 : F")
# output :
# 학점 : B
조건문에서 실행될 소스코드가 한 줄인 경우, 굳이 줄 바꿈을 하지 않아도 간략하게 표현할 수 있다.
score = 85
if score >= 90: result = "Sucess"
else : result = "Fail"
조건부 표현식은 if ~ else문을 한줄에 작성 할수 있도록 해준다.
score = 85
result= "Sucess" if score >= 80 else "Fail"
파이썬 조건문 내에서 부등식
- 다른 프로그래밍 언어와 다르게 파이썬은 조건문 안에서 수학의 부등식의 그대로 사용할 수 있다.
- 예를 들어 x > 0 and x < 20 과 0 < x < 20은 같은 결과를 반환한다.
반복문
- 특정한 소스코드를 반복적으로 실행하고자 할 때 사용하는 문법
- 파이썬 에서는 while문과 for문이 있는데, 어떤 것을 써도 관계는 없다.
1 ~ 9까지 모든 정수의 합 구하기 예제 (while문)
i = 1
result = 0
while i <= 9:
result += i
i += 1
print(result) # 45
1 ~ 9까지 홀수의 합 구하기 예제 (while문)
i = 1
result = 0
while i <= 9:
if i%2 == 1:
result += i
i += 1
print(result) # 25
무한 루프란 끊임 없이 반복 되는 반복 구문을 의미한다
- 코딩테스트에서 무한 루프를 구현할 일은 거의 없으니 유의해야 한다.
- 반복문을 작성한 뒤에는 항상 반복문을 탈출 할수 있는지 확인 한다.
반복문 : for문
for 변수 in 리스트:
실행할 소스코드
array = [9,8,7,6,5]
for x in array:
print(x) # 9 8 7 6 5
for문에서 연속적인 값을 차레대로 순회할 때는 range()를 주로 사용한다.
- 이때 range(시작 값, 끝 값 +1) 형태로 사용한다.
- 인자를 하나만 넣으면 자동으로 시작 값은 0이 된다.
1부터 30 까지 모든 정수의 합 구하기 (for문)
result = 0
for i in range(1, 31):
result += i
print(result) # 465
파이썬의 continue 키워드
- 반복문에서 남은 코드의 실행을 건너뛰고, 다음 반복을 진행하고자 할때 continue를 사용한다.
- 1부터 9까지의 홀수의 합을 구할 때 다음과 같이 작성할 수 있다.
result = 0
for i in range(1, 10):
if i % 2 == 0:
continue
result += i
print(result) # 25
파이썬의 break키워드
- 반복문을 즉시 탈출 하고자 할때 break를 사용한다.
- 1~5까지의 정수를 차례대로 출력하고자 할때 다음과 같이 작성할 수 있다.
i = 1
while True:
print("현재 i의 값 : ", i)
if i == 5:
break
i += 1
# output :
# 현재 i의 값 : 1
# 현재 i의 값 : 2
# 현재 i의 값 : 3
# 현재 i의 값 : 4
# 현재 i의 값 : 5
학생들의 합격 여부 판단 예제 (점수가 80점만 넘으면 합격)
scores = [90, 85, 77, 65, 97]
for i in range(5):
if scores[i] > 80:
print(i+1 , "번 학생은 합격 입니다.")
# output :
# 1 번 학생은 합격 입니다.
# 2 번 학생은 합격 입니다.
# 5 번 학생은 합격 입니다.
시험지를 훔쳐본 2,4번 학생 제외 후 합격 여부 판단하는 예제
scores = [90, 85, 77, 65, 97]
cheating_student_list = {2, 4}
for i in range(5):
if i + 1 in cheating_student_list:
continue
if scores[i] >= 80:
print(i+1 , "번 학생은 합격 입니다.")
# output :
# 1 번 학생은 합격 입니다.
# 5 번 학생은 합격 입니다.
중첩된 반복문 ※구구단
for i in range(2, 10):
for j in range(1,10):
print(i, "X",j, "=",i*j)
print()
# output :
# 2 X 1 = 2
# 2 X 2 = 4
# 2 X 3 = 6
# 2 X 4
*
*
*
# 9 X 6 = 54
# 9 X 7 = 63
# 9 X 8 = 72
# 9 X 9 = 81
함수와 람다 표현식
함수란특정한 작업을 하나의 단위로 묶어 놓은 것을 의미
함수를 사용하면 불필요한 소스코드와 반복을 줄일 수 있다.
- 내장 함수 : 파이썬이 기본적으로 제공한느 함수
- 사용자 정의 함수 : 개발자가 직접 정의하여 사용할 수 있는 함수
def 함수명(매개변수):
실행할 소스코드
return 반환 값
매개변수 : 함수 내부에서 사용할 변수
반환 값 : 함수에서 처리된 결과를 반환
def add(a,b):
return a + b
print(add(3,7)) # 10
파라미터의 변수를 직접 지정할 수 있다. 이 경우 매개변수의 순서가 달라도 상관이 없다.
def add(a,b):
print('함수의 결과 : ',a+b)
add(b=3, a=7) # 함수의 결과 : 10
global키워드로 변수를 지정하면 해당 함수에서는 지역 변수를 만들지 않고, 함수 바깥에 선언된 변수를 바로 참조하게 된다.
a = 0
def func():
global a
a += 1
for i in range(10):
func()
print(a) # 10
파이썬에서 함수는 여러개의 반환 값을 가질 수 있다.
def operator(a,b):
add_var = a+b
substract_var = a-b
multiply_var = a*b
divide_var = a/b
return add_var, substract_var, multiply_var, divide_var
a, b, c, d = operator(7,3)
print(a,b,c,d) # 10 4 21 2.3333333333333335
람다 표현식
- 람다 표현식을 이용하면 함수를 간단하게 작성할 수있다.
: 특정한 기능을 수행하는 함수를 한줄에 작성할 수 있다는 점이 특징이다
def add(a,b):
return a+b
# 일반적인 add()메서드 사용
print(add(3,7)) #10
# 람다 표현식으로 구현한 add()메서드
print((lambda a, b: a+b)(3,7)) #10
람다 표현식 예시
array = [('홍길동',50), ('이순신', 32),('아무개', 74)]
def my_key(x):
return x[1]
print(sorted(array, key=my_key)) # [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
print(sorted(array, key=lambda x:x[1])) # [('이순신', 32), ('홍길동', 50), ('아무개', 74)]
# key:정렬 기준
람다 표현식 예시 (여러개의 리스트에적용)
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10]
result = map(lambda a,b : a+b, list1, list2)
print(list(result)) #[7, 9, 11, 13, 15]
실전에서 유용한 표준 라이브러리
#sum()
result = sum([1,2,3,4,5])
print(result) # 15
#min(), man()
min_result = min(7,3,5,2)
max_result = max(7,3,5,2)
print(min_result, max_result) # 2 7
#eval()
result = eval("(3+5)*7") # 56
print(result)
#sorted()
result = sorted([9,1,8,5,4])
reverse_result = sorted([9,1,8,5,4], reverse=True)
print(result) # [1, 4, 5, 8, 9]
print(reverse_result) # [9, 8, 5, 4, 1]
#sorted() with key
array = [('홍길동',50), ('이순신', 32),('아무개', 74)]
result = sorted(array, key=lambda x : x[1], reverse=True)
print(result) # [('아무개', 74), ('홍길동', 50), ('이순신', 32)]
순열 : 서로 다른 n개에서 서로 다른 r개의 선택하여 일렬로 나열하는 것
- {'A', 'B', 'C'} 에서 두 개를 선택하여 나열하는 경우의 예제
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permutations(data, 3)) # 모든 순열 구하기
print(result) # [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
조합 : 서로 다른 n개에서 순서에 상광넚이 서로 다른 n개를 선택하는 것
- {'A', 'B', 'C'} 에서 순서를 고려하지 않고 두 개를 뽑는 경우의 예제
from itertools import combinations
data = ['A', 'B', 'C']
result = list(combinations(data, 2)) # 모든 조합 구하기
print(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]
중복 순열과 중복 조합
from itertools import product
data = ['A', 'B', 'C']
result = list(product(data, repeat=2)) # 2 개를 뽑는 모든 순열 구하기 (중복 허용)
print(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]
from itertools import combinations_with_replacement
data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2)) # 2 개를 뽑는 모든 조합 구하기 (중복 허용)
print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
Counter
파이썬 collections라이브러리의 Counter는 등장 횟수를 세는 기능을 제공한다.
리스트와 같은 반복 가능한 객체가 주어졌을때 내부의 원소가 몇번 씩 등작했는지를 알려준다
from collections import Counter
counter = Counter(['red', 'blue', 'green', 'red','blue','blue'])
print(counter['blue']) # 3, blue가 등장한 횟수 출력
print(dict(counter)) # 사전 자료형으로 반환 - {'red': 2, 'blue': 3, 'green': 1}
최대 공약수를 구해야 할때는 math. 라이브러리의 gcd() 함수를 이용할 수 있다.
import math
# 최소 공배수 (LCM)를 구하는 함수
def lcm(a,b):
return a*b // math.gcd(a,b)
a = 21
b = 14
print(math.gcd(21, 14)) # 최대 공약수 계산
print(lcm(21, 14)) # 최소 공배수 계산
'Data Scientist > Python' 카테고리의 다른 글
[금융] 파이썬이용하여 코스피 대장주 찾기 Project-1(코스피편) (0) | 2021.12.08 |
---|---|
[데이터수집] 한국 거래소 업종 분류 현황 및 개별 지표 크롤링 하기 (0) | 2021.10.27 |
Bigquery (구글 클라우드 플랫폼) (0) | 2021.08.16 |
[파이썬] 웹 크롤링 (미국소비자물가지수, investing.com) (0) | 2021.08.12 |
[Python]코딩 테스트 준비 (출제 경향 및 준비 방법, Python 문법(1)) (0) | 2021.01.19 |