강의목표

1. 기본 자료형 및 시퀀스를 이용한 사용자 함수를 만들어서 연동할 수 있다.
2. 클래스 생성 후 연동할 수 있다.

 

============================================================================

[형식]

def 함수명(매개변수, 매개변수=초기값, *args, **args):
    명령수행문
    return 값

함수의 선언과 호출
  - 함수는 호출되면 함수의 정의부로 이동해 함수의 모든 내용을 순차적으로 실행한 후
    함수가 종료되면 호출되었던 곳으로 돌아온다.


  - 함수를 호출할 때는 함수명()으로 호출하고 매개변수가 있는 함수를 호출할 때에는 함수의 원형에
    맞는 매개변수의 자료형과 같은 값을 매개변수로 전달해야만 호출이 가능하다.
    => 함수는 배개변수로 초기값을 지정할 수가 있고 *args로 지정하게 되면 tuple타입이 선언된다.
    => 일반매개변수, 가변매개변수가 선언될 때에는 가변매개변수는
         반드시 일반매개변수 뒤에 하나만 선언된다. **args로 지정하게 되면 dict타입이 선언된다.


  - 함수는 크게 [return 값]이 생략된 함수와 datatype의 return값을 가진 원형으로 구분되며
    return문을 생략하면 None을 반환하고 return값이 있으면 함수는 결과값을 호출된 모듈로 보낸다.


  - 함수를 호출할 때에는 "함수명(매개변수)"의 형태로 호출하며 매개변수(parameter)는 호출된 
    함수에 전달할 초기값을 대입할 변수를 의미하고 argument는 호출할 때 전달할 값을 의미한다.


  - 함수의 매개변수 전달 특징
    1) argument들은 위치나 parameter 이름으로 전달된다.
    2) parameter는 기본값(초기값)을 제공할 수 있다.
    3) argument들은 tuple을 대입할 수 있도록 함수를 정의할 수 있다. : *args
    4) argument들은 dictionary를 대입할 수 있도록 함수를 정의할 수 있다. : **kwargs

# 매개변수, 매개변수 초기값
def getA(a, b = 3):                     # 초기값이 있는 parameter는 뒤에 두는 것을 권장
    print(a, b)

getA(1)
getA(1, 2)
getA(b = 1, a = 2)                      # parameter를 지정해서 넣는 것도 가능


# result
1, 3
1, 2
2, 1


# 함수의 가변인자값 전달
def my_fun(a, *args, **kwargs):         # a는 일반, args는 튜플, kwargs는 딕셔너리
    print("a =", a)
    print("args =", args)
    print("kwargs =", kwargs)
    
my_fun(11)
my_fun(11, [22, 33], 44)                # 일반에 들어가고 남은 것은 전부 tuple로 들어간다
my_fun(11, [22, 33], 44, id='vszealot', pw=1234)
                                        # dictionary에 넣으려면 위와 같은 방법으로 넣는다


#result
a = 11, args = (), kwargs = {}
a = 11, args = ([22, 33], 44), kwargs = {}
a = 11, args = ([22, 33], 44), kwargs = {'id': 'vszealot', 'pw': 1234}

 

============================================================================

람다함수(lambda)
  - 람다 대 수학(lambda calculus)에서 유래된 이름으로 익명함수라고 한다.
  - 함수의 이름이 없는 함수로 파이썬에서 lambda라는 키워드로 익명함수를 정의
  - 간단한 기능의 함수가 컨테이너의 요소로 들어가는 경우,
    혹은 다른 함수의 인자로 함수를 넘겨줄 때 사용되며 한 줄로 표시되는 함수로 정의
  - filter(), map(), reduce() 등의 함수를 사용할 때 유용하다.

[형식]
lambda 인자1, 인자2,,, : 명령(표현식)

# 두 수를 더해서 출력 - 함수
def add(x, y):
    return x + y

print(add(3, 5))


#result
8


# 두 수를 더해서 출력 - 람다
print((lambda x, y : x + y)(3, 5))


#result
8

 

============================================================================

파이썬의 고차함수(high - order function)
  - filter(), map(), reduce() 등의 함수, 주로 람다를 응용해서 사용

filter(function, list) : 함수와 순서형 즉 리스트를 매개인자로 받아서 리스트의 값이 하나씩 함수에
                          인수로 전달되어 조건에 맞는 결과인 True가 되는 반환값만을 따로 모아서
                          리스트의 형태로 반환한다.

map(function, seq) : 함수와 시퀀스자료형을 입력받아서 시퀀스자료형의 각각의 요소가 하나씩
                           함수에 인수로 전달되어 리턴되는 출력값을 묶어서 리스트로 리턴하는 함수

reduce(func, seq) : 함수와 시퀀스자료형을 입력받아서 시퀀스자료형의 두 개의 요소가
                         함수에 인수로 전달되어 연산을 한 후, 그 결과값을 그 다음 항목과
                         계속 연산하여  하나의 값을 리턴한다.

재귀함수(recursive): 함수가 직접 또는 간접적으로 자기 자신을 다시 호출하는 것
재귀호출(recursive call): 메모리를 많이 소모하게 되며 처리속도 또한 상대적으로 느리지만
                                작성하는 코드가 간결해지고 이해하기 쉽다.
재귀호출 quick sort, tower of hanoi, Fractal curve 등의 알고리즘을 구현할 때 사용된다.

# filter(func, seq)
print(tuple(filter(lambda x: x % 2 == 0, range(10))))


# map(func, seq)
print(tuple(map(lambda x: x % 2 == 0, range(10))))


# reduce(func, seq)
from functools import reduce                 # reduce함수는 functools 모듈을 import해야 사용가능
print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5, 6, 7, 8, 9]))


#재귀함수
def sum_n(n):
    if n == 1:
        return 1
    else:
        return n + sum_n(n - 1)
        
print(sum_n(9))


#result
(0, 2, 4, 6, 8)
(True, False, True, False, True, False, True, False, True, False)
45
45

 

============================================================================

OOP(Object Oriented Programming)란?
  - 객체 지향 프로그램을 말한다. 데이터 처리를 하는 메소드들을 하나의 프로그램으로 설계해서
    연동하는 객체(Object)를 중심으로 프로그램을 짜는 언어를 말한다.
  - python은 대화적이고(Interactive), 인터프리터(interpreter)되는 객체 지향 프로그래밍 언어이다.
  - 파이썬은 모든 것이 객체이다.

 

클래스와 객체란?
  - 클래스는 객체 지향 프로그램의 기본적인 
    사용자 정의 데이터형(user define data type)이라고 할 수 있다.
  - 클래스는 객체를 정의한 것으로 실세계에서 존재하는 사물이나 개념의 속성과 기능을
    모델링해서 추상화시키는 과정을 말한다.
  - 객체는 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다.
    객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.
  - 객체는 클래스의 인스턴스이며 정의된 클래스를 사용해서 
    실제로 메모리에 생성되어 메모리에 로딩된 상태를 말한다.
  - 객체는 클래스의 타입으로 선언됐을때를 의미하는 것이고 그 객체가 메모리에 할당되어
    실제 사용될 때 인스턴스라고 한다.

객체    = 속성(Attributes) + 행위(Behaviors)
클래스 = 변수(Variable) + 메소드(Methods)

  - 객체는 멤버 변수를 가지고 있으면서 그들의 동작을 수행하는 함수들을 가지게 되는데 메소드라고 부른다
    메소드는 객체를 사용하기 위해 필요한 모든 이벤트들을 처리하는 함수이다

 

============================================================================

번외1

ord(char) : char문자의 unicode값을 리턴
chr(int)   : 해당 숫자의 char문자를 리턴

# ord(char), chr(int)
print(ord('A'))
print(chr(65))


#result
65
A

번외2

스코핑룰(scoping):
파이썬에서 사용되는 함수, 클래스 등이 선언되면 변수를 사용하게 되는데
선언한 변수를 저장할 때 네임스페이스에 저장하고 호출한다.
이 때 네임스페이스 영역의 우선순위에 따라 호출되어지는 룰을 말한다.

파이썬의 네임스페이스는 세가지로 분류된다. 변수가 호출되는 우선순위를 약어로 LGB규칙
Local : 함수 내부에 선언될 때의 영역
Global : 함수 외부에 선언될 때의 영역
Built-in : 내장함수의 영역

# 스코핑룰, LGB규칙
lgb = "Global"

def lgb_test():
    lgb = "Local"
    print(lgb)
    
lgb_test()
print(lgb)


#result
Local
Global

+ Recent posts