TIL (Today I Learned)
제어문 (Control Statement)
•
기본적으로 위에서부터 아래로 차례대로 명령 수행 (파이썬)
•
특정 상황에 따라 코드를 선택적으로 실행(분기/조건)하거나 계속 실행(반복)하는 제어가 필요
•
제어문은 순서도(flowchart)로 표현이 가능
조건문
•
참/거짓을 판단할 수 있는 조건식과 함께 사용
◦
참인 경우 if, 이외의 경우 else 이후 들여쓰기 되어있는 코드 블록 실행
▪
else는 필수가 아니라 선택적으로 활용 가능
if 조건 == True:
# 코드
else:
# 코드
Python
조건문 예시
조건문 실습
복수 조건문
•
복수 조건식을 활용할 경우 elif 사용
if 조건:
# 코드
elif 조건:
# 코드
elif 조건:
# 코드
else:
# 코드
Python
복수 조건문 실습
중첩 조건문
•
조건문은 다른 조건문에 중첩하여 사용 가능
•
들여쓰기에 유의
if 조건:
# 코드
if 조건:
# 코드
else:
# 코드
Python
중첩 조건문 실습
조건 표현식 (Conditional Expression)
•
조건 표현식을 일반적으로 조건건에 따라 값을 정할 때 사용
•
삼항 연산자(Ternary Operator)로 부르기도
true인 경우 값 if 조건 else false인 경우 값
Python
조건 표현식 실습
반복문
•
특정 조건을 만족할 때 까지 같은 동작을 계속 반복하고 싶을 때 사용
반복문의 종류
•
while 문
◦
종료 조건에 해당하는 코드를 통해 반복문을 종료
•
for 문
◦
반복가능한 객체를 모두 순회하면 종료 (별도의 종료 조건 필요 X)
•
반복 제어
◦
break, continue, for-else
While문
•
조건식이 참인 경우 반복적으로 코드 실행
◦
조건이 참인 경우 들여쓰기 되어 있는 코드 블록 실행
◦
코드 블록이 모두 실행되고, 다시 조건식을 검사하면 반복적으로 실행
◦
무한루프하지 않도록 종료 조건이 반드시 필요
while 조건:
# 코드
Python
while 문 예시
복합 연산자 (In-Place Operator)
•
복합 연산자는 연산과 할당을 합쳐 놓은 것
반복문을 통해서 개수를 카운트하는 경우
for문
•
시퀀스(string, tuple, list, range)를 포함, 순회 가능한 객체(iterable)의 요소를 모두 순회
◦
처음부터 끝까지 모두 순회하므로 별도의 종료 조건 필요 X
•
Iterable
◦
순회할 수 있는 자료형(string, list, dict, tuple, range, set 등)
◦
순회형 함수(range, enumerate)
for 변수명 in iterable:
Python
for 문 예시
for문을 이용한 문자열(String) 순회
입력한 문자를 한 글자씩 출력
입력한 문자를 range를 사용해 한 글자씩 출력
딕셔너리(Dictionary) 순회
딕셔너리는 기본적으로 key를 순회하므로, key를 통해 값을 활용
추가 메소드를 활용한 딕셔너리(Dictionary) 순회
•
추가 메소드를 활용하여 순회 가능
◦
keys(): key로 구성된 결과
◦
values(): value로 구성된 겨로가
◦
items(): (key, value)의 튜플로 구성된 결과
grades = {'john': 80, 'eric': 90}
print(grades.keys())
print(grades.values())
print(grades.items())
for student, grade in grades.items():
print(student, grade)
Python
enumerate 순회
•
enumerate()
◦
인덱스와 객체를 쌍으로 담은 열겨형 객체 반환
◦
(index, value) 형태의 tuple로 구성된 열겨 객체 반환
membres = ['민수', '영희', '철수']
for i, number in enumerate(members):
print(idx, number)
list(enumerate(members, start=1)) # 인덱스 시작 번호 변경 가능
Python
List Comprehension
표현식과 제어문을 통해 특정 값을 가진 리스트를 간결하게 생성하는 방법
1~3의 세제곱의 결과가 담긴 리스트를 만드시오.
Dictionary Comprehension
1~3의 세제곱의 결과가 담긴 딕셔너리를 만드시오.
반복문 제어
•
break
◦
반복문을 종료
•
continue
◦
continue 이후의 코드 블록은 수행하지 않고, 다음 반복을 수행
•
for-else
◦
끝까지 반복문을 실행한 이후에 else 문 실행
▪
break를 통해 중간에 종료되는 경우 else 문을 실행되지 않음
•
pass
◦
아무것도 하지 않음(문법적으로 필요하지만, 수행할 코드가 없을 때 사용)
break
•
break문을 만나면 반복문은 종료
n = 0
while True:
if n == 3:
break
print(n)
n += 1
Python
for i in range(10):
if i > 1:
print('0과 1만 필요해!')
break
pritn(i)
Python
continue
•
continue 이후의 코드 블록은 수행하지 않고, 다음 반복을 수행
for i in range(6):
if i % 2 == 0:
continue
print(i)
Python
pass
•
아무것도 하지 않음.
•
특별한 역할 없이, 자리 채우는 용도
•
반복문 아니어도 사용 가능
for i in range(4):
if i == 2:
pass
print(i)
Python
for-else
•
끝까지 반복문 실행 후 else문 실행 → 정상적으로 for 문이 모두 끝났을 때 else 문 실행!
for c in 'apple':
if c == 'b':
print('b!')
break
else:
print('b가 없습니다.')
# b가 없습니다.
Python
for c in 'banana':
if c == 'b':
print('b!')
break
else:
print('b가 없습니다.')
# b!
Python
함수
•
함수를 사용하는 이유
◦
분해 (Decomposition)
◦
추상화 (Abstraction)
Decomposition
•
기능을 분해 & 재사용을 가능하게
len([1, 2, 3]
sum([1, 2, 3]
평균 구하는 코드
Abstraction
•
복잡한 내용을 모르더라도 사용할 수 있또록 → 재사용성과 가독성 UP!
•
print('hello')
◦
내부 구조, 원리를 잘 몰라도 잘 사용할 수 있음
함수의 종류
•
내장 함수
◦
파이썬에 기본적으로 포함된 함수
•
외장 함수
◦
import 문을 통해 사용. 외부 라이브러리에서 제공하는 함수
•
사용자 정의 함수
◦
사용자가 직접 만드는 함수
함수의 정의
•
함수 (Function)
◦
특정한 기능을 하는 코드의 조각(묶음)
◦
특정 코드를 매번 다시 작성할 필요 없이, 필요할 때마다 호출하여 간편히 사용
함수 기본 구조
•
선언과 호출 (define & call)
•
입력 (Input)
•
문서화 (Docstring)
•
범위 (Scope)
•
결과값 (Output)
선언과 호출 (define & call)
•
선언은 def 키워드 활용
•
들여쓰기를 통해 Function body(실행될 코드 블록) 작성
◦
Docstring은 함수 body 앞에 선택적으로 작성
▪
작성 시에는 첫 번째 문장에 문자열 `````
•
함수는 parameter를 넘겨줄 수 있음
•
함수는 동작 후에 return을 통해 결과값 반환
선언
호출
함수의 실행 순서
다음 코드의 실행 결과를 예측해보자.
함수의 결과값 (Output)
•
Void function
◦
명시적인 return 값이 없는 경우, None을 반환하고 종료
print('hello python')
Python
•
Value returning function
◦
함수 실행 후, return 문을 통해 값 반환
◦
return을 하게 되면, 값 반환 후 함수 즉시 종료
float('3.14')
Python
print vs return
print를 사용하면 호출될 때마다 값을 출력
데이터 처리를 위해서는 return
튜플을 활용하여 두 개 이상의 값 반환
반환 값으로 튜플 사용
함수의 입력 (Input)
Parameter & Argument
•
Parameter: 함수를 정의할 때, 함수 내부에서 사용되는 변수
•
Argument: 함수를 호출 할 떄, 넣어주는 값
def function(ham): # parameter : ham
return ham
function('spam') # argument : spam
Python
Argument
•
함수 호출 시 함수의 parameter를 통해 전달되는 값
•
Argument는 소괄호 안에 할당 func_name(argument)
◦
필수 Argument: 반드시 전달돼야 하는 argument
◦
선택 Argument: 값을 전달하지 않아도 되는 경우는 기본값이 전달
Positional Arguments
기본적으로 함수 호출 시 Argument는 위치에 따라 함수 내에 전달됨
Keyword Arguments
직접 변수의 이름으로 특정 Argument 전달 가능
Default Arguments Values
기본값을 지정하면 함수 호출 시 Argument 값 설정할 필요 X
정해지지 않은 여러 개의 Arguments 처리
print 함수의 Arguments 개수가 변해도 잘 동작하는 이유?
→ 애스터리스크(Asterisk), 언패킹 연산자라고 불리는 * 덕분!
가변 인자 (*args)
•
여러 개의 Positional Argument를 하나의 필수 parameter로 받아서 사용
•
언제 사용할까?
◦
몇 개의 Positional Argument를 받을지 모르는 함수를 정의할 떄 유용
def add(*args): # add(2), add(2, 3, 4, 5)
for arg in args:
print(arg)
Python
패킹 / 언패킹
•
패킹
여러 개의 데이터를 묶어 변수에 할당
•
언패킹
시퀀스 속 요소들을 여러 개의 변수에 나누어 할당
◦
언패킹 시 변수의 개수와 할당하고자 하는 요소의 갯수가 동일해야 함!
언패킹 시 왼쪽의 변수에 asterisk(*)를 붙이면, 할당하고 남은 요소를 리스트에 저장 가능
Asterisk(*)와 가변 인자
*를 활용하여 가변 인자를 만들 수 있음
가변 인자 예시
가변 키워드 인자(**kwargs)
•
몇 개의 키워드 인자를 받을지 모르는 함수를 정의할 때 유용
•
받은 인자는 딕셔너리로 묶어 처리
가변 키워드 인자 예시
가변 인자(*args)와 가변 키워드 인자(**kwargs) 동시 사용
가변 인자와 가변 키워드 인자 동시 사용 예시
Python의 범위 (Scope)
•
함수는 코드 내부에 local scope를 생성, 그 외 공간은 global scope로 구분
•
scope
◦
global scope: 코드 어디에서나 참조할 수 있는 공간
◦
local scope: 함수가 만든 scope. 함수 내부에서만 참조 가능
•
variable
◦
global variable: global scope에 정의된 변수
◦
local variable: local scope에 정의된 변수
변수 수명 주기(life cycle)
•
변수는 각자의 수명 주기가 존재
◦
built-in scope
▪
파이썬이 실행된 이후부터 영원히 유지
◦
global scope
▪
모듈이 호출된 시점 이후, 또는 인터프리터가 끝날 때까지 유지
◦
local scope
▪
함수가 호출될 때 생성되고, 함수가 종료될 떄까지 유지
이름 검색 규칙 (Name Resolution)
•
파이썬에서 사용되는 이름(식별자)들은 이름공간(namespace)에 저장되어 있음
•
LEGB Rule : 다음 순서로 이름을 찾아나감.
◦
Local scope: 지역 범위 (현재 작업 중인 범위)
◦
Enclosed scpoe: 지역 범위 한 단계 위 범위
◦
Global scope: 최상단에 위치한 범위
◦
Built-in scope: 모든 것을 담고 있는 범위 (정의 필요 없이 사용 가능)
LEGB 예시
global
•
현재 코드 블록 전체에 적용되며, 나열된 식별자(이름)이 global variable임을 나타냄
◦
global에 나열된 이름은 같은 코드 블록에서 global 앞에 등장할 수 없음
◦
global에 나열된 이름은
parameter, for 루프 대상, class/function 정의 등으로 정의되지 않아야 함
global 예시
global 주의 사항
nonlocal
•
global을 제외하고 가장 가까운 (둘러싸고 있는) scope의 변수를 연결
◦
nonlocal에 나열된 이름은 같은 코드 블록에서 nonlocal 앞에 등장 불가능
◦
nonlocal에 나열된 이름은
parameter, for 루프 대상, class/function 정의 등으로 정의되지 않아야 함
•
global과는 달리 이미 존재하는 이름과의 연결만 가능
nonlocal 예시
nonlocal global 비교
함수의 범위 주의
•
기본적으로 함수에서 선언된 변수는 local scope에 생성되며, 함수 종료 시 사라짐
•
해당 scope에 변수가 없는 경우 LEGB rule에 의해 이름 검색
◦
변수에 접근은 가능, 해당 변수 수정 불가
▪
값을 할당할 경우 해당 scope의 이름공간에 새롭게 생성되기 때문
◦
함수 내에 필요한 상위 scope 변수는 argument로 넘겨서 활용!
•
상위 scope에 있는 변수를 수정하고 싶다면 global, nonlocal 키워드 활용 가능
◦
단, 코드가 복잡해지고 변수의 변경을 추적하기 어려워지기 때문에 추천하진 않음
◦
함수로 값을 바꾸고자 한다면 항상 argument로 넘기고 return 값 사용을 권장
함수 응용
내장 함수(Built-in Functions)
•
파이썬 인터프리터에는 항상 사용할 수 있는 많은 함수와 형(type)이 내장되어 있음.
map
•
순회 가능한 데이터 구조(iterable)의 모든 요소에 함수(function)적용하고,
그 결과를 map object로 반환
numbers = [1, 2, 3]
result = map(str, numbers)
print(result, type(result)) # <map object at 0x0000020984097FA0> <class 'map'>
print(list(result) # ['1', '2', '3']
Python
map 활용 사레
filter
•
순회 가능한 데이터 구조(iterable)의 모든 요소에 함수(function)적용하고,
그 결과가 True인 것들을 filter object로 반환
def odd(n):
return n % 2
numbers = [1, 2, 3]
result = filter(odd, numbers)
print(result, type(result)) # <filter object at 0x000001FB4B217F40> <class 'filter'>
print(list(result) # ['1', '3']
Python
zip
•
복수의 데이터 구조(iterable)을 모아 Tuple을 원소로 하는 zip object를 반환
girls = ['jane', 'ashley']
boys = ['justion', 'eric']
pair = zip(girls, boys)
print(pair, type(pair)) # <zip object at 0x000001A4B3DD0380> <class 'zip'>
print(list(pair)) # [('jane', justin'), ('ashley', 'eric')]
Python
lambda 함수
•
표현식을 계산한 결과 값을 반환하는 함수로, 이름이 없는 함수라 익명함수라고도 불림.
•
특징
◦
return 문 사용 불가
◦
간편 조건문 외 조건문이나 반복문 사용 불가
•
장점
◦
함수를 정의해서 사용하는 것보다 간결
◦
def를 사용할수 없는 곳에도 사용 가능
lambda 예시
재귀 함수 (reccursive function)
•
자기 자신을 호출하는 함수
•
무한 호출이 목적이 아니므로, 알고리즘 설계 및 구현에 적절히 활용
◦
ex) 점화식 구현
◦
변수 사용이 줄어들고, 코드 가독성도 좋아짐.
•
1개 이상의 base case(종료되는 상황)가 존재하고, 수렴하도록 작성
factorial 코드
재귀함수 주의 사항
•
base case에 도달할 때까지 함수를 계속 호출
•
메모리 스택이 넘치게 되면(stack overflow) 프로그램이 동작하지 않게 됨.
•
파이썬에서는 최대 재귀 깊이(maximum recursion depth)가 1000번으로,
호출 횟수가 이를 초과하면 Recursion Error 발생
반복문 재귀 함수 비교
•
알고리즘 자체가 재귀적인 표현이 자연스러운 경우는 재귀 함수 사용
•
재귀 호출은 변수 사용을 줄일 수 있음.
•
재귀 호출은 입력 값이 커질 수록 연산 속도가 오래 걸림
모듈과 패키지
•
모듈: 다양한 기능을 하나의 파일로
◦
특정 기능을 하는 코드를 .py 단위로 작성한 것
•
패키지: 다양한 파일을 하나의 폴더로
◦
특정 기능과 관련된 여러 모듈의 집합
◦
패키지 안에 또 다른 서브 패키지 포함
•
라이브러리: 다양한 패키지를 하나의 묶음으로
•
pip: 위의 것들을 관리하는 관리자
•
가상환경: 패키지의 활용 공간
모듈과 패키지 불러오기
import module
from module import var, function, Class
from module import *
from package import module
from package.module import var, function, Class
Python
파이썬 표준 라이브러리
파이썬 패키지 관리자 (pip)
•
PyPI(Python Package Index)에 저장된 외부 패키지들을 설치하도록 도와주는 패키지 관리 시스템
파이썬 패키지 관리자 (pip) 명령어
•
패키지 설치
최신 버전 / 특정 버전 / 최소 버전을 명시하여 설치 가능
◦
이미 설치되어 있는 경우, 설치되어 있음을 알리고 아무것도 하지 않음
•
패키지 삭제
pip는 패키지 업그레이드를 하는 경우 과거 버전을 자동으로 지워줌
•
패키지 목록 및 특정 패키지 정보
pip는 패키지 업그레이드를 하는 경우 과거 버전을 자동으로 지워줌
•
패키지 관리
◦
패키지 목록 관리와 설치가 가능
일반적으로 패키지를 기록하는 파일의 이름은 requirements.txt로 정의
사용자 모듈과 패키지
패키지
•
패키지는 여러 모듈/하위패키지로 구조화
◦
활용 예시: package.module
•
모든 폴더에는 __init__.py로 만들어 패키지로 인식
◦
Python 3.3부터는 파일이 없어도 되지만, 하위 버전 호환 및 프레임워크 등에서의
동작을 위해 파일 생성 권장
패키지와 모듈 만들기
•
계산 기능이 들어간 calculator 패키지를 아래와 같이 구성
◦
check.py에서 calculator의 tools.py의 기능 사용
폴더 구조
가상 환경
•
파이썬 표준 라이브러리가 아닌 외부 패키지와 모듈을 사용하는 경우 모두 pip를 통해 설치 필요
•
복수의 프로젝트를 하는 경우 버전이 상이할 수 있음
◦
과거 외주 플젝 django 2.x
◦
신규 회사 플젝 django 3.x
→ 이런 경우 가상 환경을 만들어 프로젝트 별 독립적인 패키지 관리 가능
•
가상 환경을 만들고 관리하는데 사용되는 모듈 (Python 3.5부터)
•
특정 디렉토리에 가상 환경을 만들고, 고유한 파이썬 패키지 집합을 가질 수 있음
◦
특정 폴더에 가상 환경이(패키지 집합 폴더 등) 존재
◦
실행 환경(bash 등)에서 가상환경을 활성화
◦
해당 폴더에 있는 패키지 관리/사용
가상 환경 생성
가상 환경을 생성하면, 해당 디렉토리에 별도의 파이썬 패키지가 설치됨
가상 환경 활성화/비활성화
•
아래의 명령어를 통해 가상 환경을 활성화
◦
<venv>는 가상환경을 포함하는 디렉토리의 경로 (윈도우)
▪
cmd.exe: C:\> <venv>\Scripts\activate.bat
▪
PowerShell: PS C:\> <venv>\Scripts\Activate.ps1
•
가상 환경 비활성화: deactivate 명령어 사용
WIF (What I Felt)
•
어마어마한 양의 파이썬 내용들을 이틀동안 배우고 있다.
•
기존엔 코테 준비하며 야매로 익힌 파이썬 문법들이었는데,
개념과 원리를 제대로 배우고 있고 또 중간중간 새롭게 채워 넣는 부분들도 많다고 느껴진다.
◦
Conditional Expression / for-else / enumerate / List & Dictionary Comprehension / parameter / argument / *args / **kargs / scope / LEGB / nonlocal / filter / zip / module / package / pip
•
부족하다 느끼는 부분 그리고 새롭게 배운 부분을 잘 채워 넣어서,
앞으로 작성하는 파이썬 코드의 질을 더 높여야겠다!