파라미터, 아큐먼트, return, *args, **kwargs, 전역변수, 지역변수, Inner Funtion, lambda함수, Map, Filter, Reduce, Decorlator

함수

1.기본함수

2.파라미터와 아규먼트

  • 파라미터 : 함수선언시 값을 받는 변수명
  • 아규먼트 : 함수호출시 값을 전달하는 데이터

디폴트 파라미터

def minus(num1, num2=10):
    print(num1 - num2)
minus(3)
minus(3, 5)
---
> -7
> -2
# 디폴트 파라미터는 항상 가장 뒤에 선언이 되어야 합니다.
def minus(num1, num3, num2=10, num4=100):
    print(num1 - num2 - num3 - num4)

minus(5, 3)
minus(5, 3, 20)
---
> -108
> -118

키워드 아규먼트

def minus(num1, num2):
    print(num1 - num2)

minus(3, 2) # 순서대로 파라미터에 대입
minus(num2=5, num1=2) # 순서에 상관없이 키워드값으로 매핑되서 파라미터에 대입
---
> 1
> -3
print("test", end="\t")
print("test2")
> test	test2

3.리턴

# 여러개의 데이터를 리턴
def echo(a, b):
    return a, b

data1, data2 = echo("fast", "campus")
data1, data2
---
> ('fast', 'campus')
# 함수를 중간에 종료 시킬때 사용됩니다.
def test_func(number):
    if number > 10:
        print("error")
        return
    print(number)
test_func(15)
---
> error

4. *args, **kwargs

  • *args : 한꺼번에 여러개의 아규먼트 데이터를 받아올때 사용
  • **kwargs : 한꺼번에 여러개의 키워드 아규먼들 받아올때 사용

*args

def plus(*args):
    return sum(args)
plus(1, 2, 3, 4)
---
> 10
ls = [1, 2, 3, 4]
# plus(ls) #의미: plus([1, 2, 3, 4])
plus(*ls) #의미: plus(1, 2, 3, 4)
---
> 10
ls = (1, 2, 3, 4)
# plus(ls) #의미: plus((1, 2, 3, 4))
plus(*ls) #의미: plus(1, 2, 3, 4)
---
> 10
ls = {1, 2, 3, 4}
# plus(ls) #의미: plus({1, 2, 3, 4})
plus(*ls) #의미: plus(1, 2, 3, 4)
---
> 10

**kwargs

def avg_func(**kwargs):
  print(kwargs)
---
avg_func(korean=90, math=80, english=60, science=90)
> {'korean': 90, 'math': 80, 'english': 60, 'science': 90}
# *args **kwargs 함께 사용
def test(*args, **kwargs):
    print(args)
    print(kwargs)
test(1, 2, 3, fast=10, campus="test function")
---
> (1, 2, 3)
  {'fast': 10, 'campus': 'test function'}

5.Docstring

  • 함수에 대한 설명을 할때 사용한다.

6.Scope

  • 전역변수와 지역변수.

7.Inner Funtion

  • 함수 안에서 선언된 함수
  • 지역 함수
  • 자원을 효율적으로 사용하기 위함
def outer(a, b):

    def inner(c, d):
        return c + d

    return inner(a, b)

outer(3, 5)
---
> 8
def outer():

    def inner(c, d):
        return c + d

    return inner

outer()(3, 5)
---
> 8
def plus(c, d):
    return c + d

def minus(c, d):
    return c - d

def outer(func, a, b):
    return func(a, b)
outer(plus, 5, 3)
outer(minus, 5, 3)
---
> 8
  2

8.Lambda Function

  • 함수를 한줄로 간결하게 만들 때 사용한다.
  • 익명함수이기 때문에 한번 쓰이고 다음줄로 넘어가면 heap 메모리 역역에서 증발한다.
plus = lambda a, b: a + b
plus(1, 2)
---
> 3
def calc(f, x, y):
  return f(x, y)
calc(lambda a, b : a + b, 5, 3)
---
> 8

9. Map, Filter, Reduce

Map

  • 입력받은 자료형의 각 요소가 함수(f)에 의해 수행된 결과를 묶어서 리턴하는 함수이다.
def two_times(x):
  return x*2
list(map(two_times, [1,2,3,4,]))
---
> [2, 4, 6, 8]

lambda와 map 함께 사용하기

list(map(lambda x, y : x + y, ls1, ls2))
---
> [6, 8, 10, 12]
#map에 여러개의 파라미터 사용하기
ls1 = [1, 2, 3, 4]
ls2 = [5, 6, 7, 8]
def sum_func(a, b):
  return a + b
list(map(sum_func, ls1, ls2))
---
> [6, 8, 10, 12]

Quiz

# 문제: map을 이용하여 name의 성만 출력하는 코드를 작성
names = ["kim test", "Lee python", "PARK macbook"]
list(map(lambda name : name.split(" ")[0].upper()[0] + name.split(" ")[0].lower()[1:] , names ))
---
> ['Kim', 'Lee', 'Park']

Filter

Reduce

ls = [3,1,5,7,1]
reduce(lambda x, y : x + y , ls)
=> 17

reduce(lambda x, y : x if x > y else y , ls)
=> 7

10. Decorlator

  • 코드를 바꾸지 않고 함수의 기능을 추가 및 수정 하고 싶을때 사용하다.
  • 함수에서 공통된 코드 부분을 따로 묶어서 관리할수 있는 장점이 있다.
  • 지역함수와 args, **kwargs 구현합니다.
def A():
  code_1
  code_2
  code_3

def B():
  code_1
  code_4
  code_3

def C(func):
  def wrapper(*args, **kwargs):
    code_1
    func(*args, **kwargs)
    code_3
  return wrapper

@C
def A():
  code_2

@C
def B():
  code_4
def sum_int(a,b):
  return a+b

  def disp_func(func):
    def wrapper(*args, **kwargs):
      result = func(*args, **kwargs)
      print("function name", func.__name__)
      print("args", args)
      print("kwargs", kwargs)
      print("result : ", result)
      return result
    return wrapper

데코레이터를 안쓰고 데코레이터와 비슷하게 구현

new_sum_int = disp_func(sum_int)
new_sum_int(5,7)
=> function name sum_int
   args (5, 7)
  kwargs {}
  result :  12
  12

데코레이터 사용하기

@disp_func
def sum_int(a, b):
    return a + b

sum_int(5,7)
=> function name sum_int
   args (5, 7)
   kwargs {}
   result 12
   12

데코레이터 함수를 이용해서 함수에 아이디를 입력하면 아이디가 저장되어 있으면 패스워드를 알려주는 코드

admin_ls = ["fast", "campus"]
pw = "qwer1234"

def admin(func):
  def wrapper(*args, **kwargs):
    result = func(*args, **kwargs)
    if result in admin_ls:
      print("allow permission")
      print("pw", pw)
      is_admin = True
    else:
      print("you are not admin")

    return is_admi
  return wrapper

@admin
def input_id():
  return input("insert id :")
input_id()
=> insert id : fast
   allow permission!!
   pw qwer1234
   True

태그:

카테고리:

업데이트: