카테고리 없음

[네이버 부스트코스] 프로그래밍 기초(ft. 파이썬) 4차시: 매개변수와 반환값을 가진 함수

닉네임이 멋이 중헌디 2021. 2. 5. 18:16

1. 매개변수와 반환값을 가진 함수 

2. 함수 사용 로봇 조종과 디지털 사진 변환

3. 함수 인자와 매개변수

4. 함수가 사용하는 지역변수와 전역변수

 

 

4-1. 매개변수와 반환값을 가진 함수 

 

1)함수

 

함수(Function)라는 이름은 수학에서 비롯되었습니다.

한 원소

수학에서의 함수의 정의는 한 집합의 임의의 한 원소를, 다른 집합의 오직 한 원소에 대응시키는 대응 관계입니다.

 

 

이 예시에서 x는 함수의 인자(Argument)이고, f(x)는 함수의 결과입니다.

Python에서의 함수 역시 인자를 전달받아 결과를 반환합니다.

 

 

 

유용한 함수

 

Python은 많은 내장 함수를 제공하고 있습니다.

형 변환 함수는 객체의 형태를 다른 형태로 바꿔주는 함수입니다.

 

 

 

2)수학 함수

 

수학 함수를 사용하려면, Python에서 math 모듈을 사용하고 싶다고 선언해야 합니다.

 

import math

degrees = 45

radians = degrees / 360.0 * 2 * math.pi print(math.sin(radians)) print(math.sqrt(2) / 2)

 

함수들을 자주 사용한다면 함수에 더 짧은 이름을 지어줄 수 있습니다.

 

import math

sin = math.sin

pi = math.pi

radians = degrees / 360.0 * 2 * pi print(sin(radians))

 

 

3)매개 변수를 사용한 함수 정의

 

함수는 인자들을 가리키는 변수들을 이용하여 정의됩니다.

이 이름들은 매개 변수 (Parameter)라고 부릅니다.

 

 

함수 내부에서 매개 변수는 다른 변수와 동일하게 사용됩니다.

 

 

함수의 결과 계산이 끝나면 결과값을 반환 (Return)해야 합니다.

함수는 함수가 반환되는 시점에 종료되며, 함수의 결과는 반환값을 통해 전달됩니다.

 

 

이제 우리는 같은 함수를 다른 인자 값들을 이용하여 부를 수 있습니다.

 

 

 

4)여러 반환문을 가진 함수

 

다음 함수는 절대값을 계산하는 함수입니다 (내장 함수 abs와 동일한 기능):

 

def absolute(x):

  if x < 0:

     return -x

  else:

     return x

 

같은 함수를 다음처럼 쓸 수도 있습니다.

 

def absolute(x):

    if x < 0:

        return –x

    return x

 

하지만, 다음처럼 쓰면 안 됩니다.

 

-> x = 0 이 정의되지 않음 

 

5)논리값을 반환하는 함수

 

조건을 검사해서 True False를 반환하는 함수는 조건함수(Predicate)라고 부릅니다.

 

# is integer a divisible by b?

def is_divisible(a, b):

   if a % b == 0:

      return True

   else:

      return False

 

조건 함수는 if 문이나 while 문에서 바로 사용할 수 있습니다.

 

if is_divisible(x, y):

    print('x is divisible by y')

 

위 함수는 다음처럼 간단하게 정의할 수도 있습니다.

 

def is_divisible(a, b):

          return a % b == 0

 

 

결과값이 없는 함수

 

지금까지 사용한 함수들 중에는 반환문이 없는 함수들도 많이 있습니다.

 

def turn_right():

   for i in range(3):

      hubo.turn_left()

 

반환문이 없는 함수는 자동으로 None 반환합니다.

 

 

 

함수 호출

 

함수가 호출되면, 호출될 때의 함수 인자 (argument) 들은 함수의 매개 변수 (parameter)로 대입됩니다.

 

 

함수 호출에 사용하는 인자의 수는 함수의 매개 변수의 수와 동일해야 합니다.

 

 

 

여러 값 반환하기

 

함수는 하나의 값만 반환할 수 있습니다.

하지만 함수는 튜플을 반환할 수도 있습니다.
Python은 함수가 여러 값을 반환할 때, 자동으로 이 값들을 튜플로 만들어 반환합니다.

 

def student():

  name = "Hong, Gildong"

  id = 20101234

  return name, id

 

튜플로 된 반환값은 다음처럼 바로 풀어낼 수 있습니다.

 

 

 

키보드 입력

 

input 함수는 메시지를 출력하고, 키보드를 통한 사용자의 문자열 입력을 기다립니다.

사용자가 Enter 키를 입력하면, 사용자가 입력한 전체 문자열이 반환됩니다.

 

name = input("What is your name? ")

print("Welcome to CS101, " + name)

 

숫자 입력이 필요하다면, 문자열을 숫자로 변환해야 합니다.

 

raw_n = input("Enter a positive integer> ")

n = int(raw_n)

for i in range(n):  -> raw_n을 문자열이 아닌 숫자로 해야 반복 가능

print("*" * i)

 

4-3. 인자와 매개변수

1)매개 변수의 대상

 

다음 코드의 실행 결과는 무엇일까요?

 

def swap(a, b):

   a, b = b, a

x, y = 123, 456

swap(x, y)

print (x, y) -> 그대로 x = 123, y = 456 

=> swap함수의 결과값 swap(x,y)와 x,y의 값은 다르다 

 

 

 

a는 변수 x를 가리키는 이름이 아니라, 객체 123의 새로운 이름입니다.

swap(x,y): 

   x,y = 123, 456 = y,x 

 

 

 

2)함수 인자

 

우리는 함수의 인자 매개 변수에 대해 배웠습니다.

 

def create_sun(radius, color):

   sun = Circle(radius)

   sun.setFillColor(color)

   sun.setBorderColor(color)

   sun.moveTo(100, 100)

   return sun

 

sun = create_sun(30, "yellow")

 

 

3)매개 변수의 기본값

 

함수의 매개 변수에는 기본값을 설정할 수 있습니다.

 

def create_sun(radius = 30, color = "yellow"):

        sun = Circle(radius)

        sun.setFillColor(color)

        sun.setBorderColor(color)

        sun.moveTo(100, 100)

        return sun

 

이제 우리는 이렇게 함수를 부를 수 있습니다.

 

moon = create_sun(28, "silver")

star = create_sun(2) # create_sun(2, "yellow")과 동일

sun = create_sun() # create_sun(30,"yellow")과 동일

 

 

매개 변수의 기본값 활용 예제

 

def avg(data, start = 0, end = None):

          if not end: # (not None)==True, (not 4)==False end = len(data)

          return sum(data[start:end]) / float(end-start)

 

 

참고 :기본값을 가지는 매개 변수는 다른 매개 변수의 뒤에 와야 합니다.

 

def f1(x, y=0): # 옳은 함수 정의

return x+y Def f2(x=0, y): # 틀린 함수 정의 return x+y

 

 

이름이 있는 인자

 

함수를 부를 때 인자에 이름을 붙여서 부를 수 있습니다.

인자에 이름을 붙여 주면 함수를 부르는 코드를 좀 더 명확하게 할 수 있고,
함수를 부를 때 인자의 순서를 고려하지 않아도 됩니다.

 

 

4-4. 함수가 사용하는 지역변수와 전역변수

 

ax^2+bx+c 식을 계산하기 위한 함수는 다음과 같이 만들 수 있습니다.

 

def quadratic(a, b, c, x):

quad_term = a * x ** 2

lin_term = b * x

return quad_term + lin_term + c

 

quad_term과 lin_term 변수는 quadratic 함수 안에서만 사용할 수 있습니다. 이러한 변수들은 지역 변수 (local variable)라고 부릅니다.

 

함수의 매개 변수 또한 지역 변수입니다.(매개변수도 지역변수)
함수가 호출될 때, 함수 호출에 사용된 인자들이 매개 변수로 대입됩니다.

 

def quadratic(a, b, c, x):

quad_term = a * x ** 2

lin_term = b * x

return quad_term + lin_term + c

result = quadratic(2, 4, 5, 3)

 

지역 변수는 함수 안에서만 사용할 수 있는 변수입니다.

 

a → 2

b → 4

c → 5

x → 3

quad _term → 18

lin_term → 12

 

 

지역 변수를 사용하는 이유: 모듈화

 

사람은 한 번에 너무 많은 내용들을 기억하기 힘듭니다.

큰 소프트웨어가 있을 때, 소프트웨어의 세세한 부분들이 어떻게 만들어졌는지 몰라도 각 부분들이 하는 역할만 알고 있다면 우리는 이 소프트웨어를 이해할 수 있습니다.

quadratic 함수를 사용하기 위해서는 다음 내용만 기억하면 됩니다.

 

def quadratic(a, b, c, x): # implemented somehow

 

모듈화란 소프트웨어를 여러 부분으로 나눠서 개발하는 것을 의미합니다. 소프트웨어의 한 기능을 사용하기 위해서는, 그 기능의 역할만 알면 되고 그 기능이 어떻게 구현되어 있는지는 몰라도 됩니다. 

 

cs1robots는 Robot 타입의 객체를 구현하는 모듈입니다.
로봇의 각 기능이 어떻게 구현되었는지는 모르더라도 로봇은 움직일 수 있습니다.

 

 

전역 변수

 

함수 밖에서 정의된 변수들은 전역 변수 (global variable)라 부릅니다.

전역 변수는 함수 안에서도 읽거나 쓸 수 있습니다.

 

 

전역 변수는 어느 함수에서나 사용할 수 있기 때문에 실수를 일으키기 쉽습니다.

이 때문에, 큰 프로그램일수록 전역 변수를 조심해서 사용해야 합니다.

 

 

 

지역 변수와 전역 변수

 

함수 안에서 값을 읽기 하는 변수는 전역 변수입니다.

 

def f1():

  return 3 * a + 5

 

함수 안에서 값을 쓰는 (write)  변수는 지역 변수 입니다.

 

def f2(x):

  a = 3 * x + 17

  return a * 3 + 5 * a

 

다음 test 함수의 결과는 무엇일까요?

 

a = 17

def test():

  print(a)

  a = 13

  print(a)

 

test()

 

오류 발생!

변수 a는 test 함수 안에서 값을 썼기 (a = 13) (write) 때문에 지역 변수지만, 첫 번째 print문이 불린 시점에서 지역 변수  값이 정의되지 않았기 때문에 (전역변수가 불려서) 오류가 발생합니다.

 

 

전역 변수의 값 쓰기

 

함수 안에서 전역 변수의 값을 바꿔야 할 때가 있습니다.

이때 변수 앞에 global을 붙여줍니다. 

 

hubo = Robot()

hubo_direction = 0

 

def turn_left():

  hubo.turn_left()

  global hubo_direction => 위처럼 a = 13이라고 그냥 재설정하는 것이 아니라 global을 붙여서 

  hubo_direction += 90 => 재설정

 

def turn_right():

   for i in range(3):

        hubo.turn_left()

        global hubo_direction

        hubo_direction -= 90

 

 

지역 변수와 전역 변수

 

a = "Letter a" => 전역변수

 

def f(a):        => write(지역변수)

  print("A = ", a)

 

def g():         => write(지역변수) 

  a = 7

  f(a + 1)

  print("A = ", a

 => 이미 정의된 f()(함수 안에 함수가 있다면 들어가서 연산을 끝내고 나와야)와 print()에따라 a=7이 각각 대입되어 A=8, A=7

 

  print("A = ", a)  => a를 정의하지 않으므로 전역변수 사용, A= letter a

  f(3.14)             => 함수 속 지역변수 a에 3.14가 들어가도 

  print("A = ", a)  => 전역변수 a에 영향을 미치진 않는다 

  g()                  => 함수로 a=7이 되어도

  print("A = ", a)  => 전역변수 a에 영향을 미치지 않는다