개발자 미니민의 개발스터디

[파이썬] 함수

by mini_min
[파이썬] 함수 

✔️ 함수

: 파이썬에서 함수는 복잡한 문제를 작고 간단한 문제로 나누어 디버깅이나 유지 보수가 용이하다.

논리적 구조가 명확해진다. 함수는 function 이라는 데이터 타입의 객체이다.

 

인수는 함수를 호출할 때 함수에 전달하는 입력값이다. (주는 애)

 매개변수는 함수에 입력으로 전달된 값을 받는 변수이다. (받는 애)

 

형식 : def 키워드를 사용해 정의한다.

입력 파라미터나 반환 값은 없을 수도 있다.

 

✔️ 리턴 값

: 함수로부터 호출자로 리턴 하기 위해서는 return 문을 사용한다.

리턴 값은 하나 이상일 수 있으며 필요한 수 만큼 return 키워드 다음에 콤마로 구분해 적는다.

return a, b, c 는 (a,b,c) 값을 포함하는 tuple 하나를 리턴하는 것이다.

 

✔️ 매개변수

: 입력 파라미터는 Pass By Assignment 에 의해 전달된다.

전달되는 입력 파라미터는 Mutable 이거나 Immutable 에 따라 달라진다.

mutable 은 함수 내에서 객체의 내용이 변경될 수 있으나, immutable 은 변경 불가하다. 

# 매개변수가 없는 경우
def sum():
    t = 0
    for num in range(1, 101):
        t += num
    print("합 : " , t)
    
#함수 호출
sum()
# 매개변수가 있는 경우
#함수 정의
def gugu(dan):
    for i in range(1, 10):
        print(f"{dan} * {i} = {dan * i}")
    
#함수 호출 ( 5단 출력됨 )
gugu(5)
# 매개변수가 있는 경우
#함수 정의
def sum(a):
    t = 0
    for i in a:
        t += i
    print("결과 : " , t)
    
#함수 호출
sum([1,2,3,4,5]) # list
sum((2,4,6,8,10)) # tuple

 

✔️ 홀수의 합 등등

# 홀수의 합
def sum(n):
    if n < 0: return
    result = 0
    
    for i in range(1, n+1, 2):
        result += i
    
    return result

print(sum(100))
# 
def sum(n):
    tot = 0
    count = 0
    for i in n:
        count += 1
        tot += i
    
    return count, tot # tuple로 반환

a ,b = sum([1,3,5,7,9])
x = sum([1,3,5,7,9])
print(a, b) # 5 25
print(x) # (5, 25)

a = sum([2,4,6,8,10])
print(a[0], a[1]) # 5 30
print(type(a)) # <class 'tuple'>

 

✔️ 매개변수 전달 방식

# mutable : list, dict, bytearry, set
# immutable : int, float, str, tuple, bytes, complex, bool, frozenset

함수 안에서 매개변수를 바꿔보려고 한다.

첫번째 : int 는 immutable 이라 값 변경이 n=10 으로 안된다.

두번째 : list 는 mutable 이라 3번째 값이 변경된다.

세번째 : tuple 은 immutable 이라 값 변경이 안된다.

# 매개변수 전달 방식
# mutable : list, dict, bytearry, set
# immutable : int, float, str, tuple, bytes, complex, bool, frozenset

# n 바꾸기
def test(n):
    n = 10
    
def test2(n):
    n[2] = 10


n = 5 # int, immutable
test(n)
print(n) # 5, 값 변경 안됨

n = [1,2,3,4,5] # list, mutable 이라 값 바뀜
test2(n)
print(n) #[1,2,10,4,5] # 값 바뀜 

# n = (1,2,3,4,5) # tuple, immutable
# test2(n)
# print(n) #(1,2,3,4,5) : 값 변경 x 오류나옴

 

✔️ 위치 인자 

: 위치 인자는 가장 기본적인 함수의 파라미터 형태다. 위치에 따라 인자를 함수 내부식에 대입한다. (순서 다르면 안됨)

# 위치 인자 
def info(name, gender, age):
    print(f"""
        이름 : {name}
        성별 : {gender}
        나이 " {age}
        """)
    
info("홍길동", "남", 20)
info("남", "홍길동", 20)

 

키워드 인자랑 같이 사용할 수 있다.

다만, 위치 + 키워드 인자를 같이 쓰면 위치 인자가 먼저 와야한다.

# 키워드 인자 
# 위치 인자랑 키워드 인자 같이 쓸 수 있음
def info(name, gender, age):
    print(f"""
        이름 : {name}
        성별 : {gender}
        나이 " {age}
        """)

info(gender="남", name="홍길동", age=20)
# 위치 + 키워드 인자 같이 쓰는 경우 위치 인자가 먼저 와야한다.
def info(name, gender, age):
    print(f"""
        이름 : {name}
        성별 : {gender}
        나이 " {age}
        """)

info("홍길동", age=20, gender="남")

 

✔️ 가변 길이 파라미터 

: 함수의 입력 파라미터의 개수를 미리 알 수 없거나, 0부터 N개의 파라미터를 전달할 경우, 가변 길이 파라미터를 사용할 수 있다.

파라미터명에 "*" 를 붙여 가변 길이임을 표시한다. 

가변 길이 파라미터는 튜플형으로 전달된다. 

일반 매개변수와 가변 인자 함수를 같이 사용하면 가변 인자는 오른쪽에 위치한다.

# 가변 길이 파라미터 
def sum(*args):
    result = 0
    for num in args:
        result += num
    return result

s = sum(1,2,3,4,5)
print(s)
# 가변 길이 파라미터 
def calc(op, *args):
    result = None
    
    if op == "+":
        result = 0
        for i in args:
            result += i
    elif op == "*":
        result = 1
        for i in args:
            result *= i
    
    return result

s = calc('+', 1,2,3,4,5)
print(s)

s = calc('*', 1,2,3,4,5)
print(s)

 

✔️ 디폴트 파라미터

: 기본값이 정의된 인자를 말한다.

함수를 호출 할 때 인자를 명시하지 않아도 기본값으로 인자가 전달된다.

함수를 정의할 때 기본값을 함께 정의한다.

일반 매개변수와 함께 사용할 때는 디폴트 매개변수는 일반 매개변수 다음에 정의해야한다.

# 디폴트 step=1
def sum(start, end, step=1):
    t = 0
    for n in range(start, end+1, step):
        t += n
    return t

s = sum(1, 10)
print("합계:" ,s)

s = sum(1, 10, 2)
print("홀수 합계:" ,s)

 

✔️ 가변 키워드 인수 

: 매개변수 이름 앞에 "**"를 붙이면 아버트레리 키워드 매개변수가 된다.

키워드 인수는 딕셔너리로 전달된다. 

가변 키워드 인자가 가장 뒤에 나와야한다.

# 가변 키워드 파라미터 (arbitrary keyword)
# ** 가 2개면 딕셔너리로 봄
def fun(category, **kargs):
    print("카테고리: ", category)
    print(type(kargs)) # <class 'dict'>
    print(kargs) #딕셔너리로 처리 
    
category = "숫자"
fun(category, a=1, b=2, c=3)

category = "과일"
fun(category, a="사과", b="딸기")

category = "과일"
a = {'a':'사과', 'b':'딸기'}
fun(category, **a)

 

✔️ 특수 매개변수 

: 위치 매개변수는  / 앞에, / 다음의 매개변수는 위치-키워드 매개변수나 키워드 전용 매개변수가 온다.

: 키워드 전용 매개변수는 키워드 전용 매개변수 바로 앞에 * 가 위치해야한다.

: / 나 * 가 없으면 매개변수는 위치나 키워드 인자로 함수에 전달할 수 있다.

: / 와 * 는 선택적으로 사용 가능하다. 

# 특수 매개변수

# 표준 (위치, 키워드 가능)
def fun(arg):
    print(arg)
    
fun(3) # 위치로 부른 경우 - 가능
fun(arg=5) # 키워드 

# 위치 전용 (키워드로 못넘겨)
def fun2(arg, /):
    print(arg)

fun2(1) # 위치로 부른 경우 - 가능
# fun2(arg=2) # 에러 

# 키워드 전용 (키워드로만 지원)
def fun3(*, arg):
    print(arg)
    
# fun3(3) # 에러
fun3(arg=7) # 키워드 
    
# 혼용
def fun4(pos, /, std, *, kwd):
    print(pos, std, kwd)
    
fun4(1,2,kwd=3)
fun4(10,std=20,kwd=30)
    
    
def fun5(pos, /, *, kwd):
    print(pos, kwd)

fun5(100, kwd=200)
# 특수 매개변수
# 위치인자 a, a를 가변키워드로 가진 경우

def sub(name, **kwds):
    print(name, kwds)
    return "name" in kwds

# s = sub(1, **{"name":"김자바"}) 
 # 에러. 위치인자 name과 name을 가지고 있는 kwds와 충돌

s = sub(1, **{"subject":"자바"}) 
print(s, end='\n')


def sub(name, /, **kwds):
    print(name, kwds)
    return "name" in kwds

s = sub(1, **{"name":"자바"})
print(s)

 

✔️ 전역 변수 , 지역 변수

: 전역 변수는 함수 밖에서 정의된 변수를 말한다.

함수 밖에서 정의되어 함수 내에서도 별다른 매개변수 입력 없이 접근 가능하며

global 명령어로 해당 변수를 global 변수로 선언한다.

 

: 지역 변수는 함수 안에서 변수를 선언하고 사용할 경우

함수 밖에 있는 같은 이름의 변수들과 함수 안에 있는 변수들과 서로 연관이 없다. 

이런 변수를 지역 local 변수라고 한다. 

# 전역 변수 
def fun():
    global a # a는 전역변수
    # a += 10 # 에러, 변경이 불가함, print는 된다.
    print("함수:",a)

a = 10
fun()
print(a) # 20
# 지역 변수 : 바깥 변수를 사용할 순 있어도 변경은 불가하다. (y예시)
# nonlocal 쓰면 변경 가능 @ 
def fun():
    x = 10
    y = 100
    z = 200
    def sub():
        x = 20
        # y += 10 #에러
        nonlocal z 
        z += 10
        print("sub()", x) # 20 로컬변수
        print("sub()", y, z) # 상위 함수 변수
    sub()
    print("fun()", x, y,z ) # 10 100

fun()

 

✔️ 람다 

: 보통 짧고 간결한 함수를 한 줄로 나타내기 위해 사용한다.

작고 이름 없는 함수를 만든다.

# lamda
add = lambda a, b: a+b

result = add(3,5)
print(result)
# function annotation
def fun(name:str, age:int) -> str:
    state = "성인" if age >= 19 else "미성년자"
    return name +"님은 " + state +"입니다."

s = fun("김자바", 30)
print(s)

s = fun("김자바", 20.0)
print(s)
# 재귀호출
def sum(num):
    if num>=1 :
        return num + sum(num-1)
    return num

s = sum(10)
print(s)

 

✔️ 기타 파이썬에서 제공하는 내장함수

#내장함수 

#반올림
a = round(13.75)
b = round(13.75, 1)
print(a, b) # 14 13.8

# 승
print(pow(2,10))
print(2 ** 10)

#절대값
print(abs(-7))

#몫과 나머지
a,b = divmod(100,8)
print(a,b)  #앞이 몫, 뒤가 나머지   

#2진수 문자열로
print(bin(27))
#16진수 문자열로
print(hex(27))

a = [3,5,1,10,7,9]
print(max(a), min(a), sum(a))

print(chr(65), ord('A'), ord("대")) # 코드의 문자, 문자의 코드

 

 

 

 

'Python' 카테고리의 다른 글

[파이썬] 클래스 2  (0) 2022.12.25
[파이썬] 클래스  (0) 2022.12.18
[파이썬] 별찍기, selection sort, bubble sort  (0) 2022.12.18
[파이썬] 연산자 문법, for, if 제어문  (0) 2022.12.14
[파이썬] 기본 문법  (0) 2022.12.12

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기