본문 바로가기
파이썬(Python)/파이썬(Python) 기초

파이썬(Python) 4장 입출력 - 1. 함수

by 인생즐겜러 2022. 7. 4.
728x90
반응형

1. 함수의 정의와 파이썬 함수

2. 매개 변수와 인수

3. 입력값과 결괏값에 따른 함수 모양

4. 입력값의 갯수를 모를 때 의 함수 (가변 매개변수)

5. 함수의 결괏값은 항상 1개!!! 

6. 함수 매개변수에 초깃값 설정 위치 

7. lambda

 

 

 

 

 


 

 

 

 

 

1. 함수의 정의와 파이썬 함수

 

함수

어떠한 행동을 하는 매개체다.

음식을 먹으면 똥이라는 결과물을 내놓은 몸처럼

x를 넣었을 때 y하는 결과값을 내놓도록 일정한 행동을 하는 기계 같은 것이다.

 

 

 

 

 

파이썬 함수의 구조

 

def 함수명(매개변수):
    <수행할 문장1>
    <수행할 문장2>
    ...

 

 

 

 

 

예시

 

>>> def mul(a, b):
...     return a*b
...
>>>
>>> a = 2
>>> b = 3
>>> c = mul(a, b)
>>> print(c)
6

 

위의 예제를 설명하자면

우리가 만든 함수의 이름은 mul이고 이 함수는 a,b라는 변수를 받아서 행동한다.

행동한 결과 값은 return으로 줄 것이고 a*b가 결과값이다.

이제 그걸 mul 함수라고 정의할거야!!!

 

그럼 해당 함수를 사용해보자면

mul(2,3)으로 쓸거고 print로 보면 정상적으로 동작하는 걸 볼 수 있다.

 

 

 

 

 


 

 

 

 

 

2. 매개변수와 인수

 

매개변수 : 함수에 입력으로 전달된 값을 받는 변수

인수 : 함수를 호출할 때 전달하는 실제 입력값

 

def mul(a, b):  # a, b는 매개변수
    return a*b

print(add(1, 2))  # 1, 2는 인수

 

 

 

 

 

매개 변수 지정 후 함수 선언

함수를 선언할 때 매개변수를 지정해서 선언할 수 도 있다.

그럼 매개변수 순서에 상관없이 사용할 수 있다는 장점이 있다.

 

>>> result = add(a=1, b=2)  # a에 1, b에 2을 전달
>>> print(result)
3

>>> result = add(b=2, a=1 )  # 순서를 바꿈
>>> print(result)
3

 

 

 

 

 


 

 

 

 

 

 

3. 입력값과 결괏값에 따른 함수 모양

 

 

 

입력값 O , 결괏값 O

 

결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ...)

 

>>> def mul(a, b):
...     return a*b

 

 

 

 

 

입력값 X , 결괏값 O

 

결괏값을 받을 변수 = 함수이름()

 

>>> def Hey(): 
...     return 'Hey'

>>> a = Hey()
>>> print(a)
Hey

 

 

 

 

 

 

 

입력값 O , 결괏값 X

 

함수이름(입력인수1, 입력인수2, ...)

 

>>> def add(a, b): 
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))

>>> a = add(3, 4)
3, 4의 합은 7입니다.

>>> print(a)
None

 

print는 수행 행동 일 뿐 결괏값이 아니다.

마지막 print로 값을 확인해보면 결괏값이 없는 걸 볼 수 있다.

 

 

 

 

 

입력값 X , 결괏값 X

 

함수이름()

 

>>> def Hi(): 
...     print('Hey')

>>> Hi()
Hey

 

 

 

 

 


 

 

 

 

 

4.  입력값의 갯수를 모를 때 의 함수 (가변 매개변수)

 

def 함수이름(*매개변수): 
    <수행할 문장>
    ...

 

위와 같이 매개변수 앞에 *을 붙여서 사용한다.

*가 해당 변수를 튜플로 변환하여 함수 안으로 보낸다.

 

 

 

사용자에게 입력을 받았을 시 변수의 차이에 따른 자료형의 차이로 이해 해보자면

 

 

위처럼 input으로 받은 값(문자열 자료형)을 eval을 통해서 튜플 자료형으로 변환한다.

그리고 함수에 넣었을 때

함수 안에서는 함수에 썼던 매개변수 *a를 그대로 list로 변환을 해야 정상적으로 변환이 된다.

왜냐면 eval까지 처리된 데이터가 이미 튜플이 씌워진 상태인데
*로 튜플이 한번 더 씌워지기 때문에 리스트 변환을 두번을 해야한다.

하지만 *a로 가져오게 되면 *로 씌워진 튜플 안의 eval 튜플 값만을 가져오기 때문에 리스트 한번 변환으로리스트를 사용할 수 있게 된다.

 

 

 

 

 

예1

 

>>> def add(*args): 
...     result = 0 
...     for i in args: 
...         result = result + i 
...     return result 

>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55

 

 

 

 

 

예2

 

>>> def add_mul(choice, *args): 
...     if choice == "add": 
...         result = 0 
...         for i in args: 
...             result = result + i 
...     elif choice == "mul": 
...         result = 1 
...         for i in args: 
...             result = result * i 
...     return result 
... 
>>>

>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120

 

*매개 변수를 쓰더라도 위의 예처럼 다른 매개 변수도 같이 사용할 수 있다. 

 

 

 

 

 

예3 (키워드 파라미터, ** )

 

>>> def print_kwargs(**kwargs):
...     print(kwargs)
...

>>> print_kwargs(name="jin")
{'name': 'jin'}
>>> print_kwargs(name='jin', age=30)
{'age': 30, 'name': 'jin'}

 

위 처럼 키워드 파라미터(매개변수 이름은 상관없지만 관례적으로 kwargs를 쓴다)에 ** 을 사용하면

매개변수는 딕셔너리가 되고 모든 key=value 형태의 입력값이 그 딕셔너리에 저장 된다.

 

 

 

 

 


 

 

 

 

 

5. 함수의 결괏값은 항상 1개!!! 

 

1. 결괏값1
>>> def add_and_mul(a,b): 
...     return a+b, a*b

>>> result = add_and_mul(3,4)



2. 결괏값2
>>> def add_and_mul(a,b): 
...     return a+b 
...     return a*b 
... 
>>>
>>> result = add_and_mul(2, 3)
>>> print(result)
5

 

1.

return a+b와 a*b 2개에 결괏값을 받아들이는 변수 result 하나만 쓰였더라도 오류는 발생하지 않는다.

튜플값 하나인 (a+b, a*b)로 돌려주기 때문이다.

2.

하지만 return을 두번 쓰게 되면 얘기는 달라진다.

항상 결괏값은 1개만 반환하기 때문에 첫 return 값만 받아오게 된다.

 

 

 

 

 

※참고

return 은 단독으로 써서 함수를 즉시 빠져나갈 수도 있다.

 

>>> def say(you): 
...     if you == "전역": 
...         return 
...     print("나는 곧 %s 입니다." % you)
... 
>>>

 

위처럼 전역이라는 인수가 들어오게 되면 print를 출력하지 않고 함수를 빠져나가 버린다.

 

 

 

 

 


 

 

 

 

 

6. 함수 매개변수에 초깃값 설정 위치 

 

1. 정상 예시
def say(name, old, jam=True): 
    print("이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % old) 
    if man: 
        print("개그맨입니다.")
    else: 
        print("노잼입니다.")
        


2. 오류 예시
def say(name, jam=True, old): 
    print("이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % old) 
    if man: 
        print("개그맨입니다.") 
    else: 
        print("노잼입니다.")

 

1.

jam의 자리에 say("박씨", 30, False)  => 이런 식으로 False를 넣게 되면 노잼이라는 문구를 출력한다.

say("박씨", 30) => 무조건 jam = True로 출력한다.

2.

초깃값 설정을 해당 예처럼 위치를 바꾸게 되면 에러가 난다.

고로 초깃값을 설정하는 매개변수는 마지막으로 빼야한다.

 

 

 

 

 


 

 

 

 

 

6. 함수의 변수의 효력 범위와 사용법

 

1. 변수 범위에 따른 문제 예시
a = 1			# 외부 변수
def var(a): 		# 외부 변수를 넣고 실행
    a = a + 1

var(a)			# 내부 변수로써만 존재
print(a)		# 출력은 외부 변수

1			# 외부변수를 출력하므로 결과값은 1



2. 해결 예시1 (return)
a = 1 			# 외부 변수
def var(a): 
    a = a + 1 
    return a

a = var(a) 		# 외부 변수에 내부 변수값을 넣고
print(a)		# 출력



3. 해결 예시2 (global)	# 쓰지 마라
a = 1 
def var(): 
    global a 		# 함수 밖의 a 변수를 직접 사용
    a = a + 1

var() 
print(a)

 

1.

함수 내부 변수는 외부 변수와 이름이 같더라도 내부에서만 작용한다.

따라서 외부 변수로 들어온 인자 1로 함수가 구동이 되고 var(a)의 값이 2로 변하기는 하지만

print(a)는 외부 변수 a값을 가져오므로 1이 출력 된다.

2.

해당 예시처럼 함수 결과값을 외부 변수에 넣으면 원하는 대로 출력이 된다.

3.

global은 외부에 있는 같은 이름의 변수를 가져다 쓰겠다는 의미인데 쓰지 않는 것이 좋다.

그냥 이런게 있다는 것만 알 것.

 

 

 

 

 


 

 

 

 

 

7. lambda

 

함수 생성 시 사용하는 예약어로 def와 동일한 역할을 한다.

함수를 한줄로 간결하게 만들 때 사용.

구조는 아래와 같다.

 

lambda 매개변수1, 매개변수2, ... : 매개변수를 이용한 표현식

 

 

 

 

 

1.
>>> def add(a, b):
...     return a+b
...
>>> result = add(3, 4)
>>> print(result)
7



2.
>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7

 

1과 같은 함수를 2처럼 lambda를 이용하여 한 줄로 나타낼 수 있다.

728x90
반응형

댓글