Python 혼공노트 2.
- 혼자 공부하는 파이썬(개정판) 청강하며... (그외 파이썬 강의도 …)
제어문:
if 조건문 : 조건이 True일 때만, 들여쓰기 안쪽 코드를 수행
---------------------------------------------------
if 조건:
복합문장(문장의 묶음, 들여쓰기 한 문단)
if 조건:
복합문장
else:
복합문장
if 조건:
복합문장
elif 조건:
복합문장
else:
복합문장
---------------------------------------------------
Note. 조건과 함께 사용 가능한 기능들:
exit() # 프로그램 강제종료
pass # 현재 블럭을 넘김(다음 코드로 이동)
raise NotImplementedError # 구현되지 않은 기능에 대한 강제적인 오류 촉발
반복문:
1-index: 수를 1부터 세는 것
0-index: 수를 0부터 세는 것
서수: 순서를 나타내는 수 (0-index 사용)
기수: 개수를 나타내는 수 (1-index 사용)
문자열: 문자가 나열된 것
수열: 숫자가 나열된 것
항: 수열의 요소 (i, j, k, l, m, n : 자주 사용하는 항 (e.g.) i번째 항))
길이: 수열 요소의 수
유한수열: 길이가 유한한 수열
무한수열: 길이가 무한한 수열
배열: 길이가 고정
리스트: 배열에 요소 추가/제거 등의 기능을 추가한 것
'[]' 안에 ','로 구분한 값들이 나열됨
list명[index]로 각 요소를 구분/추출
list는 list를 포함할 수 있음 (다차원 리스트)
요수추가
list명.append(요소) # 마지막에 요소 추가
list명.insert(인덱스, 요소) # 원하는 index에 요소를 추가
list명.extend(요소들) # 마지막에 요소를 다수개 추가
요소삭제
list명.del(값) # 값 인덱스의 요소 제거
list명.pop(값) # 값 인덱스의 요소 제거 (기본값 -1)
list명.remove(값) # 특정값 요소 제거
list명.clear(값) # 모든 요소 제거
요소정렬
list명.sort() # 오름차순 정렬
list명.sort(reverse=True) # 내림차순 정렬
list명.reverse() # 역순으로 정렬
요소확인
값 in list명
값 not in list명
for 반복문: 리스트 안의 요소를 한 개씩 반복변수에 이용
for 반복변수 in 반복할 수 있는 것(리스트, 딕셔너리 등):
복합구문
항등원: 임의의 원소에 특정 연산 후 재귀시키는 원소 / 자료 초기화에 필요
A + ? = A
A * ? = A
? : 항등원
+ 연산에서의 항등원: 0
* 연산에서의 항등원: 1
a= [ 1, 2, 3, 4, 5]
총합(모두 더함): ∑a / sigma
sum=0
for a_i in a:
sum = sum + a_i
총곱(모두 곱함): ∏a / pi
prod=1
for a_i in a:
prod = prod + a_i
*list : 전개연산자 / list의 요소들을 그대로 나열
일정 요소를 바탕으로 주기(반복)를 만들고 싶을 때, ‘%’ 연산자 이용
딕셔너리: { 키: 값, 키: 값, 키: 값 }
# 딕셔너리의 특정 키의 값/요소를 변경
dict명[키]=변경하고자 하는 값
# 딕셔너리에 새로운 요소 추가
dict명[새로운키] = 추가하고자 하는 값
# 딕셔너리 요소 삭제
del dict명[키]
# 딕셔너리에 특정 키 내용/존재 확인
키 in dict명
# 딕셔너리에서 특정 키 값을 구함
dict명.get(키) # 키가 존재하지 않는 경우 ‘None’을 반환
range(a) # 0 ~ a 까지의 정수
range(a, b) # a ~ b 까지의 정수. b는 포함하지 않음
range(a, b, c) # a ~ b 까지의 정수. b는 포함하지 않음. c만큼 건너 뛰어(step)
Note. 여러 줄을 입력받고자 할 때, input()를 반복한다
while 반복문:
while 조건:
복합구문
Note. 조건이 참인 경우, 무한 반복문
Note. for 반복문은 while 반복문으로 대체 가능하나 반대는 경우에 따라 다름(안되는 것도 있음)
# epoch time/unix time : 1970-01-01, 0-0-0
from time import time
start_time=time() # 함수가 실행된 시점의 시간을 얻어 저장
now=time()
while now < start_time+5:
print(now, start_time+5)
now = time()
break # 반복문을 종료
continue # 현재 반복을 종료하고 다음 반복을 수행 (다음 반복으로 넘어가고자 할 때)
리스트와 함께 사용되는 함수:
입력된 파라메터 중 최대/최소 값을 찾아주는 함수
min()
max()
입력된 파라메터의 모든 합을 더해주는 함수. 참고로 파라메터 중 수가 아닌 자료가 있는 경우 오류가 발생함
sum()
reversed() # 입력된 파라메터를 역순으로 나열해주는 함수 Note. 이터레이터 타입의 자료를 리턴을 하며, 단발성으로만 사용 가능
enumerate() # 입력된 파라메터의 인덱스 제공 튜플 타입의 자료를 리턴하며, 단발성으로만 사용 가능
items() # 파라메터로 딕셔너리의 자료를 이용할 때, 튜플 타입의 자료를 리턴함
리스트 내포 (List comprehension): 반복 가능한 것을 기반으로 새로운 리스트를 생성
[
표현식
반복문
조건식
]
리스트 명 = [표현식 for 변수 in 반복 가능한 대상]
리스트 명 = [표현식 for 변수 in 반복 가능한 대상 if 조건문]
여러 문자열을 하나로 인식하는 방법:
1) ‘()’로 묶어줌
2) “”.join(“A”, “B”, “C”) # 뒤의 문자열 들을 앞의 하나의 문자열로 합쳐줌.
앞의 문자열에 포맷기호를 사용하면 문장을 해당 기호로 구분해줌 (e.g.) \n:줄바꿈, ‘,’ 등 …)
진법변환
f"{10:b}" # 십진수를 2진수로 변환
f"{10:o}" # 십진수를 8진수로 변환
f"{10:x}" # 십진수를 16진수로 변환
int("1010",2) # 2진수를 십진수로 변환
int("12",8) # 8진수를 십진수로 변환
int("a",16) # 16진수를 십진수로 변환
"문자열".count("문자") # 문자열에 문자가 몇 번 포함되는 지 세는 함수
# 특정 리스트에 특정 문자/수가 몇 개 포함되는 지 세는 함수
A = "문자열"
counter_text = {}
for a in A:
if a not in counter_text:
counter_text[a] = 0
counter_text[a] += 1
print(counter_text)
print(f"사용된 문자는 {len(counter_text)}개 임)
# 특정 리스트에 특정 글자수의 문자열이 몇 개 포함되는 지 세는 함수
A = "문자열"
counter_text = {}
for i in range(0, len(A), 3): # 세글자씩 반복되는 경우
a= A[i:i+3}
if len(a) != 3:
continue
if a not in counter_text:
counter_text[a] = 0
counter_text[a] += 1
print(counter_text)
print(f"사용된 문자는 {len(counter_text)}개 임)
리스트 평탄화: 리스트 속에 리스트가 포함되어 있는 경우, 내부 리스트를 제거하여 내부 리스트의 요소를 상위 리스트로 꺼냄
복잡도
시간복잡도: 일반적으로 복잡도라 일컫음
점근표기법(빅오 표기법, 란다우 표기법)
- 최고차 항만 남기고, 최고차 항의 계수를 제거
----------------------------------
10n ** 2+n : O(n**2)
n ** 2+1: O(n**2)
5n : O(n)
O(n)
O(1)
Note. n ** 2 또는 n log n 이상의 복잡도가 발생하는 알고리즘은 개선이 필요할 수 있다.
----------------------------------
공간복잡도: 관심 있음 찾아보라 …
함수관련용어:
코드전체: 프로그램(program), 루틴(routine)
참조. 과거엔 code를 의미했으나 의미가 변화한 용어: 절차(procedure), 방법(method)
서브루틴, 서브프로그램: 프로그램 내부의 일부 기능을 구현한 부분 코드 / 반복사용가능한 코드를 작성/구현
def func():
복합문장
매개변수(parameter) : 함수 작성/정의 시, 전달되는 변수
인수(argument): 함수 실행 시, 전달되는 변수값
절차(procedure) : 매개변수를 갖는 함수
전역변수:
global 변수명
함수(function): 프로시저 + "리턴값"
def func():
return 복합문장
# def keyword와 ‘:’으로 함수를 정의
# return 연산 결과를 반환하는 키워드 / 기본값은 "None"
클래스 내부에 있는 함수: 방법(method)
함수설계자
- 함수 사용 방법에 대한 문서화
- 함수 잘못된 사용에 대한 예외처리
함수사용자
- 사용 방법에 대한 검토
함수는 정의 시 지정된 매개변수이 타입과 수를 맞춰 전달해야 한다. 그렇지 않으면, 파라메터 관련 오류 발생
가변매개변수: argument 수가 정해지지 않은 함수에 전달하는 매개 변수
*변수명 # 튜플 타입으로 전달되는 가변매개변수
Note. 리스트를 매개변수로 전달하는 경우, 전개 연산자 '*'를 리스트 앞에 붙여 매개변수로 전달
Note. 가변매개변수 뒤에는 일반매개변수가 전달될 수 없음. 매개변수 지정/전달시 유의 필요
키워드매개변수 : 가변매개변수 뒤에 전달될 수 있는 매개변수 타입
기본매개변수: 매개변수가 입력되지 않는 경우, 자동으로 입력되는 매개변수. 일반적으로 키워드 매개변수로 지정함, 다른 매개 변수보다 뒤에 지정함
sep="" # 구분문자 지정
end="" # 함수 실행 후 마지막 동작
Note. print() 의 경우, 기본구분문자가 공백문자, 기본종료문자가 줄바꿈으로 지정되어 있음
전역위치(Global frame): 프로그램의 가장 외부 영역
지역위치: 함수 내부 영역
전역변수: 전역위치에 생성된 변수 / 프로그램 내 어디에서나 사용 가능한 변수
global keyword 이용하여 전역위치의 변수를 활용
global 변수명 # 전역에 정의된 변수를 이용
지역변수: 함수 내부에 정의된 변수 / 해당 함수가 실행되는 동안에만 존재하고 실행이 종료되면 없어짐
기본자료형 복사: 변수를 변수에 할당하면, 스택의 값이 복사됨
복합자료형 복사: 변수를 변수에 할당하면, 힙의 주소가 복사됨
매개변수 복사
a = 10
b = [1, 2, 3, 4]
print(a, b)
def func_a(c, d)
c = 20
d = [5, 6, 7, 8]
func_a(a, b)
print(a, b)
def func_b(c, d)
c = 30
d.extend([9, 10])
func_b(a, b)
print(a, b)
재귀함수 : 자기 자신을 호출하는 함수 / 필요연산에 따라 스택을 신규로 생성하고(내려가고), 추 후 결과를 가지고 돌아오는 것(올라가는)
팩토리얼 연산: n! = n * (n-1) * (n-2) * ... * 1
반복문:
def factorial(n):
output = 1
for i in range(1, n+1):
output *= i
return output
재귀함수: 수열의 점화식 이용(이웃한 항의 관계를 통해 수열을 나타내는 것)
팩토리얼 점화식
1! = 1
(n이 2 이상의 수일때) n! = n * (n-1)!
def factorial(n):
if n == 1:
return 1
elif n >= 2:
return n * factorial(n - 1)
조기리턴(Early return): 함수의 리턴값을 관련 코드 전체가 완료되기 전에 필요값을 얻은 경우 바로 리턴하여 마무리하는 것
flatten(list명): 중첩 리스트의 평탄화 함수
다중할당구문:
좌측 반복 가능 변수에 우측 반복 가능한 값이 할당됨
[ a, b ] = (10, 20)
( a, b ) = (10, 20) / a, b = 10, 20 # 튜플은 ()를 생략 가능함
함수는 변수에 저장/할당할 수 있음
------------------------------------
def func_A():
pass
a = func_A()
b = func_A
b()
------------------------------------
콜백함수: 함수에 매개변수로 전달되는 함수
map() : 리스트 각각의 요소에 함수를 적용하여 새로운 이터레이터를 리턴
이터레이터 = map(함수, 리스트)
filter() : 리스트의 요소를 함수에 적용 후, True 인 값만 모아 새로운 이터레이터를 리턴
이터레이터 = filter(함수, 리스트)
람다: 간단한 함수를 간단하게 해주는 문법
def power(숫자):
return 숫자 ** 2
power = lamda 숫자: 숫자 ** 2
power()
def is_odd(숫자):
return 숫자 % 2 == 1
is_odd = lamda 숫자: 숫자 % 2 == 1
is_odd()
인라인함수 : 한 줄 안에 함수를 작성하는 것
Key 키워드 매개변수 # 딕셔너리 등 여러 값이 요소로 포함되는 경우, 활용이 필요한 대상 요소만을 추출하고자 할 때
함수( key= 값: lamda[값] ) 형태로 활용 가능