TanzDev

TIL 23 (파이썬 함수) 본문

기록보드/TIL

TIL 23 (파이썬 함수)

Tanz-dev 2024. 2. 23. 23:31

점프 투 파이썬

 

믹서를 사용해서 과일을 갈아 과일 주스를 만든다. 우리가 믹서에 넣는 과일은 ‘입력’, 과일 주스는 ‘출력(결괏값)’이 된다.

 

함수의 기본원리

 

코딩을 하다보면 똑같은 문구를 계속 반복할 수 있는데, 그때 함수를 이용해 작업량을 줄여주는게 함수의 관건이다.

 

‘반복적으로 사용되는 가치 있는 부분’을 한 뭉치로 묶어 ‘어떤 입력값을 주었을 때 어떤 결괏값을 리턴해 준다’라는 식의 함수로 작성한다.

 

함수의 기본구조

def 함수_이름(매개변수):

수행할_문장1

수행할_문장2

...

def add(a, b): #함수 add를 선언해주고 a값과 b값을 설정해준다.
    return a + b # a + b를 더하기를 정의해주고

print(add(1, 2)) # 프린트(지정함수(a에들어갈 내용, b에들어갈내용)) 해주면 3이 출력된다.

 

매개변수와 인수

 

매개변수 : parameter 라고 부르며, 함수에서 정의되어 사용하는 변수

인수 : Arguments라고 부르며, 함수를 호출할때 건네주는 변수

 

 

일반적인 함수

def add(a, b):
    result = a + b
    return result

print(add(1, 3)) # 4가 출력된다.

 

입력값이 없는 함수

def say():
    return 'hi'

a = say()

print(a) #입력값이 없음에도 hi가 출력된다.

 

리턴값이 없는 함수

def add(a, b):
    print("%d, %d의 합은 %d입니다." % (a, b, a+b)) #함수안에 포함되있는 print값은 return해서 돌려주는 값이 아니기때문에 함수의 출력이 없다.

a = add(1,2)

print(a) #따라서 1, 2의 합은 3이다 라는 함수값은 출력되고, None(실제로는 리턴값이 없으니)이 출력된다.

 

입력도, 리턴값도 없는 함수

def say():
    print('Hi')

a = say()

print(a)

# Hi  print의 명령문을 실행했기때문에 Hi가 출력되고
# None return값이 없기때문에 None도 같이 출력된다.

 

매개변수를 지정하여 호출하기

def sub(a, b):
    return a - b
result = sub(a=7, b=3)  # a에 7, b에 3을 전달
print(result) # a, b가 지정되어있어 4가 출력된다.

 

여러 개의 입력값을 받는 함수 만들기

def add_many(*args): #*을 주면 add_many의 변수를 한번에 받아줄 수 있다.
    result = 0
    for i in args:
        result = result + i   # *args에 입력받은 모든 값을 더한다.
    return result

print(add_many(1, 2, 3, 4, 5)) #15가 출력된다.


 

def add_mul(choice, *args): #choice엔 1개의 매개변수가 들어가고, args는 리스트형식의 여러개의 매개변수가 들어간다.
    if choice == "add":   # 매개변수 choice에 "add"를 입력받았을 때 for문을 통해 더하기가 수행되어 6이 출력되고
        result = 0
        for i in args:
            result = result + i
    elif choice == "mul":   # 매개변수 choice에 "mul"을 입력받았을 때 for문을 통해 곱하기가 수행되어 24가 출력된다.
        result = 1
        for i in args:
            result = result * i
    return result

print(add_mul("mul", 1,2,3,4)) #필요에 따라 choice 위치에 따른 스위치형식의 함수를 만들어보는것도 좋을것같다.

 

키워드 매개변수, kwargs : 딕셔너리에서 key와 value를 받는 함수도 있다.

def print_kwargs(**kwargs): #a값과 b값을 받아서 딕셔너리 형태로 받는다.
    print(kwargs)
    print(kwargs(a)) #특정해서 받을수도있다.
print_kwargs(a=1, b=2) # {'a': 1, 'b': 2} 가 출력된다.

 

함수의 리턴값은 언제나 하나이다

 

def add_and_mul(a,b):
    return a+b, a*b #리턴에 값이 두개이기때문에 각각 출력나올수 있다고 생각하겠지만,

result = add_and_mul(3,4) #값을 대입해보면 (7, 12)가 출력되고 0번째 인덱스는 더하기로, 1번째 인덱스는 곱하기로 튜플출력된다.

print(result)

 

또한 return은 while문에 break기능처럼 함수에 넣어주게되면 함수에서 빠져나가는 용도로도 사용된다.

 

매개변수의 초깃 미리 설정하기

def say_myself(name, age, man=True): #초기화 하고싶은 매개변수는 항상 뒤쪽에 배치해야한다.
man=True는 중간에 배치하면 오류가 발생한다.
    print("나의 이름은 %s 입니다." % name)
    print("나이는 %d살입니다." % age)
    if man:
        print("남자입니다.")
    else:
        print("여자입니다.")

say_myself("이정우", 35, True)

# 나의 이름은 이정우 입니다.
# 나이는 35살입니다.
# 남자입니다. 가 출력된다.

 

함수 안에서 선언한 변수의 효력 범위

 

# vartest.py
a = 1 #함수 바깥에 있는 변수는 계속 남아있는 전역변수이다.
def vartest(a):
    a = a +1 # 함수안에는 a가 두개있는데 왼쪽 a와 오른쪽 a는 다르다
             # 왼쪽 a는 함수 안에서 사용된 지역변수 a이기때문에 함수를 실행시켰을때 2가 아니라 1이 출력된다.
             # 지역변수는 함수가 끝나면 없어지는 메모리같은 일시적인 변수로 생각하면 될거같다.
vartest(a)
print(a)

 

그렇다면 이 함수를 바깥으로 꺼내 사용할 수 있는 방법은 무엇일까.

첫번째 방법은 리턴을 해주는것이다. 배출구를 만들어주어 반환되게끔 만들어주면 지역변수 개념이 없어진다

두번째 방법은 global을 붙여주는것이다. global로 만들어주면 전역변수의 값을 따라와 사용할수 있다.

그러나 프로그래밍을 할땐 global 명령어를 피해주는것이 좋은데 이유는 함수는 독립적으로 존재하는것이 좋기때문이다. 외부변수에 종속되는 함수는 좋은 함수가 아니다. 따라서 첫번째 방법을 사용하는것이 좋다.

 

전역변수와 지역변수

전역변수는 프로그램 내 전체에 접근이 가능한 함수이다.

지역변수에 대한 주의사항들이 몇가지 있는것을 확인했다.

 

뮤터블(mutable) - 리스트, 딕셔너리, 집합

- 값 변경이 가능하고, 추가 삭제가 가능하다.

 

이뮤터블(immutable) - 정수, 실수, 문자열, 튜플

- 값이 변하지않거나 수정할 수 없다.

 

지역변수에 이뮤터블을 대입할 경우 return을 쓰지않으면 대입값이 반환되지않는 특징을 지녔다. 

 

b = [1, 2, 3]  #1번이 2번에 있는 vartest2에 1,2,3 숫자열을 대입해주고, 3번에 대입된다.
def vartest2(b): #2번이 실행되고,
    b = b.pop() #2-1 에 있는 pop문으로 인해 3이
    return b # 리턴된다.

b = vartest2(b) #3번에 다시 3이 대입되고
print(b)        #4번 출력은 3이 된다.

 

list는 mutable이기때문에 pop명령어로 지역변수가 실행되며, tuple같은 immutable은 안되니 참고하자.

전역변수와 지역변수에 대해 잘 이해가 가지않았는데, 계속 보고 사용해보니 느낌이 왔다.

 

Lambda (함수 표기를 한줄로 줄이는 방법)

lambda로 만든 함수는 return 명령어가 없어도 표현식의 결괏값을 리턴한다.

 

add = [lambda a, b: a+b, lambda a, b: a*b]

print(add[1](3,4)) # 0번인덱스를 호출하면 a+b 가 되어 7이 출력되고,
#1번인덱스로 호출하면 a*b 이므로 12가 출력된다.

 

'기록보드 > TIL' 카테고리의 다른 글

TIL 25 파이썬 개별과제 진행중  (1) 2024.02.26
TIL 24 (클래스 )  (0) 2024.02.24
TIL 22 (파이썬 제어문)  (1) 2024.02.22
TIL 21 (자료형 종료)  (1) 2024.02.21
TIL 20 (파이썬 시작 2)  (1) 2024.02.20