Python(파이썬) 문법
1. 자료형
(1) 수 자료형(Number)
1) 정수형(Integer)
정수형은 정수를 다루는 자료형이다.
int(숫자) #실수를 정수로 변환, int 함수의 첫번째 파라미터는 문자열 또는 숫자 형식이어야 한다.
단, 두번째 파라미터를 입력하려는 경우 첫번째 파라미터는 문자열 형식이어야 한다.
따라서 int(a, b) 입력하려는 경우 a = str(숫자)로 문자열로 만들어줘야 한다.
int(x, base) 함수는 진법 변환을 지원하여, 진법변환시 유용하다.
'int'는 어떤 수와 비교해도 가장 큰 수로 인식된다.
min_val = float('inf')
min_val > 10000000000 #True
2) 실수형(Real Number)
실수형은 소수점 아래의 데이터를 포함하는 자료형이다.
float(숫자) #정수를 실수로 변환
실수형 데이터를 지수표현방식으로 나타낼 수 있다.
유효숫자e숫자 #유효숫자*10^숫자
컴퓨터에서 실수=부동소수점(floating point) 이므로 0.3 + 0.6이 0.9가 아닐 수 있다. 이럴 때 round 함수 활용하면 좋다.
round(숫자1, 숫자2) #숫자1을 숫자2자리에서 반올림한다.
cf) 복소수=complex number -> ex 3+4j
3) 연산
사칙연산은 + - * / 을 이용하여 계산한다.
거듭제곱은 ** 을 이용하며, 몫과 나머지는 // % 를 이용한다.
=은 대입(assignment)을 의미하며, 왼쪽 변수에 오른쪽 값 저장한다.
복합대입연산자는 += -= *= /= 이며,
비교연산자는 < > <= >= == != 이다. ==은 같다는 의미, !=는 같지 않다는 것을 의미한다.
4) 연산을 활용한 자연수 각 자릿수 합 구하기 문제 풀이
5) 평균값 구하기 문제 풀이
6) 정수의 약수 더하는 문제 풀이
(2) 리스트(List) 자료형
1) 선언
리스트는 여러 개의 데이터를 연속적으로 담아 처리하기 위해 사용 할 수 있다. 배열 또는 테이블이라고도 부른다.
리스트는 대괄호 []에 원소를 넣어 초기화하며 쉼표 , 로 원소를 구분한다.
리스트의 원소에 접근할 때는 인덱스(index)값을 대괄호 안에 넣으면 된다. 이때 인덱스는 0부터 시작한다.
빈 리스트 선언할 경우에는 list() 또는 [] 를 이용할 수 있다.
특정 범위 숫자 리스트 만들 경우는 list1=list(range(숫자))를 이용한다.
ex) 리스트 선언
a = []
b = [1, 3, 5]
print(b[2]) #b의 세번째 원소에 접근
c = [0] * n #크기가 n이고 값이 0인 리스트 초기화
2) 인덱싱(Indexing)과 슬라이싱(Slicing)
인덱스값을 입력하여 리스트의 특정 원소에 접근하는 것을 인덱싱이라고 한다. 인덱스값은 양의 정수와 음의 정수 모두 사용할 수 있으며, 음의 정수 넣으면 원소를 거꾸로 탐색하게 된다.
ex) 인덱싱
a = [1, 3, 5]
print(a[0]) #a의 첫번째 원소에 접근
print(a[-1]) #a의 뒤에서 첫번째 원소에 접근
리스트에서 연속적인 위치를 갖는 원소를 가져와야 할 때는 슬라이싱을 이용할 수 있다.
list[start:stop:step] -> start위치에서 stop-1위치까지 step만큼 건너뛰어 가져오는 것을 의미한다. start가 stop보다 작을 필요없고, 이 경우 step이 음수면 된다.
전부다 가져오려면 list[ : ]를 이용하면 된다.
2차원 리스트 슬라이싱할 경우에는 list[리스트의 인덱스값][출력할 요소의 범위] 로 하면 된다.
ex)
a=[1,2,[‘a’,’b’],3]; a[2][:1] == [‘a’,‘b’]
3) List Comprehension
리스트 컴프리헨션은 리스트 초기화 방법 중 하나이며 간편하게 코드작성하는데 도움이 된다.
ex1)
list1 = [ i*i for i in range(1,11) ]
ex2)
list2 = [ i for i in range(1,11) if i % 2 == 0 ]
ex3)
list3 = [ ( x, y ) for x in range(15) for y in range(15) ]
ex4) 리스트에서 짝수면 제곱하고 홀수면 무시하기
mylist = [3, 2, 6, 7] #주어진 리스트
answer = [i**2 for i in mylist if i %2 == 0]
ex5)
list5 = [i+j for i in range(10) for j in range(10)] #이중반복문 쓴 것이지만 결과물은 1차원 리스트
2차원 리스트 초기화할때 효과적이다.
n = 3; m = 4
list1 = [ [0] * m for _ in range(n) ]
print(list1) == [ [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0] ]
cf) 언더바(_)의 역할
언더바는 반복을 수행하되 반복을 위한 변수 값을 무시하고자 할 때 사용된다.
ex)
for _ in range(5):
print('Hello World') #'Hello World' 가 5번 출력된다.
4) 기타 메서드(Method)
변수명.append(원소) #리스트 맨 뒤에 원소 하나 삽입, 두 개 이상 삽입 원하면 () or [] 더 사용하여 중첩 가능
변수명.sort() #오름차순으로 정렬, 리스트 그대로 갖고싶을때는 .sort()보다 list2 = sorted(list1)사용, key 활용 가능
변수명.sort(reverse = True) #내림차순으로 정렬
변수명.reverse() #리스트 원소의 순서를 모두 뒤집어 놓는다.
변수명.insert(인덱스, 원소) #해당 인덱스 위치에 원소를 삽입한다.
변수명.count(특정 원소) #리스트 내에 특정 원소의 갯수를 센다. 문자열만 셀 수 있다!!
변수명.remove(특정 원소) #특정 원소를 제거한다. 여러 개이면 하나만 제거한다.
del 변수명[인덱스] #해당 인덱스 위치 원소 삭제
del 변수명[start:stop] #해당 범위 원소 삭제
변수명.index(원소) #해당 원소의 인덱스를 알려준다.
변수명.extend([변수명2]) #리스트끼리 더해진다.
enumerate(변수명) #리스트의 순서와 값 전달기능 ex) for index, value in enumerate(변수명):
len(변수명) #리스트의 길이를 알려준다.
cf) reverse, insert, count, remove는 시간복잡도 O(N)이므로 사용주의
- 문자로 이루어진 리스트를 숫자형으로 만들기
list(map(int, n))
(3) 문자열(String) 자료형
1) 선언
문자열은 컴퓨터가 이해할 수 없으므로, 문자열 변수를 초기화할 때는 큰따옴표 또는 작은따옴표를 사용한다.
date = 'Hello World'
문자열은 연산불가하며, +하면 단순히 이어붙어서 나오게 된다.
따옴표 3개 사용하면 string에서 줄바꿈 큰따옴표 작은따옴표 같이 쓸수있다.
ex)
a = '''
"강아지가"
'왈왈'
'짓다
'''
리스트와 문자열은 유사한 부분이 있다.
문자열='Hello World'
문자열[0]='H'
'H' in 문자열 -> True
list1 = 문자열.split() #문자열을 리스트로 변환, 괄호 안에 뭘 넣느냐에 따라 무엇을 기준으로 리스트 만들지 결정
" ".join(list) #리스트에서 문자열로 변환, join을 안쓰면 반복문에서 +를 통해 만들어야 함. 따옴표 안에 뭘 넣느냐에 따라 무엇으로 연결할지 결정
split 이나 join 쓸 때 주의할 점은 변수로 받기!!
ex) k = a.split()으로 받기
2) 메서드
ord() 함수 #하나의 유니코드 문자(알파벳이나 한글)이 들어오면 이에 대응하는 숫자를 반환한다. 이를 이용하여 문자를 정수형으로 변환할때 사용한다. int(ord(문자) - int(ord('a' 또는 '가')) + 1
chr() 함수 #숫자에서 아스키 코드로 변환할 때 사용한다. ord의 역함수 느낌이다.
ljust(), center(), rjust()
ex)
s = 'abc'
n = 7 #문자열 길이
s.ljust(n) #좌측 정렬
s.center(n) #중앙정렬
s.rjust(n) #우측정렬
출력시 'abc'
'abc'
'abc' 로 나온다.
문자열.upper() #대문자로 변환
문자열.lower() #소문자로 변환
문자열.swapcase() #대소문자 변환
문자열.title() #앞글자만 대문자로 변환
문자열.strip(x) #문자열 좌우 x 삭제 ex)x가 공백일때, ' 강아지 ' -> '강아지' ex2)x가 =일때, '=강아지=' -> '강아지'
문자열.lstrip() #문자열 왼쪽 공백 삭제
문자열.rstrip() #문자열 오른쪽 공백 삭제
문자열.isspace() #문자열이 공백이면 True 반환
문자열.isalpha() #문자열이 알파벳만 있는지 검사(공백 또는 숫자 있으면 False)
(4) 튜플(Tuple) 자료형
튜플 자료형은 리스트와 거의 비슷한데, 한번 선언된 값을 수정할 수 없다는 특징이 있다.
튜플 선언은 tuple1=(1,2,3); tuple2=1,2,3; list3=[1,2,3]; tuple3=tuple(list3) 과 같이 다양하게 가능하다.
tuple1[0] #첫번째 자리 원소를 의미, 리스트와 같이 index활용가능하다.
ex1)
a , b = 1 , 2 #튜플 선언
b, a = a, b #두 변수의 값 바꾸기(swap)
ex2)
x=1; y=2; z= x , y; print(z) #(1, 2) 가 출력된다.
ex3)
c = 3, 4 #packing
d, e = c #unpacking, d -> 3 e -> 4
ex4)
for k in enumerate(list):
print('{}의 가격은 {}원'.format(k[0],k[1]) #k가 튜플이므로 가능하다.
for k in dict.items(): #여기도 k가 튜플이다.
print('{}은 {}'.format(*k)) #결과는 위와 동일하다.
(5) 사전(Dictionary) 자료형
1) 선언
사전 자료형은 키(key)와 값(value)의 쌍을 데이터로 가지는 자료형이다. 선언시에는 중괄호 {}를 사용한다
dict1 = {'이름표1' : 값1, '이름표2' : 값2} #선언시에는 중괄호 {}를 사용하며, 이름표와 값 사이는 : 사용한다.
print(dict1[이름표1]) #값1이 출력된다.
2) 수정, 추가, 메서드 등
dict1[이름표1] = 수정값 또는 추가값 #리스트와 달리 append 안써도 된다.
del(dict1[이름표1]) #이름표1에 있는 값 삭제한다.
dict1.clear() #전부 삭제한다.
dict1.update(dict2) #사전끼리 더하기
원소 in 사전 #사전 자료형에 특정 원소 있는지 검사할 때 사용한다.
이름표 in dict.keys()
값 in dict.values()
cf) 순차적인 정보를 담는 자료형을 iterable 자료형이라 한다. 리스트, 문자열, 튜플, 사전이 이에 속한다.
iterable 자료형은 in 문법 사용 가능하다.
3) 반복문
사전 자료형 반복문은 순서와 상관없이 for문 실행한다. 리스트와의 차이점이다.
이름표 = keys() #키 데이터만을 뽑아서 리스트로 이용
값 = values() #값 데이터만을 뽑아서 리스트로 이용
Items() #이름표와 값 둘다 가진다. list에서의 enumerate 와 기능 동일
ex)
for key in dict1.keys():
print(key)
for value in dict1.values():
print(value)
for key, value in dict1.items():
print(key, value)
2차원 사전의 경우
ex)
dict2 = {'이름표1 : {'이름표2' : 값1}}
for name name2 in dict2.items():
for name3 value in name2.items():
4) Dictionary Comprehension
ex1) 리스트1개를 딕셔너리로
students = [값1,값2,...]
dict1 = { "{}번".format(number):name for number, name in enumerate(students) }
ex2) 리스트2개를 딕셔너리로
x = [값들1]
y = [값들2]
dict2 = dict(zip(x,y)) #zip 활용하기
(6) 집합(Set) 자료형
집합은 리스트 또는 문자열을 이용해서 만들 수 있다. 중복을 허용하지 않으며 순서가 없다는 특징이 있다.
따라서 리스트에 중복되는 값 제거할 때 유용하다.
선언은 set를 이용하거나 중괄호 이용한다. (딕셔너리와의 차이점은 딕셔너리는 키-값 형태라는 점)
ex)
list1 = [ 값1,값2,값1,…]
My_set = set(list1) #리스트를 집합으로 변환
Final_list = list(My_set) #집합을 리스트로 변환
|은 합집합, 교집합은 & 차집합은 - 를 이용한다.
변수명.add(원소) #집합에 데이터 값 추가
변수명.update(변수명2 또는 [원소1, 원소2]) #여러 개의 값 한번에 추가
변수명.remove(원소) #원소 삭제
2. 조건문
(1) if 조건문
if 조건문1:
조건문1이 True일 때 실행되는 코드
elif 조건문2:
조건문1가 False, 조건문2가 True일 때 실행되는 코드
else:
조건문1,2가 False일 때 실행되는 코드
(2) 논리연산자(and, or, not)
단락평가란 논리연산에서 코드의 앞만 보고 값을 정할 수 있는 경우에는 뒤는 보지 않고 값을 결정하는 것을 말한다.
숫자 0, None을 제외한 모든 수는 True
빈 리스트, 빈 딕셔너리를 제외한 모든 것은 True
ex1)
A and B #A가 False이면 A만 나옴
ex2)
A or B #A가 False이면 B만 나옴/ A가 True이면 A만
ex3)
a=1 or 10 #a=1
ex4)
b=0 or 10 #b=10
(3) 기타 연산자
x in 리스트 #리스트 내에 x가 들어가 있을때 True
x not in 리스트 #리스트 내에 x가 들어가 있지 않을때 True
pass #일단 조건문 형태만 만들고 아무것도 처리하고 싶지 않을때 사용
(4) 조건문 내에서의 부등식
파이썬에서는 x>0 and x<20 과 0<x<20 이 같은 결과를 반환한다. 다만, 혼동염려를 위해 연산자 들어가는 형태로 하자.
3. 반복문
(1) while문
while문은 조건문이 참인 경우에 한하여 반복적으로 코드가 실행된다. 조건문 설정에 따라 무한루프가 생길 수도 있으니 주의해야 한다.
ex)
while i < 10:
result += i
if 와 while 차이는 if는 한번만 실행하지만, while은 조건식 만족하는한 계속 실행한다.
for와 while 차이는 상황에 따라 사용한다.
(2) for문
for - in 반복문은 in 뒤에 오는 데이터에 포함되어 있는 모든 원소를 순서대로 하나씩 in 앞에 있는 변수에 넣어가면서 블럭을 실행한다.
range 함수는 일정범위 숫자리스트 생성한다.
range(start,stop,step) #start에서 step만큼 stop-1 까지 간다.
ex1)
for i in range(len(list1)) #리스트 크기만큼 반복
ex2)
for i, name in enumerate(list2): #변수 2개 정해서 순서랑 값 전달
print('{}번은 {}'.format(i+1, name)
break #for문이나 while문에서 조건문 만족하는 하나의 경우를 발견하면 반복문 끝내기
continue #반복문의 나머지부분을 보지않고 처음으로 돌아간다. 제외하는 경우를 앞에서 처리할 때 유용
4. 함수
함수란 명확히 구분할 수 있는 실행의 단위를 말한다.
def 함수명(매개변수1,매개변수2, ...): #사용자정의함수, 매개변수(parameter)
실행할 소스코드
return 리턴값1,리턴값2 #실행값 주기 or 함수 끝내기
한번 함수 정의해놓으면 함수명 쓰면 이후 계속사용가능
함수 실행할 경우에는 함수명(실행인자1,실행인자2,…) #실행인자(argument)
매개변수와 실행인자 개수 동일해야한다.
내부함수란 함수 내부에 또다른 함수가 있는 것을 말한다. 내부함수는 외부에서 호출할 수 없다.
람다함수란 간략하게 함수를 사용할 경우 유용하다. 함수명 - lambda 매개변수 : 리턴값
ex) sum - lambda n1, n2 : n1 + n2
5. 입출력
(1) 입력
1) input()
파이썬에서 데이터를 입력받을 때는 input() 함수를 이용한다. input은 한 줄의 문자열을 입력받도록 한다. 만약 파이썬에서 입력받은 데이터를 정수형 데이터로 처리하기 위해서는 int() 함수 사용해야 한다.
ex)
a = int(input()) #input은 기본적으로 문자열로 입력되므로 int사용하여야 정수가 된다.
ex2)
n, m, k = map(int, input().split())) #여러 숫자 데이터를 입력받을 때 공백으로 구분하는 법
ex3)
list2 = list(map(int, input().split())) #리스트 데이터 입력받기
ex4)
a = list(int(input())for _ in range(n)) #여러 줄 하나의 숫자를 리스트로 입력받기
ex5)
array = list(list(map(int, input().split())) for _ in range(n)) #여러줄 여러숫자 입력받기
ex6) N X M 크기의 정보 입력받기
n, m = map(int, input().split()) #정수 입력
array = [0] * n #리스트 0으로 초기화, m이 아니라 n이라는거 주의!!!
for i in range(n): #여러 데이터가 여러 줄로 입력될 때
array[i] = list(map(int, input().split()))
2) sys
input() 함수는 동작속도가 느려서 시간초과될 수 있다. 이 경우에는 sys 라이브러리에 정의되어 있는 함수 이용할 수 있다. 사용방법은 input과 거의 유사하다. 시간초과 판명날 경우 sys 한번 사용해보자.
import sys
변수명 = sys.stdin.readline().rstrip() #하나의 문자열 데이터 입력받기
변수명 = list(map(int, sys.stdin.readline().rstrip().split()) #공백을 구분으로 리스트 입력받기
변수명 = list(int(sys.stdin.readline().rstrip()) for _ in range(n)) #n줄의 하나의 데이터 입력받기
(2) 출력
1) print() 함수
출력의 경우 print() 함수를 이용하여 출력한다.
줄바꿈없이 출력하고 싶으면 print(n, end = ' ') 처럼 end 이용할 수 있다.
ex)
print(a+b, a-b, end='') #a+b와 a-b가 띄어쓰기로 구분되어 출력
2) format() 함수
format 함수는 {}를 이용하며, 순서를 정할 수 있다.
ex)
'{}일 {}시간이 남았습니다'.format(변수1.days, 변수1.seconds//3600)
3) 기타 서식
%d #정수(10진수)
%x #정수(16진수)
%o #정수(8진수)
%f #실수
%c #한 글자
%s #두 글자 이상 문자열
\n #강제 행 넘기기
\t #다음 탭으로 이동
\\ #역 슬래시를 출력
\' #'를 출력
\" #"를 출력
ex1)
print('%d' % 123) #출력시 123
print('%5d' % 123) #5자리확보하며, 오른쪽정렬된다. 출력시 123으로 나온다.
ex2)
print('한 행입니다. \n또 한 행입니다.') #출력시 두개의 행으로 나온다.
6. 라이브러리
표준 라이브러리란 특정한 프로그래밍 언어에서 자주 사용되는 표준 소스코드를 미리 구현해놓은 라이브러리를 의미
모듈(module)이란 미리 만들어진 코드를 가져와 쓰는 방법으로 import 모듈이름 형식을 취한다.
(1) 내장함수
1) 내장함수
sum() 함수 #iterable 객체가 주어지면 모든 원소의 합을 반환한다.
min() 함수 #파라미터가 2개 이상 들어왔을 때 가장 작은 값 반환한다.
max() 함수 #파라미터가 2개 이상 들어왔을 때 가장 큰 값을 반환한다.
abs() 함수 #절대값을 반환한다.
eval() 함수 #문자열 형식으로 수식이 들어오면 수식 계산한 결과를 반환한다.
sorted() 함수 #iterable 객체 들어오면 정렬된 결과 반환한다. 리스트는 .sort() 사용가능 -> sort는 반환값이 없음
divmod() 함수 #divmod(a, b) -> a와 b에 대한 몫과 나머지를 튜플 형식으로 반환한다. 따라서 //와 % 생략 가능
zip() 함수 #각 iterables 의 요소들을 모으는 이터레이터를 만든다.
map(변환함수, Iterable) 함수 #Iterable의 모든 요소의 type을 변환한다. 오류뜨면 앞에 list 붙여보기
lambda 함수 #함수이름없이 함수처럼 쓸 수 있는 익명함수. lambda 입력값 : 반환값 형태이다.
2) 내장함수 활용 예
sum 함수
ex) 2차원 리스트를 1차원 리스트로 만들기
my_list = [[1, 2], [3, 4], [5, 6]]
answer = sum(my_list, [])
sorted 함수
ex) key 활용
student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ]
new_student = sorted(student_tuples, key=lambda x : x[2]) #리스트 내의 리스트 인덱스 2 기준으로 정렬, 숫자를 의미
print(new_student) #[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
ex2) key 활용2
a = [(1, 2), (0, 1), (5, 1), (5, 2), (3, 0)] #그냥 sorted()만 쓰면 리스트 아이템의 각 요소 순서대로 정렬을 한다.
b = sorted(a) #b = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)]
c = sorted(a, key = lambda x : x[0]) #c = [(0, 1), (1, 2), (3, 0), (5, 1), (5, 2)], 리스트 내의 리스트 첫번째 요소
d = sorted(a, key = lambda x : x[1]) #d = [(3, 0), (0, 1), (5, 1), (1, 2), (5, 2)], 리스트 내의 리스트 두번째 요소
ex3) 다중 조건의 경우 - (첫번째 조건, 두번째 조건) 튜플 형식으로 주면 된다.
a = ['i', 'im', 'no', 'big']
b = sorted(a, key = lambda x : len(x)) #이렇게만 하면 길이순으로 정렬된다.
c = sorted(a, key = lambda x : (len(x), x)) #길이순으로 정렬한다음 사전순으로 정렬
zip 함수
ex1)
x = [1, 2, 3]; y = [2, 3, 4] #리스트 선언
z = dict(zip(x, y)) #딕셔너리 컴프리헨션
ex2)
k = [] #빈 리스트 선언
for i in zip(x,y):
k.append(i) #출력시 [(1, 2), (2, 3), (3, 4)]가 나온다. 리스트 내에 튜플형식
ex3)
list1 = list(map(list, zip(x,y))) #출력시 [[1, 2], [2, 3], [3, 4]]가 나온다. 이중리스트 생성
ex4)
mylist = list(map(int, input().split())) #리스트 입력받기
answer = [] #빈 리스트 선언
for number1, number2 in zip(mylist, mylist[1:]): #zip을 이용하면 index나 len 사용없이도 각 원소 접근가능
answer.append(abs(number1 - number2))
map 함수
ex1)
list1 = ['1', '100', '33'] #문자열 형식의 리스트 선언
list2 = list(map(int, list1)) #문자열 형식에서 정수형으로 변환한 리스트 선언
ex2)
list1 = [[1, 2], [2, 2], [3]] #이중 리스트 선언
list2 = list(map(len, list1)) #출력시 [2, 2, 1]나온다. len도 변환함수중 하나
(2) itertools
파이썬에서 반복되는 데이터를 처리하는 기능을 포함하는 라이브러리
1) permutations(순열)
iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우를 계산해준다. permutations는 클래스이므로 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
from itertools import permutations
변수명 = ['a', 'b', 'c'] #리스트 선언
result = list(permutations(변수명, r)) #순열을 리스트 클래스로 변환
print(result)
- permutations은 객체에서 r개 뽑을 때(자기 자신을 중복하는거 제외) + 순서가 중요할 때 사용
- 다만, permutations하면 [('aya', 'ye'), ('aya', 'woo'), ...] 이런 식으로 나옴
- 따라서 list(map(''.join,permutations(ava,2))) 으로 하면 ['ayaye', 'ayawoo', 'ayama', ...] 로 바뀜
2) combinations(조합)
iterable 객체에서 r개의 데이터를 뽑아 순서를 고려하지 않고 나열하는 모든 경우를 계산해준다. combinations는 클래스이므로 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
from itertools import combinations
변수명= ['a', 'b', 'c'] #리스트 선언
result = list(combinations(변수명, r)) #조합을 리스트 클래스로 변환
print(result)
3) product
순열과 같이 iterable 객체에서 r개의 데이터를 뽑아 일렬로 나열하는 모든 경우를 계산한다. 다만 원소를 중복하여 뽑는다. product 객체를 초기화할 때는 뽑고자 하는 데이터의 수를 repeat 속성값으로 넣어준다. product는 클래스이므로 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.
from itertools import product
변수명= ['a', 'b', 'c'] #리스트 선언
result = list(product(변수명, repeat = r)) #리스트 클래스로 변환
print(result)
ex)
import itertools
iterable1 = 'ABCD'; iterable2 = 'xy'; iterable3 = '1234'
itertools.product(iterable1, iterable2, iterable3) #곱집합 구하기에 유용하다.
(3) bisect
파이썬에서는 이진탐색을 쉽게 구현할 수 있도록 bisect 라이브러리를 제공한다. 정렬된 배열에서 특정 원소를 찾아야 할 때 효과적이다.
bisect_left(a, x) #정렬된 순서를 유지하면서 리스트a에 데이터x를 삽입할 가장 왼쪽 인덱스를 찾는 메서드
bisect_right(a, x) #정렬된 순서를 유지하면서 리스트a에 데이터x를 삽입할 가장 오른쪽 인덱스를 찾는 메서드
정렬된 리스트에서 값이 특정범위에 속하는 원소의 갯수 구하고자 할 때 효과적이다.
from bisect import bisect_left, bisect_right
a = [1, 2, 4, 4, 8]
x = 4
print(bisect_left(a, x)) #2가 출력된다.
print(bisect_right(a, x)) #4가 출력된다.
(4) collections
deque는 리스트 자료형과 다르게 인덱싱, 슬라이싱할 수 없다. 다만 연속적으로 나열된 데이터의 시작부분이나 끝부분에 데이터 삽입하거나 삭제할 때는 효과적이다. 시간복잡도가 O(1)이다. 스택과 큐를 지원한다.
from collections import deque
변수명 = deque([2, 3, 4])
변수명.appendleft(1) #첫번째 인덱스에 1 삽입
변수명.append(1) #마지막 인덱스에 1 삽입
변수명.popleft() #첫번째 인덱스의 원소 삭제
변수명.pop() #마지막 인덱스의 원소 삭제
OrderedDict는 Dict와 달리 데이터 입력순서대로 Dict를 반환한다.
from collections import OrderedDict
d = OrderedDict()
d['x'] = 100
d['y'] = 200
d['z'] = 500
for k, v in d.items():
print(k, v) #x 100 y 200 z 500 출력된다.
defaultdict는 Dict type 값에 기본값을 지정
from collections import defaultdict
d = defaultdict(object) #default Dictionary 생성
d = defaultdict(lambda : 0) #디폴트 값을 0으로 설정
Counter는 등장 횟수를 세는 기능을 제공한다. dict 형태로 반환
from collections import Counter
변수명 = Counter('아', '이', '가', '나')
print(변수명['아]) #'아' 가 등장한 횟수 출력
ex)
from collections import Counter
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 7, 9, 1, 2, 3, 3, 5, 2, 6, 8, 9, 0, 1, 1, 4, 7, 0]
answer = Counter(my_list)
print(answer[1]) # = 4
print(answer[3]) # = 3
print(answer[100]) # = 0
(5) heapq
heapq 라이브러리는 다익스트라 최단경로 알고리즘을 포함하여 다양한 알고리즘에서 우선순위 큐 기능을 구현하기 위해 사용된다. 파이썬의 힙은 최소 힙으로 구성되어 있으므로 힙에서 원소를 꺼내면 가장 값이 작은 원소가 추출되는 특징이 있다. 단순히 원소를 힙에 전부 넣었다가 빼는 것으로 오름차순 정렬이 될 수 있다.
import heapq
q = []
heapq.heappush(q, x) #q라는 힙에다가 x를 삽입하기. x가 (a, b) 형태로 되어 있다면 튜플 형식으로 입력된다. 첫번째 원소 기준으로 우선순위가 설정된다.
heapq.heappop(q) #우선순위 가장 낮은 원소 꺼내기
(6) math
import math
math.prod(list) #리스트의 요소 곱을 반환
math.factorial(x) 함수 #x! 값을 반환한다.
math.sqrt(x) 함수 #x의 제곱근을 반환한다.
math.isqrt(x) 함수 #x의 음이 아닌 정수 제곱근을 반환한다. sqrt 사용시 overflowerror 발생하면 isqrt 사용하자.
math.gcd(a, b) 함수 #a와 b의 최대공약수를 반환한다.
math.lcm(a, b) 함수 #a와 b의 최소공배수를 반환한다.
math.round(x) #반올림
math.trunc(x) #0을 향해 버림
math.ceil(x) #올림
math.floor(x) #음수를 향해 내림
math.pi #파이(psi) 제공
math.e #자연상수 e 제공
ex) 어떤 수가 제곱수인지 확인
math.sqrt(number) == int(math.sqrt(number))
(6) datetime
import datetime
datetime.datetime.now() #현재시각
변수 = datetime.datetime(원하는시각) #원하는 시각 변수 생성
ex1) datetime은 연산가능
변수1 = 변수 - datetime.datetime.now()
변수1.days #남은 일수
변수1.seconds #남은 초
'10월19일까지는 {}일 {}시간이 남았습니다'.format(변수1.days, 변수1.seconds//3600)
ex2) timedelta 활용
변수2 = datetime.datetime.now().replace(hour = 10, minute = 0, second = 0) + datetime.timedelta(days = 3) #오늘 10시로부터 3일 후
(7) random
n = int(input()) #몇 개의 난수 발생시킬지 입력
import random
array = [] #빈 리스트 선언
for i in range(n):
aa.append(random.randrange(start, end)) #start에서 end까지의 범위에서 난수 발생
(8) string
import string
string.ascii_lowercase #소문자 abcdefghijklmnopqrstuvwxyz
string.ascii_uppercase #대문자 ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_letters #대소문자 모두 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits #숫자 0123456789
7. 기타
(1) 전역변수(global variable)와 지역변수(local variable)
전역변수란 프로그램 어디서든 부를 수 있는 이름을 전역변수라고 한다. 함수 밖에서 변수를 정의하면 전역변수가 된다. 반면에 지역변수는 함수 문맥 속에서만 부를 수 있는 이름을 말한다. 모든 함수는 자신만의 공간을 가지며, 함수 속에서 작성한 변수는 그 함수의 지역변수가 된다.
함수의 지역변수는 함수가 실행되는 동안에만 존재한다. 각 함수가 호출되어 실행될 때 만들어지고, 함수의 실행이 끝나면 삭제된다. 그래서 지역변수는 그 변수가 속한 함수의 밖이나 다른 함수에서는 부를 수 없다.
전역변수 | 지역변수 | |
함수 안에서 읽기 | 가능 | 가능 |
함수 안에서 수정 | 불가(global 사용시 가능) | 가능 |
함수 밖에서 읽기 | 가능 | 불가 |
함수 밖에서 수정 | 가능 | 불가 |
cf) 전역변수를 함수 안에서 읽기는 가능하지만 대입하여 수정하려하면 오류가 발생한다.
global 키워드 #함수 내에서 global 전역변수명을 선언하면 그 변수가 전역변수임을 알림으로써 수정도 할 수 있게 된다.
(2) with - as 구문
파일, http 등 입출력 간편하게 하기
with open('myfile.txt') as file:
for line in file.readlines():
print(line.strip().split('\t'))