파이썬 - 함수 1 (선언,호출,return,*args,**kwargs)

JiWOn·2023년 1월 4일
0

🦁멋쟁이 사자처럼 AI School 8기 강의
👩‍💻 박두진 강사님 강의 3일차 (2023.1.4)

함수

  • 반복적으로 사용되는 코드를 묶어서 사용하는 방법
    • 코드의 유지보수가 쉬워집니다!
  • def, return, parameter, docstring, scope, lambda
  • 사용법 : 함수선언(코드작성) -> 함수호출(코드실행)

1. 함수선언

앞서 배운 로또번호 출력기를 가져와보자!
🔗로또번호 출력기가 궁금하다면 < 클릭

로또번호 출력기를 함수로 선언해보자!
📝 함수 선언!

def display_lotto():
    lotto = []
    while len(lotto)<6 :
        num = random.randint(1,45)
        lotto.append(num)
        lotto = list(set(lotto))
    lotto.sort()
    print(lotto)

☝ 하나씩 따져보자!

  1. 함수를 선언할 땐 def 를 사용
  2. def 옆엔 함수 이름이 필요!
  3. () 안엔 parameter가 들어가야함!(없을수도)
    파라미터에 대한 내용은 밑(3)에서!
  4. 조건문, 반복문과 같이 : 사용 필수!
  5. 함수 안의 내용은 tab키로 구분! < 띄어쓰기 4개 < PEP8파일 확인
  6. 결과는 return 값 or 행동하는 것으로 구분됨

2. 함수호출

로또 출력기를 불러와보자!
📣호출문

display_lotto()

🤔이렇게 간단하게 부를 수 있다고?

  1. 그냥 함수이름 불러주면 됨!
  2. () 안에는 argument값이 들어가면 됨.
    파라미터와 같이 없을 수도 있음!
    이와 관련이야기는 00에서

코드를 반복하지 않아도 됨!

함수코드의 장점은
길이가 긴 코드를 반복해서 적지 않아도 된다는 점!
그냥 함수이름만 불러주면 계속해서 해당 코드들을 반복할 수 있음!

3. Parameter와 Argument

함수를 호출하는 코드에서 함수를 선언하는 코드로 데이터를 전달할 때 사용

🤔 잘 모르겠을 땐.. 😎코드를 보자!

📝 로또 숫자의 개수를 10개로 싶을 때 > count : 10

# 함수 선언
def display_lotto(count):
    lotto = []
    while len(lotto)<count :
        num = random.randint(1,45)
        lotto.append(num)
        lotto = list(set(lotto))
    lotto.sort()
    print(lotto)
   
# 함수 호출    
display_lotto(10)

✋여기서!
Parameter : count
Argument : 10

즉, 함수 선언 옆에 ()안의 내용이 파라미터
함수 호출 ()안의 내용이 arg

Parameter와 Argument의 관계

특별한 경우가 아닌 이상 (바로 뒤에 나오긴함)
len(Parameter) == len(Argument) > True ! 이여야 한다!

즉, Prameter의 개수가 여러개여도 함수가 선언될 수 있으며 선언될 때 무조건 arg의 개수도 같아야함!

순서도 매우매우 중요!

📝예시 (로또 개수, 로또번호의 시작, 로또번호의 끝)

# 함수 선언
def display_lotto(count, start, end):
    lotto = []
    while len(lotto)<count :
        num = random.randint(start,end)
        lotto.append(num)
        lotto = list(set(lotto))
    lotto.sort()
    print(lotto)
    
# 함수 호출    
display_lotto(10,1,100)

만약 개수를 다르게 하고싶다면❓

Parameter에 Default 값을 설정

📝예시

# 함수 선언
def display_lotto(count, start=1, end=45):
    lotto = []
    while len(lotto)<count :
        num = random.randint(start,end)
        lotto.append(num)
        lotto = list(set(lotto))
    lotto.sort()
    print(lotto)
    
# 함수 호출
display_lotto(6)

함수 선언에서 파라미터 값에 디폴트 값을 설정해줘서
함수 호출에서 기본값에서 바꿀 필요가 없다면 그대로 기본값이 실행됨

대신 기본값이 정해져 있지 않을 땐 무조건 arg를 써줘야함

만약 끝 범위의 arg를 설정해주고 싶다면?

그러니까 end값을 바꿔주고 싶은거임

📝예시

# 함수 선언
def display_lotto(count, start=1, end=45):
    lotto = []
    while len(lotto)<count :
        num = random.randint(start,end)
        lotto.append(num)
        lotto = list(set(lotto))
    lotto.sort()
    print(lotto)
    
# 함수 호출
display_lotto(6, end=100)

keyward argument를 이용해서 바꾸면 됩니다!
파라미터 변수를 적어서 바꿔주면 된다는 거임!

✋ 잠깐!

❓호출에서 display_lotto(6, ,100) 이러면 안되나요?

🙃 안됩니다. 꼭 keyward argument를 사용해주세요

그렇다면 파라미터 개수는 꼭 한정되어 있어야 하나요?

아뇨.. 그 내용은 5. *args,**kwargs 에서 나와요!

4. return

return 사용처

함수를 호출해서 결과 데이터를 변수에 저장할 때,
함수의 코드를 중단할 때

예제로 비교해보기

📝간단한 예제로 보자!

# 출력만 하는 함수
def plus1(n1, n2):
    print(n1 + n2)

# 값을 가져오는 함수
def plus2(n1, n2):
    return n1 + n2
    
# 함수 호출
result1 = plus1(1, 2) # 결과 3
result2 = plus2(2, 3) # 결과가 나타나지 않음
print(result1, result2) # 결과 : None 5

🤔이게 뭔말이냐❓

  • 둘 다 덧셈을 하는 함수
  • plus1 : 함수를 호출하면 출력하는 함수
  • plus2 : 함수를 호출하면 값을 받아오는 함수
  • result1 : plus1을 출력했기 때문에 결과값이 불러옴!, 값이 저장 안됨
  • result2 : plus2를 호출했기 때문에 결과값을 저장함
  • print
    • result1은 저장된 값이 없기 때문에 None
    • result2return값이 불러와짐 5

로또 출력기 예제를 바꿔보자

def display_lotto(count, start=1, end=45):
    lotto = []
    while len(lotto)<count :
        num = random.randint(start,end)
        lotto.append(num)
        lotto = list(set(lotto))
    lotto.sort()
    return lotto
    
# 함수 호출
result = display_lotto(6, end=100)
print(result)

가능하면.. 로또출력기로 다 설명하고싶다... ^_ㅜ

return은 코드를 중단시켜줌

📝 lotto 리스트의 개수가 6개가 될때 중단되게 해보자!

def display_lotto(count, start=1, end=45):
    lotto = []
    while 1:
        num = random.randint(start,end)
        lotto.append(num)
        lotto = list(set(lotto))
        if len(lotto)==6:
            lotto.sort()
            return lotto

    
# 함수 호출
result = display_lotto(6, end=100)
print(result)

if문을 이용해서 lotto의 개수가 6개가 되었을 때
return을 넣었더니!
정확하게 6개가 되었을 때 while문을 탈출해서 ~
코드가 완성이 됨

5. *args, **kwargs

arg상관없이 value값을 출력할 수 있는 방법

  • *args : 여러개의 키워드가 없는 arg를 튜플데이터타입으로 받아줌
  • **kwargs : 여러개의 키워드 arg를 딕셔너리 데이터 타입으로 받아줌
    • 키워드 args는 키워드가 없는 arg뒤에 위치해야함!!

이 예시는... 로또로 할 수 없어요

*args

📝 args와 타입

def plus(*args):
	return sum(args),type(args)

#함수 호출
result,type_arg = plus(1,2,3,4,5,6,7,8,9,10)
result, type_arg #(55, tuple)

args의 타입의 결과는 tuple!
여러개의 키워드가 없는 아규먼트들을 튜플데이터 타입으로 받아줌

**kwargs

📝 kwargs와 타입

def plus(*args,**kwargs):
	return sum(args),type(args),type(kwargs)

#함수 호출
result_args,type_args,type_kwargs= plus(1,2,3,4,5,6,7,8,9,10,n1=1,n2=2)
result_args,type_args,type_kwargs # (55, tuple, dict)

kwargs의 타입 결과는 dict!

정리해보자!👊

Parameter

  • 여러개의 아규먼트를 받기 위해 하나의 컬렉션 데이터 타입을 묶어서 받음!
    • *args : 키워드가 없는 여러개의 arg를 받고 tuple형태로 묶음
    • **kwargs : 키워드가 있는 여러개의 arg를 받고 dict형태로 묶음

Argument

  • 묶여있는 컬렉션 데이터타입(list, tuple, dict) > 여러개의 arg로 풀어서 함수 호출
    • *args : list, tuple 데이터타입의 데이터를 여러개의 키워드가 없는 arg로 풀어준다
    • **kwargs dict 데이터타입의 데이터를 여러개의 키워드가 있는 arg로 풀어준다.

👉 옆 장에서 계속~...

0개의 댓글