본문 바로가기
Appz Knowledge/Python

Python 혼공노트 2 - 제어문과 함수

by 스쳐가는인연 2023. 1. 30.

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[] ) 형태로 활용 가능

 

 

 

 

 

반응형