All ContentsCategoryAbout

CS Study 04

19 June, 2020 - Computer Science - 4 min read

함수

  • Namespace : 변수가 출력될 때 본인과 가까운 순서로 실행되며 그 영역을 namespace라고 함. 변수가 저장된 공간.
a=10
def f():
    t=10
    def g():
        b=20
        def h():
            nonlocal b #다른 지역 변수 b를 선택
            b=30
            print(b,'in h')
        h()
        print(b, 'in g')
    g()
f()
  • Stack frame: 함수가 실행될 때 쌓이는 메모리 공간(자바스크립트의 call stack)

인자 전달 방식에 따른 함수의 구분

  • call by value : 값을 가져와서 스택을 쌓음. 스택 밖으로 넘어갈 수는 없음.
  • call by reference : 주소값을 가져와서(참조하여) 스택을 쌓음. 스택을 넘어서 값을 가져오거나 수정이 가능함.
  • call by object reference
  • immutable object는 함수 내부에서 값을 변경할 수 없다.

First - Class Function

  • 프로그래밍 언어 중 함수를 다른 변수와 동일하게 다루는 언어를 함수우선순위(First-class function)를 가졌다고 표현합니다. 예를 들어 함수를 다른 함수의 전달인자(Argument)로 사용하고, 함수에서 함수를 리턴하거나 변수의 값으로 함수를 할당할 수 있습니다.

출처

First-Class function은…

  • 함수를 인자(argument)로 전달
  • 함수를 리턴(return) 값으로 전달
  • 함수를 변수에 전달

익명 함수

  • 이름이 없는 함수
  • 몇 번 사용 안 할 때 주로 씀
def func(a, b):
    return a + b

# 람다는 반드시 리턴이라서 return 생략
f = lambda a, b: a + b

li=[3, 2, 5, 6, 1, 8]
li2=li.copy()

li2.sort(reverse=True)

li2.sort(key=lambda x: x%2==2, reverse=True)

list comprehension

li2=[i*2 for i in range(1, 101)]

map, filter, reduce

  • lazy evaluation(게으른 연산)
  • map : for와의 차이점은 연산의 실행 시점을 주도적으로 정할 수 있다는 점.
li=[1, 2, 3, 4]
m=map(lambda x: x**2, li)
next(m)
  • filter : 기준을 정하여 원하는 값만 걸러냄
li=[5, -4, 3, -2, 6]
f=filter(lambda x: x > 0, li)
next(f)

filter와 map의 동시 사용 예시

li=[4, -2, 5, 3]
list(map(lambda x: x**2 ,filter(lambda x: x > 0, li)))
  • reduce: 원하는 값이 나올 때까지 리스트를 줄여줌
# 최대값 구하기
li=[5, 2, 7, 13, 2, 6, 10]
reduce(lambda a, b: a if a > b else b, li)

삼항 연산자(python)

a=10
# 참일 때 값 if 조건문 else 거짓일 때 값
string='big' if a > 7 else 'small'

예제

li=['a', 'b', 'c', 'd', 'a', 'a', 'a', 'b', 'c']

#result
#dic={'a' : 4, 'b' : 2, 'c' : 2, 'd' : 1}

#use
#dic.get()
#dic.update() or dic

reduce(lambda dic, ch: dic.update({ch : dic.get(ch, 0)+1}) or dic, li, {})
  • reduce는 내장함수가 아니라서 from functools import reduce 추가해야 함

클로저(closure)

  • 함수 내부에 상태 정보를 저장해두고, 함수 결과가 이 내부의 상태 정보에 따라 출력 결과가 달라짐.
  • 일반적인 함수(function)은 하나의 input에 대해 하나의 output만을 가짐. 하지만 method, closure부터는 이 법칙이 깨짐.
  • (과거에)OOP를 쓸 수 없을 때 울며 겨자 먹기로 썼다.

지역변수(local variable)가 필요한 이유

  • 함수가 실행 도중에 결과 데이터를 저장하기 위해서
  • 상태정보: 특정한 데이터의 현재 상태

스택프레임(stack frame) 존재의 이유

  • 어떤 함수가 실행될 때 필요한 상태정보를 저장하기 위해 -> 상태정보는 지역변수가 지정

계좌 클로저 함수

  • 상태값에 따라 결과값이 달라짐?
def account(cus_name, balance):
    def inner(money):
        nonlocal balance
        balance+=money
        return cus_name, balance
    return inner

my_acnt = account('greg', 5000)
your_acnt = account('john', 300)

my_acnt(500)
#('greg', 5500)
your_acnt(500)
#('john', 800)

선형 탐색(Linear Search)

li=[5, 4, 3, 1, 2, 10, 25]
target = 3
def linear_search(li, target):
    for idx in range(len(li)):
        if li[idx] == target:
            return idx
    return None
linear_search(li, target)

알고리즘 성능 평가

  • 절대 시간 X
  • 상대 시간으로 측정: 연산 횟수, 최악의 경우
  • 선형탐색의 소요 시간은 n에 바례

이진 탐색(Binary Search)

  • 데이터가 정렬되어 있어야 함(필수)
def binary_search(li, target):
    """
    binary_search(li, target) -> idx
    타겟을 찾았다면 인덱스 반환
    찾기 못 하면 None
    """
    pass

© 2023 intzzzero, Built with

Gatsby