본문 바로가기

Python

Python Programming

<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