욤미의 개발일지

[DAY 2] Python: Lecture 4 - Lecture 6 본문

NLP/STUDY

[DAY 2] Python: Lecture 4 - Lecture 6

욤미 2022. 10. 14. 23:45
728x90
반응형

[Lecture 4] Contition & Loop

조건문

  • 특정 조건이 만족될 경우 문장을 실행
  • 들여쓰기와 :으로 구분한다.
  • 들여쓰기의 convention은 스페이스 4칸(tab)
  • if 조건 : 조건을 검사하여 블록 실행
  • elif 조건 : 이전 조건과 맞지 않을 경우 조건을 다시 검사하고 실행
  • else 조건 : 모든 조건이 맞지 않을 경우 실행
  • “”, 0, None은 False와 동일하게 취급

삼항 연산자

  • value1 if condition else value2
    • condition이 참이면 value1
    • condition이 거짓이면 value2
  • 연산자이기 때문에 블록으로 구분되는 문법요소가 아니다.

반복문

  • for Element in Iterable
  • 주어진 객체(집합)을 순환 - 딕셔너리, 문자열 등
  • 조건을 만족하는 동안 반복해서 구문을 수행
  • range(start, end, step) 내장함수로 숫자 반복 생성 가능(Generator 반환)
    • end는 미포함
  • break: 가장 바깥의 반복문을 나가는 것이 가능
  • continue: 가장 바깥의 반복문의 처음으로 되돌아가기 기능

for-else : 반복문을 완전히 돌았을 경우 실행되는 블록 지정 가능하며 break로 중간에 나오게 되면 else문 실행X

 

[Lecture 5] Function

함수

  • 명령을 수행하는 일종의 기능 단위
  • 코드를 논리적으로 분리, 캡슐화
  • 필요한 경우 반복적으로 호출 가능
  • Return 명령어가 없으면 None 반환
  • 인자로 받은 값을 바로 수정하는 것은 권장하지 않음
def func(seq):
	seq = list(seq) # 복사
	seq += [1] # 원래 값을 수정하지 X

variable scope

  • 상위에 정의된 변수는 언제나 참조 가능
  • 함수내에 정의된 변수 이름은 그 함수 내에서만 유효
var1, var2 = 10, 20

def func(var2): # var2를 함수 내에서 재정의
	var2 += 1 # 위에 있는 var2와 다름
	print(var1 + var2) # 상위 변수 var1 읽기 가능
  • Global
    • 최상위에서 선언
    • 다른 파일에서 접근 가능
  • Local
    • 함수 안에 선언
    • 상위 함수에서는 접근 불가

상위 변수 사용 선언

  • 함수 맨 앞에 선언
    • global: 최상위 변수
    • nonlocal: 직상위 변수 사용 선언
  • 스파게티 코드의 주원인이므로 사용하지 않는 것을 권장함

Variable Capture

var = 1

def func():
	print(var)

var += 1
func()
  • 상위 값이 바뀌면 하위 값이 바뀜
  • 순수함수가 아님
    • 순수 함수: 인자 값이 같다면 반환 값도 같음
    • 환경을 포함하지 않기 때문에 closure라 볼 수 없음

스파게티 코드 주원인

  • 상위 객체엔 가능하면 접근하지 않기
  • 모두 파라미터로 받기
  • 최상위 선언도 가급적 지양

 

Closure 함수

 

Decorator

  • 함수 하나를 인자로 받아 같은 형태의 함수를 반환하는 함수
  • @를 사용해서 함수를 꾸미는데 사용 가능
  • 함수를 wrapping하기 때문에 기존 함수에 접근 불가능
    • docstring, 함수 이름 등 기존 함수의 특성을 가져와햐하기 때문에 from functools import wraps 를 사용한다.

재귀함수

  • 자기자신을 호출하여 반복적으로 수행
  • 수학 점화식과 동일
  • 반복문과 수학적으로 동치

함수 파라미터

  • 인자를 명시적으로 대입 가능
    • func(var1 = 10, var2 = 20)
  • 인자 기본값을 설정 가능
    • def func(var1, var2 = 20)
  • 기본값이 설정된 인자는 맨 뒤에 붙여서 써야한다.
    • def func(var1 = 10, var2) → 에러 발생

Variable Length Parameter

  • 인자 개수가 정해져 있지 않다면 *(Asterisk)를 사용해서 남은 인자 packing가능
  • 가변인자는 맨 만지막에 단 한개만 위치 가능
    • def func(a, b, *args)

Keyword Variable Length Parameter

  • 명시적으로 지정된 파라미터가 남는다면 키워드 가변인자 ** (Double asterisk)를 사용하여 남는 키워드 변수를 packing
    • def func(a, b, *args, **kwargs)
    • 딕셔너리 형태로 반환
  • 파라미터 순서: 일반 인자 → 기본값 → 인자 → 가변인자 → 키워드 가변 인자

Parameter Unpacking

  • Sequence(리스트, 튜플)에 *을 붙이면 unpacking 가능
  • Dictionary에 **를 붙이면 keyword unpacking

Type Hint

  • 파이썬은 동적 타이핑 → interface를 알기 어려움, 가독성이 떨어짐
  • 함수에 파라미터와 반환 값 타입 힌트 제공 가능
    • function(var: type) -> str
  • 타입을 안 맞춰서 에러는 안 남

 

[Lecture 6] Pythonic Programming

Comprehension

  • list, dictionary 등을 빠르게 만드는 기법
  • for + append보다 속도가 빠르다
result = []
for i in range(10):
	result.append(i*2)
result = [i*2 for i in range(10)]
result = {}
for i in range(10):
	result[str(i)] = i
result = {str(i):i for i in range(10)}
result = set()
for i in range(10):
	result.add(str(i))
result = {str(i) for i in range(10)}
  • if문으로 원하는 요소만 추가 가능
result = [i*2 for i in range(10) if i%2 == 0]
  • 이중 for문 사용 가능
result = [(i, j) for i in range(10) for j in range(i)]
'''
[(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2), (4, 0), (4, 1), (4, 2), (4, 3), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8)]
'''
  • 다차원 배열 만들기
result = [[int(i == j) for j in range(10)] for i in range(5)]
'''
[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 1, 0, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0], 
 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]
'''

Generator

range함수의 경우 숫자를 한씩 생성하여 반환

  • 이러한 요소를 하나씩 생성해서 반환하는 객체를 Generator라고 함
  • function에 yield를 사용할 시 generator가 됨
  • 다시 값을 요청 받으면 yield 다음 줄부터 실행
  • return되면 반복을 멈춤(stopiteration error 발생)
  • sequence 전체를 생성하는 것이 아니므로 메모리 효율적(큰 데이터 셋 처리에는 generator 사용 권장)
def my_range(stop):
	number = 0
	while number < stop:
		yield number
		number += 1

for i in my_range(5):
	print(i)

'''
0
1
2
3
4
'''
  • 괄호로 generator comprehension 형태로 선언 가능
even_generator = (i*2 for i in range(10))

 

Built-in Functions

  • sum(iterable): 합
  • all(iterable): 모두 True이면 True 반환
  • any(iterable): 하나라도 True이면 True 반환
  • max(iterable): 최댓값
  • min(iterable): 최솟값

 

zip

  • 2개 이상의 순호나 가능한 객체를 앞에서 부터 한번에 접근
  • 길이가 안 맞을 경우 남는 건 버림
for val1, val2, val3 for zip(seq1, seq2, seq3):
	print(val1, val2, val3)
  • unpacking으로 2차원 리스트의 열 단위 접근 역시 가능
for row in arr:
	print(row) # 행 단위 접근

for col in zip(*arr):
	print(col) # 열 단위 접근

seq2 = zip(*seq1)의 역 연산은 seq1 = zip(*seq2) 이다.

 

enumerate

  • for문이 sequence를 돌 때 그 index가 필요할 때 사용
for idx, word in enumerate(seq):
	print(idx, word)
  • enumerate와 zip 동시에 사용 가능
  • generator는 list 형태로 출력하기 위해서는 list()로 변환 필요
list(enumerate(['this', 'is', 'sentence']))
# [(0, 'this'), (1, 'is'), (2, 'sentence')]

 

lambda 익명함수

  • 함수의 이름 없이 빠르게 만들어 쓸 수 있는 익명 함수
  • 여러 줄을 쓸 수 없음
  • 공식적으로는 lambda 사용을 권장하지 X

map(function, iterable): 각 요소에 function 함수를 적용하여 반환

filter(function, iterable): 각 요소에 function 함수를 적용하여 참이 나오는 것만 반환

728x90
반응형
Comments