선미 파이썬 0327 12일차

azuremei
이동: 둘러보기, 검색
# 09_fonction
'''
    [함수]        '반환'<<<<매우중요
    - '특정 작업'을 '수행'하는 코드들을 '하나로 묶은 것'
      >특정 작업
    - 함수를 사용하는 이유 :
      1. 높은 재사용성
       >한 번 만들어놓으면 언제든지 사용('호출')할 수 있다.
      2. 중복된 코드 제거(한 번에 묶는것이므로)
      3. 프로그램의 구조화(굴조적인 프로그램 설계가 가능해진다)

[함수의 기본 구조]
def 함수이름(매개변수) :
    수행문
    return
#def(define) 정의되어 있다. 

>print()와 같이 이러한 구조들이 이미 만들어져 있는 것도 있다.

    -우리가 만드는 함수 : 사용자 정의 함수
    -이미 파이썬에서 사용할 수 있도록 만들어진 함수 : print(), input()....
            >이러한 함수들은 기본구조에 맞춰ㅗ 이미 만들어져 있다.
            >>>우리는 굳이 실제 어떤 식으로 만들어졌는지 알 필요는 없다.
                어떻게 사용하는 지만 알면 됨(앞서 문자열, 리스트 등의 함수 배운것처럼)

[1. 매개변수] : 함수 입장에서는 입력받는 값, 함수를 사용하는(호출하는) 입장에서는 입력하는 값
    - 함수의 기능 수행을 위해 함수가 소출될 때 받을 값을 담는 '변수'
      >내가 함수를 만들 때 변수를 만들듯 이름을 지으면 됨(변추처럼)
    - 갯수 제한이 없고, 필요없으면 생략도 가능하다.
      >매개변수1, 매개변수2, 매겨변수3.....같이 나열하여 사용.

[2. 반환값] : 함수 입장에서는 함수 기능 수행을 다 하고 반환해주는 값이고, 사용자 입장에서는 돌려 받는 값
    - return 뒤에 오는 '값'은 함수의 수행이 끝나고 전달되는 값
    - 'return'이라는 것을 사용하면 함수의 수행이 끝남(반복문의 break처럼)

-매개변수와 반환값의 유/무에 따른 함수 종류
1. 둘 다 있거나
2. 둘 다 없거나
3. 둘 중 하나만 있다(2가지 경우)
>>총 4 가지 경우가 있는데 어떻게 만들지는 누가 정해주는 것이 아니라 함수 기능의 목적에 따라 만드는 사람(개발자)가 결정하는 것.
'''
print("===========function=================") # function : 다른 언어에서 기능, 함수, 매소드 등으로 불리기도 함

#1. 매개변수와 반환값이 둘 다 있는 함수
#def : define >>함수를 정의하는 것, 즉 만들겠다!

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

#함수는 def정의만 해놓으면 아무런 효력이 없다. 단지 이런 기능(함수)가 있다고 만들어놓기만 한 것이고 반환된 결과를 호출해줘야 수행문이 수행된다.
#↓↓↓↓호출
result = add(1, 2)
#add(1, 2) 호출하면 add함수의 수행문으로 코드가 점프!이동~1)이 때 매개변수 a, b에는 차례대로 1, 2가 대입된다 2)리턴 뒤에 값이 있으면 그 값을 반환하는데 리턴값이 +이므로
#에드 함수 호출이 끝나면 원래 호출했던 위치로 돌아온다. 반환된 값이 있으면 그 값을 들고온다 >>>>3
#결국 반환된 값에 의해 리절트=3과 같은 코드가 된 것(코드가 변한것은 아니고 저런 연산과정을 거쳤다는 것)
print(result)
'''
my_str = input("입력 : ") #내부적으로는 리턴"입력된 문자열"
print(my_str)
#잘못 이해한 예씨 : 1. 변수에 인풋 함수가 대입, 2. 프린트에서 인풋 함수가 수행
'''

#2. 매개변수와 변환값이 둘 다 없는 함수
def say_ho() :
    print("ho! ho!")
#>>기능 : 호출되면 hoho 라는 문자열을 출력하고 끝,
    #수행문 자체에 print함수를 사용한 1줄밖에 없다.
    #따로 규칙이 없이 리턴을 사용한다/안한다의 차이
  
say_ho() # print를 이용해 따로 출력하지 않아도 미리 정의된 매개변수(print("hoho"))에 따라 값이 출력된다.

#반환값이 있는 것과 잘못 지어서 연관하는 오류가 있다.
result = say_ho() #세이호 함수는 반환값이 없다. 
#리절트 변수에 무언가 값을 대입하는 행위를 했다
print("result의 값 : ", result)
'''
ho! ho!
ho! ho!
result의 값 :  None
라고 뜨는데 이는 반환을 아무것도 하지 않았는데 아무것도 없는 행위를 대입 >>> 리절트 변수에는 none이라는 값이 생기는것
'''
print("=====")
print(say_ho())

# 1)프린트 함수에서 툴력할 값으로 say_ho를 넣었다.
  #프린트로 sayho를 출력하려면 세이호라는 함수를 수행해야 하는데 세이호가 호출되면서 수행문을 수행하러 이동
  #이떄 수행문에 있는 호호가 수행되면서 출력이 됨.
  # 수행문이 끝나고 원래 위치로 돌아왔지만 반환된 값이 없어서 none(값이 없다)이 되는 것, 프린트는 반환된 값이 없는 값none을 출력하는 것(print(none))

#3. 반환값만 있는 함수
def get_ho() :
    #수행문 자리인데 수행문을 넣지 않음(왜? 내 마음. 규칙은 따로 없음)
    return "ho[[사용자:Shanmei|Shanmei]] ([[사용자토론:Shanmei|토론]]) 2018년 3월 27일 (화) 21:22 (KST)!" # 리턴도 일종의 수행문으로 볼 수 있다. (별도의 수행문을 넣지 않았을 뿐이지 수행문(반환값) 자체가 없는 것은 아님)
print("==3==")
print(get_ho())
#겟호가 수행되는것까지는 동일하고 반환값을 만나면서 겟호는 끝이 났다.
#원래 위치로 되돌아오면서 반환값을 들거왔으므로 반환값이 있다>>>>print에서 출력할 것(ho~~)가 생겨서 print(ho~~)rk tngod

# 반환값이 없는 함수는 그 반환값을 1)변수에 '대입'하여 사용하거나 2)특정 코드에서 '사용'하는 개념

#4. 매개변수만 있다.
def say(talk) :
    print(talk)
    #return을 사용하ㅓ지 않음>>반환값이 없다.
print("==4==")
say("ho! ho[[사용자:Shanmei|Shanmei]] ([[사용자토론:Shanmei|토론]]) 2018년 3월 27일 (화) 21:22 (KST)")
#반환값이 없는 함수는 그냥, 어디에 사용하거나 대입하지 않고 단독적으로 호출만 하면 됨(프린트로 출력 할 필요가 없다.)

#함수 연습
'''
    1. 홀짝 판별기
    - 함수로 전달된 값에 홀/짝 판별하는 함수 정의
    - 함수 이름은 : is_even_number >> 내가 전달한 값이 짝수가 맞니?
      1)함수에서 결과를 출력(반환 없음) is_even_number1
      2)함수에서 결과를 반환(출력 없음) is_even_number2

[출력결과]
숫자 입력 : 3
홀수입니다.
(입력은 미리 받아야 한다.) input_num(int(~~))
우리가 만든 함수(input_num)~~

    2. 큰 수에서 작은 함수를 뺀 결과를 반환하는 함수를 정의
        >매개변수로 2개의 숫자를 전달받음
        >2개의 숫자는 함수 외부에서 입력받음

[출력 결과]
두 수 입력 : 2 19
결과 : 17

    3. 1) 1~10 사이의 두 수를 입력받음
       2) 1~100까지 1)에서 입력받은 두 수의 공배수를 출력
         >매개변수로 두 개의 숫자를 전달받음
         >함수에서 바로 출력(반환없음)
[출력 결과]
두 수 입력 : 3 5
결과 : 15 30 45 60 75 90

'''

print("1-1)")
inp_n = int(input("숫자 입력 : "))
'''
def is_even_number1(inp_n) :
    if inp_n % 2 == 0 :
            print("짝수")
    else :
            print("홀수")


is_even_number1(inp_n)
'''
print("1-2)")
def is_even_number2(inp_n) :
    if inp_n % 2 == 0 :
            print("짝수")
    else :
            print("홀수")
    return 

result = is_even_number(inp_n)
print(result)
    


'''
#2번의 경우 뭘 반환한느냐에 따라 결과값이 달라님
#2-1)결과값이 문자열이 경우
result = is_even_number2(input_num)
print(result) #반환된게 "짝수"와 같은 문자열

#2-2) 결과를 t/f로 변환
result = is_even_number2(input_num)
if result == True :
    print("짝수")
'''

#변수에 어떤 형태도 대입할 수 있는 것처럼 반환도 형태를 가리지 않는다. 단 반환된 형태가 그 자료형이 되기 때문에 출력할 때 형태에 맞게 써야 함
def test1() :
    return 1

def test2() :
    return "ㅋㅋㅋ"

def test3() :
    return [1, 2, 3]

a = test1()
b = test2()
c = test3()

print("====")
print(a)
print(b)
print(c)