Search
📝

TIL 22/07/20 (수)

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에서 calculatortools.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
부족하다 느끼는 부분 그리고 새롭게 배운 부분을 잘 채워 넣어서, 앞으로 작성하는 파이썬 코드의 질을 더 높여야겠다!