<Python Programming>
1. Condition & Loop
2. Function
3. Pythonic Programming
Condition & Loop
조건문(Conditional Statements)
- 특정 조건이 만족될 경우 실행할 문항을 설정
- 들여 쓰기와 ;로 구문을 구분
- 들여 쓰기의 Convention은 스페이스 4칸 (Tab 키를 눌러 삽입)
명령 1
명령 2
if <조건>:
if - 명령 1
if - 명령 2
명령 3
명령 4
- if [조건]: 조건을 검사하여 block 실행
- elif [조건]: 이전 조건과 맞지 않을 경우 조건을 다시 검사 및 실행
- else - 이전 모든 조건이 맞지 않을 경우 실행
삼항 연산자(Ternary Operators)
- [Value] if [Condition] else [Value2]
- Condition이 참이면 Value1을, 거짓이면 Value2를 반환
- 연산자이다
- 블록으로 구분되는 문법요소가 아님
- 다른 연산자와 조합 가능
- 우선순위가 가장 낮기 때문에 괄호 필수
>>>('odd' fi value % 2 else 'even') + '_number'
'even number'
반복문(Loop)
- 반복해서 구문을 수행
- 들여 쓰기와 :으로 구문을 구분
명령 1
명령 2
while <조건>:
while - 명령 1
while - 명령 2
명령 3
명령 4
While Statement
- 조건을 만족하는 동안 출력
For Statement
- Python의 For문은 주어진 객체를 순환하는 개념
- for [Element] in [Iterable]의 형태로 사용
- range 내장 함수로 숫자 반복 생성 가능(Generator 반환)
- range(start, end, step) 형태로 사용, End는 미포함!
- Generator: 리스트와는 다르게 숫자를 하나씩 생성 반환 (메모리 효율적)
Notions for Loop
- 반복문의 변수명은 일반적으로 i, j, k로 지정
- 반복문을 포함해서 프로그래밍에서 숫자의 시작은 대부분 0부터
- 반복문이 끝나지 않는 무한 loop에 주의
- 모든 순환이 가능한 객체는 for문을 적용하는 것이 가능
for key, value in {'a': 1, 'b': 2}.items()
print(key)
Controllinng Loop - Break & Continue
- Break문으로 가장 바깥의 반복문을 나가는 것이 가능
for i in range(1, 100):
if i % 17 == 0:
break # i가 17 이상이 되면 반복 나가기
print(i)
- Continue문으로 가장 바깥의 반복문의 처음으로 되돌아가기 가능
for i in range(100):
if i % 17:
continue # i가 17의 배수가 아니면 for 처음으로
print(i)
- Else문으로 반복을 완전히 돌았을 경우 실행되는 block 지정가능
- Break로 중간에 나오게 되면 Else 문이 실행되지 않음
Function
함수(Function)
- 코드를 논리적으로 분리, 캡슐화 용도
- 명령을 수행하는 일종의 기능 단위
- 필요한 경우 반복적으로 호출
- Retrun 명령어가 없는 경우 None을 반환
- 따로 paramter의 type을 지정할 필요 없다
- 인자로 받은 값을 바로 수정하는 것은 권장하지 않음
- 바깥의 state가 수정되어 의도치 않은 오류가 발생할 수 있음
def [function]([parameter1], [parameter2], ...):
function - 명령 1
function - 명령 2
return [value]
명령 1
명령 2
value = function(argument1, argument2)
명령 3
명령 4
Varibale Scope
- Python에서는 상위에 정의된 변수는 언제나 참조 가능
- 함수 내에 정의된 변수 이름은 그 함수 내에서만 유효
var1 = 10
var2 = 20
def function(var2): #var2를 이 함수 내에서 재정의
var2 += 1 #기존 var2와 다름
print(var1 + var2) # 상위 변수 var1 읽기 가능
function(var2)
print(var2)
Global & Nonlocal
- Global: 최상위에 선언, 다른 파일에서 접근 가능
- Local: 함수 안에 선언, 상위 함수에서는 접근 불가
var = 1
def main():
var = 10
def function1():
global var #Global: 최상위에 선언, 다른 파일에서 접근 가능
var += 1
def function2():
nonlocal var #Nonlocal: 바로 상위 변수
var += 1
- 스파게티 코드의 주원인이므로 사용하지 않는 것을 권장
Variable Capture
- 함수형 언어에서 쓰이는 Capture와 다름
- 상위 값이 바뀌면 하위 값이 바뀜
- 즉, 순수 함수가 아님
- 순수 함수: 인자 값이 같다면 반환 값도 같음
- 호나경을 포함하지 않기 때문에 closure라 볼 수 없음
- 프로그램을 스파게티로 만드는 주요 원인
1. 상위 객체엔 가능하면 접근하지 않기
2. 되는대로 모두 파라미터로 받기
3. 최상위 선언도 가급적 지양
- 가능한 순수 함수로 코드를 작성하기!
Closure
- Python에서 Closure는 Factory 형식으로 사용
- Python에서는 함수도 일반 객체이다
- 변수로 할당 가능, Argument & Return 가능
number = 10
def print_closure_factory(number): # Closure Function Factory
def print_closure(): # Closure 함수
print(number) # Factory의 변수를 사용 - Closer마다 고유한 변수
return print_closure # 만들어진 Closure를 반환
print_5 = print_closure_factory(5)
print_10 = print_closure_factory(10)
꾸밈자(Decorator)
- 함수 하나를 인자로 받아 같은 형태의 함수를 반환하는 함수
- @을 사용하여 함수를 꾸미는 데 사용 가능
- Decorator에 인자를 추가하기 위해선 함수를 한번 더 wrapping 필요
- 함수를 wrapping 하기 때문에 기존 함수에 접근 불가
def times_decorator_factory(times): # 인자를 받아 Decorator를 만듦
def times_decorator(function): # 함수를 받아 꾸밈
def closure(var): # 꾸며진 함수
for _ in range(times):
var = function(var)
return var
return closure
return times_decorator
@times_decorator_factory(5) # Decorator에 인자 추가
def add(number):
return number + 2
print(add(5))
- Docstring, 함수 이름 등 기존 함수의 특성을 가져올 필요가 있음
- functools 라이브러리의 wraps 데코레이터 사용
재귀 함수 (Recursive Function)
- 자기 자신을 호출하여 반복적으로 수행
- 수학의 점화식과 동일
- 재귀 함수와 반복문은 수학적으로 등치 (서로 변환 가능)
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
Function Parameteres
- 인자를 명시적으로 대입 가능
function(var2=10, var1=10)
- 인자 기본값을 설정 가능
def function(var1, var=10)
- 기본값이 설정된 인자는 맨 뒤에 붙여서 써야만 함
def function(var1, var2, var3=10)
가변인자 (Variable Length Parameter)
- 인자 개수가 정해져 있지 않을 시
- * (Asterisk)를 사용하여 남은 여러 인자를 Packing 가능 - Tuple로 반환
- 가변인자는 맨 마지막에 단 한 개만 위치 가능
def add_all(a, b, *args) # 관습적으로 가변인자는 args를 사용.
키워드 가변인자 (Keyword Variable Length Paramter)
- 만약 명시적으로 지정된 파라미터가 남는다면 키워드 가변인자 사용
- ** (Double asterisk)를 사용하여 남는 키워드 변수를 Packing
- Dictionary 형태로 반환
def print_args(a, *args, **kwargs) # 관습적으로 키워드 가변인자는 kwargs 사용
- 파라미터 순서: 일반 인자 - 기본값 인자 - 가변인자 - 키워드 가변인자
Parameter Unpacking
- Sequence에 *을 붙이면 Unpacking
- 리스트, 튜플에 적용 가능
def function(a, b, c):
print(a, b, c)
l = [1, 2, 3]
function(*1) #1 2 3
- Dictionary에 **을 붙이면 Keyword Unpacking
Type Hints
- Python은 동적 타이핑 - interface를 알기 다소 어려움
- 함수에 타입 힌트 제공 가능
def multply_text(text: str, n: int) -> str # "인자 text는 string 타입, n은 int타입, 반환 값은 str 타입입니다."
- 그러나 딱히 타입을 안 맞춰도 에러는 안 남
Pythonic Programming
Comprehension
- List, Dictionary 등을 빠르게 만드는 기법
- for + append 보다 속도 빠름
result = [i * 2 for i in range(10)]
evens = [i for i in range(100) if i % 2 == 0] # if 문을 마지막에 달아 원하는 요소만 추가 가능
result = [(i, j) for i in range(5) for j in range(i)] # 겹 for문 사용 가능
eye = [[int(i == j) for j in range(5)] for i in range(5)] # 다차원 배열 만들기가 매우 유용
Generator
- range 함수의 경우 숫자를 하나씩 생성하여 반환
- 이러한 요소를 하나씩 생성해서 반환하는 객체를 Generator라고 함
- function에 yield를 사용할 시 Generator가 됨
- yield 하는 위치에서 값을 반환
- 다시 값을 요청받을 시 yield 다음 줄부터 실행
- Return 될 시 반복을 멈춤
- 메모리 효율적이므로 매우 큰 Data Set을 처리할 땐 Generator 사용 권장
def my_range(stop):
number = 0
while number < stop:
yield number
number += 1
- 괄호로 Generator Comprehension 형태로 선언 가능
even_generator = (i * 2 for i in range(100))
내장함수 (Built-in Functions)
- sum([Iterable])
sum(i for i in range(1, 100) if i % 2 == 0)
- any([Iterable]), all([Iterable])
any([False, True, False]) # 하나라도 참, True
all([False, Ture, False]) # 모두 참, False
- max([Iterable]), min([Iterable])
max([1, 2, 3, 4, 5])
min([5, 4, 3, 2, 1])
- map([function], [iterable])
- 각 요소에 function 함수를 적용하여 반환
seq = [1, 2, 3, 4, 5]
list(map(lambda x: x *2, seq)) # [2, 4, 6, 8, 10]
- filter([function], [iterable])
- 각 요소에 function 함수를 적용하여 참이 나오는 것만 반환
seq = [1, 2, -3, 4, -5]
list(filter(lambda x: x > 0, seq)) # [1, 2, 4]
Lambda Function
- 함수의 이름 없이 빠르게 만들어 쓸 수 있는 익명 함수
- 수학에서의 람다 대수에서 유래
- lambda [param1], [param2], ...: [expression]
- 여러 줄을 쓸 수 없음
- if, else, for 등 사용 불가 (오직 연산자 expression만 사용 가능)
- 공식적으로는 Lambda의 사용을 권장하지 않음
- 문서화 지원 미비
- 이름이 존재하지 않는 함수가 생성
- 복잡한 함수 lambda로 작성할 시 가독성 하락
'Python' 카테고리의 다른 글
| Colab Runtime 유지 (0) | 2022.08.01 |
|---|---|
| I&O, Setting & Exception & Logging, Web (0) | 2022.05.01 |
| Advanced Data Structure & String (0) | 2022.04.28 |
| OOP, Module & Package (0) | 2022.04.27 |
| Python Basic (0) | 2022.04.25 |