Posts 함수(2)
Post
Cancel

함수(2)

1. 실습


1.1 문장을 입력받아 문법에 맞도록 결과를 출력하는 코드를 작성

  • 마지막 문자는 .이 있을수도 있고, 없을수도 있음
  • 논리적인 문제 해결 순서 -> 코드로 변경
  • python IS the best language -> Python is the best language
1
2
3
4
5
6
7
8
9
# 문장을 입력받음
sentence = input('문장을 입력하세요 : ')
result = sentence.lower()
result = result[0].upper() + result[1:]

if result [-1] != '.':
    result += '.'

result
1
2
문장을 입력하세요 :  python is best language
'Python is best language.'
  • 입력받은 문장의 offset index를 활용하여 맨 앞을 upper로 대문자로 바꾸고 나머지 뒤에 애들을 더함
  • 그리고 만일 맨 뒤에 . 이 없다면 추가하는 if문을 추가함


1
2
3
4
5
6
7
8
9
10
# 문장을 입력받음
sentence = input('문장을 입력하세요 : ')
result = sentence.lower()
# result = result[0].upper() + result[1:]
result = result.capitalize()

if result [-1] != '.':
    result += '.'

result
1
2
문장을 입력하세요 :  python is best language
'Python is best language.'
  • 위의 코드에서 upper 대신에 capitalize를 써도됨


1.2 로또 생성기

  • 6자리 로또번호를 생성하는 코드 작성
  • 6자리 번호는 중복 안됨
  • 문자열, 숫자, 리스트는 무관
  • while, not in, in, append, break, len
1
2
3
4
5
6
7
8
9
10
11
import random
lotto = []
while True:
    number = random.randint(1,45)
    if number not in lotto:
        lotto.append(number)
        
        if len(lotto) == 6:
            lotto.sort()
            break
lotto
1
[8, 19, 29, 32, 34, 43]
  • random의 randint를 활용하여 1 ~ 45까지의 숫자를 생성
  • append로 생성한 숫자를 넣으며, not in을 활용하여 기존에 append된 숫자가 나오면 append하지 않음
  • 마지막으로 if문을 활용하여 lotto 리스트의 길이가 6이 되면 break하게 만듬


2. 함수(2)


2.1 학습할 함수들

  • docstring
  • scope
  • inner function
  • callback function
  • lambda function
  • map, filter, reduce
  • decorlater


3. Docstring


3.1 Docstring이란?

  • 함수의 설명을 작성하는거
1
2
3
def echo(msg):
    'echo pring msg'
    print(msg)
1
2
3
4
5
6
7
8
9
10
def echo(msg) :
    """
    echo func return its input agument
    The operation is
        1. print msg parameter
        2. return msg paremeter
    param : msg : str
    return : str
    """ #여러줄로 docstirng 작성 멀티라인
    print(msg)
  • def로 함수선언과 코드 사이에 작성하면 docstring이 작성됨
  • 여러줄로 작성하기 위해서는 “”” “”” 을 사용하면 됨


3.2 Docstring 보는법

1
echo?
1
2
3
4
5
6
7
8
9
10
Signature: echo(msg)
Docstring:
echo func return its input agument
The operation is
    1. print msg parameter
    2. return msg paremeter
param : msg : str
return : str
File:      ~/Desktop/DataScience/FastCampus/Datascienceschool12th/1semester/00. Python/01_Python_basic/<ipython-input-5-48f4f38cf256>
Type:      function
  • 함수?


1
echo??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Signature: echo(msg)
Source:   
def echo(msg) :
    """
    echo func return its input agument
    The operation is
        1. print msg parameter
        2. return msg paremeter
    param : msg : str
    return : str
    """ #여러줄로 docstirng 작성 멀티라인
    print(msg)
File:      ~/Desktop/DataScience/FastCampus/Datascienceschool12th/1semester/00. Python/01_Python_basic/<ipython-input-5-48f4f38cf256>
Type:      function
  • 함수??


1
help(echo)
1
2
3
4
5
6
7
8
Help on function echo in module __main__: 
echo(msg)
    echo func return its input agument
    The operation is
        1. print msg parameter
        2. return msg paremeter
    param : msg : str
    return : str
  • help(함수)


1
print(echo.__doc__)
1
2
3
4
5
6
    echo func return its input agument
    The operation is
        1. print msg parameter
        2. return msg paremeter
    param : msg : str
    return : str
  • print(함수.__doc__)


  • 그 외 shift + tap

4. Scope


4.1 Scope(범위)

  • 함수 안에서 선언되는 변수와 함수 밖에서 선언되는 변수의 범위가 다름
  • global(전역), local(지역)
  • 함수 호출시 우선 순위는 local
  • 함수안의 변수는 함수가 호출되어야 메모리를 사용
  • 함수안에서 local변수가 선언되어도 global 변수는 변동이 없음
  • 위의 문제를 해결하기 위해 함수안에서 global + 변수의 예약어를 사용


4.2 Global

1
2
3
4
5
6
gv = 10 #global

def echo():
    print(gv)
    
echo()
1
10
  • 전역(global)으로 설정된 gv가 echo함수를 통해 print됨


4.3 Local

1
2
3
4
5
6
7
gv = 10 # global

def echo():
    gv = 100 # local
    print(gv)
    
echo()
1
100
  • 전역으로 설정된 gv가 있어도, 함수 내부에 지역으로 설정된 gv가 우선순위가 되어 echo 함수를 실행하면 지역의 gv가 print됨


1
2
3
4
5
6
7
8
9
gv = 10

def echo():
    global gv # global + 함수 예약어를 써주어야 global 변수가 변경됨
    print(gv, 'global')
    gv = 100 # local
    print(gv, 'local')

echo()
1
2
10 global
100 local
  • 만일 함수내부에서 전역 변수를 써야한다면 global이라는 예약어를 써주면됨


5.Inner Function


5.1 Inner Function이란

  • 함수가 지역영역에 선언
  • 함수 안에 함수가 선언
  • 지역 함수는 전역 영역에서 사용이 불가함
1
2
3
4
5
6
7
def outer(a, b):
    
    def inner(c, d):
        return c + d
    
    return inner(a, b)
outer(1, 2)
1
3
  • outer 함수에 inner 함수를 선언하여 사용
  • outer 함수를 실행하면 inner 함수까지 같이 실행됨


1
2
# 지역 함수는 전역영역에서 사용이 불가
inner(1, 2)
1
2
3
4
5
6
7
8
9
10
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-125-674f543a8bd9> in <module>
      1 # 지역 함수는 전역영역에서 사용이 불가
----> 2 inner(1, 2)


NameError: name 'inner' is not defined
  • 하지만 지역함수는 따로 전역영역에서 단독으로 사용이 불가능


1
2
3
4
5
6
7
# return으로 함수를 선안하면 전역에서도 함수를 사용가능 (단, 단독으로 사용은 안됨, 변수를 2개 선언해주어야함)
def outer(a, b):
    
    def inner(c, d):
        print(1, 2)
        return c + d
    return inner
1
outer(1, 2)(3, 4)
1
2
1 2
7
  • return으로 함수를 선언하면 전역에서도 함수를 사용가능
  • 하지만 단독으로 사용은 안됨
  • 위의 코드는 outer(a,b)(c,d)로 실행됨


1
2
3
4
5
6
# 위의 함수와 똑같지만, outer 함수를 호출하면 global에서 inner를 찾기 때문에 메모리를 사용
def outer(a, b):
    return inner(a, b)

def inner(c, d):
    return c + d
1
outer(3, 4)
1
7
  • 위의 함수와 똑같지만, outer 함수를 호출하면 global에서 inner를 찾기 때문에 메모리를 사용하게된다
  • 메모리 이슈 때문에 inner 함수를 사용함


6. Callback Function


6.1 Callback Function이란

  • 함수를 아규먼트 파라미터로 설정해서 사용
1
2
3
4
5
6
7
8
def calc(func, a,  b):
    return func(a, b)

def plus(a, b):
    return a + b

def minus(a, b):
    return a - b
1
calc(plus, 1, 2)
1
3
  • Callback Function은 함수안에 파라미터로 함수를 받는것
  • 위의 코드에서 calc는 Callback Function이고 plus는 일반 함수이다


7. Lambda Function


7.1 Lambda Function이란?

  • 파라미터를 간단한 계산으로 리턴되는 함수 : 삼항연산자
1
2
3
def plus(a , b):
    return a + b
plus(1, 2)
1
3
  • 일반 함수로 만드는 코드


1
2
plus2 = lambda a, b : a + b
plus2(1, 2)
1
3
  • (함수명) = lambda a, b(파라미터부문) : a + b(리턴되는 부분)


8. Map, Filter, Reduce


8.1 Map

  • 순서가 있는 데이터 집합에서 모든 값에 함수를 적용시킨 결과를 출력
  • map 으로 끝나면 그대로 출력이 안되서 형태 변환이 필요함
1
2
3
4
5
ls = [1, 2, 3, 4]

def odd_even(num):
    return 'odd' if num % 2 else 'even'
odd_even(3), odd_even(4)
1
('odd', 'even')
1
map(odd_even, ls)
1
<map at 0x7fe1487783a0>


1
tuple(map(odd_even, ls))
1
('odd', 'even', 'odd', 'even')


1
list(map(odd_even, ls))
1
['odd', 'even', 'odd', 'even']
  • map은 실행 뒤에 list, tuple로 변형시켜주어야 한다.


8.1.1 실습 - 숫자 정렬하기

  • str.split(‘ ‘)리스트 만듬
  • 만들어진 리스트의 값들을 int 형변환
1
2
3
4
5
numbers = input('insert numbers : ')
result = numbers.split(' ')
result = list(map(int, result))
result.sort()
result
1
2
insert numbers :  1 3 4 5 6 1 3 2 4 34 231 413 412 576 3432
[1, 1, 2, 3, 3, 4, 4, 5, 6, 34, 231, 412, 413, 576, 3432]


8.2 Filter

  • 리스트 데이터에서 특정조건에 맞는 (True) 값만 남기는 함수
1
2
3
ls = range(10)
# 홀수만 출력해주는 함수
list(filter(lambda data : True if data % 2 else False, ls))
1
[1, 3, 5, 7, 9]
  • 홀수만 출력해주는 함수를 lambda를 이용해서 만들고, filter로 해당 함수를 실행하여 true값만 나오게 만듬


8.3 Reduce

  • 리스트 데이터를 처음부터 순서대로 특정 함수를 실행하여 결과를 누적시켜 주는 함수
1
from functools import reduce
1
2
ls = [3, 1, 2, 4, 5]
reduce(lambda x, y : x + y, ls)
1
15
  • ls의 원소들을 하나씩 더하여 결과를 누적시킴


9. Decorator


9.1 Decorator란?

  • 함수에서 코드를 바꾸지 않고 기능을 추가하거나 수정하고 싶을때 사용하는 문법
1
2
3
4
5
6
7
8
9
def a():
    code_1
    code_2
    code_3

def b():
    code_1
    code_4
    code_3
  • 함수 선언


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def c(func):
    def wrapper(*args, **kwargs):
        code_1
        result = func(*args, **kwargs)
        code_3
        return result
    
    return wrapper

@c
def a():
    code_2
    
@c
def b():
    code_4

  • Decorator의 사용(@c)


1
2
3
4
5
6
# a 
def plus(a , b):
    print('start') # code 1
    result = a + b # code 2
    print(f'result : {result}') # code 3
    return result
1
2
3
4
5
6
# b
def minus(a, b):
    print('start') # code 1
    result = a - b # code 4
    print(f'result : {result}') # code 3
    return result
1
2
3
4
5
6
7
def disp(func):
    def wrapper(*args, **kwargs):
        print('start') # code 1
        result = func(*args, **kwargs) # code 2, 4
        print(f'result : {result}') # code 3
        return result
    return wrapper
  • a함수, b함수와 Decorator함수(disp)를 생성


1
2
3
4
@disp
def plus(a, b):
    result = a + b # code_2
    return result
1
plus(1, 2)
1
2
3
start
result : 3
3
  • Decorator @를 앞에 붙이고 함수명을 적으면 됨


9.1.1 Decorator 실습(1)

  • 함수의 실행 시간을 출력하는 Decorator 함수를 작성
1
2
3
4
5
6
7
8
9
import time
def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f'runnung time : {end_time - start_time}')
        return result
    return wrapper
  • Decorator 생성


1
2
3
4
@timer
def test1(num1, num2):
    data = range(num1, num2 + 1)
    return sum(data)
1
2
3
4
5
6
@timer
def test2(num1, num2):
    result = 0
    for num in range(num1, num2 + 1):
        result += num
    return result
  • Decorator를 사용한 함수 test1과 test2 생성


1
test1(1, 10000000)
1
2
runnung time : 0.15724921226501465
50000005000000


1
test2(1, 10000000)
1
2
runnung time : 0.47325921058654785
50000005000000
  • Decorator를 적용한 함수 test1과 test2 실행


9.1.2 Decorator 실습(2)

  • 패스워드를 입력받아야 함수가 실행되는 Decorator 작성
1
2
3
4
5
6
7
8
9
10
def check_password(func):
    def wrapper(*args, **kwargs):
        pw = '1234'
        input_pw = input('insert pw : ')
        if input_pw == pw:
            result = func(*args, **kwargs)
        else :
            result = 'not allow'
        return result
    return wrapper
  • Decorator 생성
  • 패스워드를 설정하고 패스워드가 맞지않으면 not allow가 print되는 Decorator 함수


1
2
3
4
@check_password
def plus(a, b):
    return a + b
plus(1, 2)
1
2
insert pw :  1234
3
  • Decorator를 적용한 plus함수를 실행
  • plus함수를 실행하면 Decorator가 실행되어 패스워드부터 체크를 함
This post is licensed under CC BY 4.0 by the author.