본문 바로가기
공부기록/Python

6월 12일 (1) python - 함수

by project100 2023. 6. 12.

함수 : 특정 용도의 코드(명령어)를 모아 놓은 것

 

정의형식)

def 함수명(매개변수목록):

      실행문장....

 

사용형식)

함수명(값목록)

 

코드의 용도를 구분할 수 있다.

코드를 재사용할 수 있다.

실수를 줄일 수 있다.

 

호이스팅(hoisting)

선언 전에 사용 가능한 기법

 

파이썬 함수는 호이스팅이 불가!

함수 정의 먼저 후 호출하기

 

자바스크립트는 함수 표현식

 

콘솔에서 에러난 경우 삭제 후 다시 실행!

def hello():
    print("hello world!")
    
def hi():
    print("Welcome")
    
if input('sel : ') == '1':    
    hello()
else:
    hi()
    
# 단수(d)를 입력 받아서 해당 단을 출력
def gugudan(d):
    for i in range(1, 10):
        #print('{} X {} = {:2}'.format(d, i, d*i))
        print(f'{d} X {i} = {d*i:2d}')
        
        
dan = int(input('단을 입력하세요 : '))
gugudan(dan)

 

반환(return)문 

def 함수명(매개변수):

      수행문장....

      return 값

 

결과변수 = 함수명(값)

 

def cal(a, b, op):
    c = 0
#     if op == '+':
#         c = a + b
#     elif op == '-':
#         c = a - b
#     elif op == '*':
#         c = a * b
#     elif op == '/':
#         c = a / b
#     return c

    match op:
        case '+':
            c = a + b
        case '-':
            c = a - b
        case '*':
            c = a * b
        case '/':
            c = a / b
        case _:
            print('연산 기호를 잘못 입력했습니다.')
            c = 0
    return c

x, oper, y = input('계산식 입력 : ').split()
x = int(x)
y = int(y)
res = cal(x, y, oper)
print('계산 결과 : ', res)

 

지역변수와 전역변수

함수 내부에 선언된 변수 : 지역변수

함수 외부에 선언된 변수 : 전역변수

함수 내부에서 전역변수 선언 : global 변수명

 

함수는 무조건 스택구조(stack)

a, b, c -> c, b, a

함수 내부에 실행되는 시점에는 존재하다가 실행 후에는 사라짐

매번 함수가 호출되면 다시 만들어짐(지역변수) 

전역변수는 프로그램이 종료될 때까지 유지됨

전역변수는 가급적 많이 쓰지 않기! 오류 시 수정하기가 어려움(추적이 어려움)

 

a = 100 # 전역변수

def func1():
    a = 10  # 지역변수
    print(f'함수안 : {a}')
    
func1()  # 10, 지역변수
print(f'함수밖 : {a}') # 100, 전역변수
a = 100

def func1():
    global a # 100
    a = 10
    print(f'함수안 : {a}')
    
func1()  # 10
print(f'함수밖 : {a}') # 10
a = 100 # 전역변수

def func1():
    print(f'함수안 : {a}') # 100
    
func1()  # 100
print(f'함수밖 : {a}') # 100
def func1():
    global a # 함수 내부에서 전역변수선언
    a = 10 
    print(f'함수안 : {a}') # 10
    
func1() # 10
print(f'함수밖 : {a}') #10

 

패킹, 언패킹

시퀀스 유형에 데이터를 넣는 작업 : 패킹(packing)

시퀀스 유형에서 각 데이터를 꺼내어 각각의 변수에 분배하는 작업 : 언패킹(unpacking)

값을 묶어서 작업

 

변수의 언패킹 

       x, y, z = 1, 2, 3

 

함수에서 언패킹 사용하기

      def 함수명(a, b, c):

            .....

      list = [1, 2, 3]

      함수명 (*list)  # 언패킹 각 변수에 리스트를 변수를 하나씩 넣어줌

주의) 매개변수의 개수와 시퀀스 원소의 개수가 동일해야 한다. 개수가 맞지 않으면 오류 발생

 

가변인수 함수 : 매개변수의 개수가 정해지지 않은 함수

      def 함수명(*매개변수명):

            for  변수 in 매개변수명:

                   .....

scores = list(map(int, input('점수입력 : ').split()))

#print(scores)

def sum_scores(*ss): # 매개변수가 얼마가 들어올지 모를 때, 가변인자
    sum = 0
    for s in ss:
        sum += s
    return sum

sum_res = sum_scores(*scores)
print(f'총점 : {sum_res}')

다수의 return  활용

파이썬에서는 결과값을 여러 개 반환할 수 있음.

형식)

       return a, b, c

      

      x, y,  z = 함수() 

def cal(a, b):
    r1 = a + b
    r2 = a - b
    r3 = a * b
    r4 = a / b
    return r1, r2, r3, r4

l, m, n, o = cal(2, 8)
print(f'더하기 : {l}, 빼기 : {m}, 곱하기 : {n}, 나누기 : {o}')

 

키워드 인수 

       함수 호출 시 매개변수의 혼동으로 인한 오류를 막기 위해 제공되는 방식

 

def func(int1, str, int2):

      .....

func(1, 2, '+') - 오류발생

func(int1=1, int2=2, str='+')

 

기존활용 예) print(a, b, c, sep=",", end="")

sep와 end가 키워드 인수 방식을 활용한 예

 

딕셔너리 언패킹

def func(a, b, c):

     .....

dic = {'a':str, 'b':100, 'c':200}

func(**dic_value)

 

딕셔너리 키(key)는 반드시 문자열이어야 한다

func(*dic_value)처럼 '*'를 하나만 작성하면 key에 해당하는 값이 각 변수에 언패킹 된다.

# 키워드 인수 방식
def person_info(name, age, addr):
    print(f'이름 : {name}')
    print(f'나이 : {age-1}')
    print(f'주소 : {addr} ')
    
person_info(name="홍길동", addr="인천시", age=21)
print()
person_dic = {'name':'전우치', 'age':25, 'addr':'서울시'}
person_info(**person_dic)
# person_info(*person_dic) age 문자열 오류
print()   

def per_info(**kwargs): # keyword arguments의 약자
    for kw, arg in kwargs.items(): # 딕셔너리 키와 값 쌍을 하나씩 가져옴
        if kw == 'age':
            arg -= 1
        print(f'{kw}:{arg}')
    print()    
        
dic1 = {'name':'윤아름',
        'age': 32, 
        'addr':'경기도',
        'phone':'010-4513-7842'}

per_info(**person_dic)
per_info(**dic1)

 

ValueError: Unknown format code 'd' for object of type 'str'

ValueError: invalid literal for int() with base 10: '&'

SyntaxError: 'return' outside function

NameError: name 'a' is not defined

TypeError: 'builtin_function_or_method' object is not iterable

TypeError: cal() missing 2 required positional arguments: 'a' and 'b'

TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'

TypeError: cannot unpack non-iterable builtin_function_or_method object

TypeError: unsupported operand type(s) for -: 'str' and 'int'

ValueError: invalid literal for int() with base 10: '숫자 입력 : '

 

연습문제) 몫과 나머지를 구하는 함수를 작성하시오.

def d(a, b):
    res1 = a // b
    res2 = a % b
    return res1, res2

num1, num2 = input('숫자 입력 : ').split()
num1 = int(num1)
num2 = int(num2)
res1, res2 = d(num1, num2)
print('나머지와 몫 구하기')
print(f'몫 : {res1}, 나머지 : {res2}')