함수 (function) 는특정작업을수행하는명령어들의모음에이름을붙인것 함수는작업에필요한데이터를전달받을수있으며, 작업이완료된후에는작업의결과를호출자에게반환할수있다.
print() input() abs(), 함수안의명령어들을실행하려면함수를호출 (call) 하면된다. >>> value = abs(-100) >>> value 100
>>>def say_hello(name): print(" 안녕, ", name); >>>say_hello(" 철수 ") 안녕, 철수 >>>def say_hello(name, msg): print(" 안녕, ", name, " 야, ", msg); >>>name=" 철수 " >>>msg=" 어서집에오너라 " >>>say_hello(name, msg) 안녕, 철수야, 어서집에오너라
>>>def get_sum(start, end) : sum=0 for i in range(start, end+1) : sum += i return sum >>>value = get_sum(1, 10) >>>print(value) 55
프로그램안에서중복된코드를제거한다. 복잡한프로그래밍작업을더간단한작업들로분해할수있다 함수는한번만들어지면다른프로그램에서도재사용될수있다. 함수를사용하면가독성이증대되고, 유지관리도쉬워진다.
함수의목적을설명하는동사또는동사 + 명사를사용 square(side) compute_average(list) set_cursor_type(c) // 정수를제곱하는함수 // 평균을구하는함수 // 커서의타입을설정하는함수
함수를사용하려면함수를호출 (call) 하여야한다.
def get_sum(start, end) : sum=0 for i in range(start, end+1) : sum += i return sum print( get_sum(1, 10)) print( get_sum(1, 20)) 55 210
정수를입력받아서제곱한값을반환하는함수를만들어보자.
def square(n): return(n*n) print(square(10)) 100
두개의정수가주어지면두수중에서더큰수를찾아서이것을반환하는함수를만들어보자.
def get_max(x, y): if( x > y ): return x else: return y print(get_max(10, 20)) 20
정수의거듭제곱값을계산하여반환하는함수를작성하여보자. ( 파이썬에는 ** 연산자가있지만 )
def power(x, y): result = 1 for i in range(y): result = result * x return result print(power(10, 2)) 100
파이썬인터프리터는함수가정의되면함수안의문장들은즉시실행하지않는다. 함수정의가아닌문장들은즉시실행하게된다. print(power(10, 2)) def power(x, y): result = 1 for i in range(y): result = result * x return result 무엇이문제인가?
def main(): print(power(10, 2)) def power(x, y): result = 1 for i in range(y): result = result * x return result main() 이런형태는가능하다!
생일축하메시지를출력하는함수 happybirthday() 를작성해보자. 생일축하합니다! 생일축하합니다! 사랑하는친구의생일축하합니다!
def happybirthday(): print(" 생일축하합니다!") print(" 생일축하합니다!") print(" 사랑하는친구의 ", end=" ") print(" 생일축하합니다!") happybirthday()
섭씨온도를화씨온도로변환하여반환하는함수 FtoC() 를작성하고테스트하라. 화씨온도를입력하시오 : 32.0 0.0
# 함수가여기서정의된다. def FtoC(temp_f): temp_c = (5.0 * (temp_f - 32.0)) / 9.0; return temp_c; temp_f = float(input(" 화씨온도를입력하시오 : ")) # FtoC() 함수를호출한다. print(ftoc(temp_f))
여기서는소수를판별하는함수 is_prime() 을작성하여사용하여보자. 정수를입력하시오 : 101 True
def is_prime(n): for i in range(2, n): if ( n%i == 0 ): return False return True n = int(input(" 정수를입력하시오 : ")) print(is_prime(n))
인수 (argument) 는호출프로그램에의하여함수에실제로전달되는값이다. 매개변수 (parameter) 는이값을전달받는변수이다.
반환값 (return value) 은함수가호출한곳으로반환하는작업의결과값이다.
구의부피를계산하는함수 spherevolume() 을작성하여보자. 반지름이 r 인구의부피는다음과같다. 구의반지름을입력하시오 : 10.0 4188.790204786391
import math def spherevolume(radius): volume = (4.0 / 3.0) * math.pi * radius * radius * radius return volume; radius = float(input(' 구의반지름을입력하시오 : ')) print(spherevolume(radius))
일회용패스워드생성기를이용하여서 3 개의패스워드를생성하여출력하는프로그램을작성해보자. q546zv 1kvkss b3vrmi
import random def genpass(): alphabet = "abcdefghijklmnopqrstuvwxyz0123456789" password = "" print(genpass()) print(genpass()) print(genpass()) for i in range(6): index = random.randrange(len(alphabet)) password = password + alphabet[index] return password
파이썬에서는함수의매개변수가기본값을가질수있다. 이것을디폴트인수 (default argument) 라고한다. def greet(name, msg=" 별일없죠?"): print(" 안녕 ", name + ', ' + msg) greet(" 영희 ") 안녕영희, 별일없죠?
인수들이위치가아니고키워드에의하여함수로전달되는방식 >>> def calc(x, y, z): return x+y+z >>> calc(10, 20, 30) 60 >>> calc(x=10, y=20, z=30) 60 >>> calc(y=20, x=10, z=30) 60
사칙연산을수행하는 4 개의함수 (add(), sub(), mul(), div()) 를작성한다. 이들함수를이용하여 10+20*30 을계산하여보자. 함수를호출할때키워드인수를사용하여호출해보자. 610
def add(a, b): return a + b def sub(a, b): return a - b def mul(a, b): return a * b def div(a, b): return a / b r1 = mul(a=20, b=30) r2 = add(a=10, b=r1) print(r2)
섭씨온도를화씨온도로, 또그반대로변환하는프로그램을작성하여보자. 'c' 섭씨온도에서화씨온도로변환 'f' 화씨온도에서섭씨온도로변환 'q' 종료메뉴에서선택하세요.c 섭씨온도 : 100 화씨온도 : 212.0 'c' 섭씨온도에서화씨온도로변환 'f' 화씨온도에서섭씨온도로변환 'q' 종료메뉴에서선택하세요.
def printoptions(): print( " 'c' 섭씨온도에서화씨온도로변환 ") print( " 'f' 화씨온도에서섭씨온도로변환 ") print( " 'q' 종료 ") def C2F(c_temp): return 9.0 / 5.0 * c_temp + 32 def F2C(f_temp): return (f_temp - 32.0) * 5.0 / 9.0 printoptions() choice = input(" 메뉴에서선택하세요.") while choice!= "q": if choice == "c": temp = float( input(" 섭씨온도 : ")) print (" 화씨온도 :", C2F(temp)) elif choice == "f": temp = float(input(" 화씨온도 : ")) print (" 섭씨온도 :", F2C(temp)) printoptions() choice = input(" 메뉴에서선택하세요.")
함수를호출할때, 변수를전달하는 2 가지방법 값에의한호출 (call-by-value) 참조에의한호출
def modify1(s): s += "To You" msg = "Happy Birthday" print("msg=", msg) modify1(msg) print("msg=", msg) msg= Happy Birthday msg= Happy Birthday
def modify2(li): li += [100, 200] list = [1, 2, 3, 4, 5] print(list) modify2(list) print(list) [1, 2, 3, 4, 5] [1, 2, 3, 4, 5, 100, 200]
def sub(): s = " 바나나가좋음!" print(s) sub() 바나나가좋음!
def sub(): print(s) s = " 사과가좋음!" sub() 사과가좋음!
def sub(): s = " 바나나가좋음!" print(s) s = " 사과가좋음!" sub() print(s) 전역변수를사용하는것이아님! 바나나가좋음! 사과가좋음!
def sub(): global s print(s) s = " 바나나가좋음!" print(s) s = " 사과가좋음!" sub() print(s) 사과가좋음! 바나나가좋음! 바나나가좋음!
def sub(x, y): global a a = 7 x,y = y,x b = 3 print(a, b, x, y) a,b,x,y = 1,2,3,4 sub(x, y) print(a, b, x, y) 7 3 4 3 7 2 3 4
다음프로그램의실행결과는어떻게될까? # 함수가정의된다. def sub( mylist ): # 리스트가함수로전달된다. mylist = [1, 2, 3, 4] # 새로운리스트가매개변수로할당된다. print (" 함수내부에서의 mylist: ", mylist) return # 여기서 sub() 함수를호출한다. mylist = [10, 20, 30, 40]; sub( mylist ); print (" 함수외부에서의 mylist: ", mylist)
함수내부에서의 mylist: [1, 2, 3, 4] 함수외부에서의 mylist: [10, 20, 30, 40]
파이를전역변수로선언하고이것을이용하여서원의면적과원의둘레를계산하는함수를작성해보자. 원의반지름을입력하시오 : 10 원의면적 : 314.159265358979 원의둘레 : 62.8318530717958
PI = 3.14159265358979 # 전역상수 def main(): radius = float(input(' 원의반지름을입력하시오 : ') print(' 원의면적 :', circlearea(radius)) print(' 원의둘레 :', circlecircumference(radius)) def circlearea(radius): return PI*radius*radius def circlecircumference(radius): return 2*PI*radius main()
def sub(): return 1, 2, 3 a, b, c = sub() print(a, b, c) 1 2 3
무명함수는이름은없고몸체만있는함수이다. 파이썬에서무명함수는 lambda 키워드로만들어진다.
sum = lambda x, y: x+y; print( " 정수의합 : ", sum( 10, 20 )) print( " 정수의합 : ", sum( 20, 20 )) 정수의합 : 30 정수의합 : 40
함수나변수들을모아놓은파일을모듈 (module)
fibo.py # 피보나치수열모듈 def fib(n): # 피보나치수열을화면에출력한다. a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a+b print()
>>> import fibo >>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo. name 'fibo >>> from fibo import * >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
만약파이썬모듈을다음과같이명령어프롬프트를이용하여실행한다면 C> python fibo.py <arguments> if name == " main ": import sys fib(int(sys.argv[1]))
C> python fibo.py 50 1 1 2 3 5 8 13 21 34 if name == " main ": import sys fib(int(sys.argv[1]))
1. 문제를한번에해결하려고하지말고더작은크기의문제들로분해한다. 문제가충분히작아질때까지계속해서분해한다. 2. 문제가충분히작아졌으면각각의문제를함수로작성한다. 3. 이들함수들을조립하면최종프로그램이완성된다.
def readlist(): nlist = [] flag = True; while flag : number = int(input(" 숫자를입력하시오 : ")) if number < 0: flag = False else : nlist.append(number) return nlist def processlist(nlist): nlist.sort() return nlist def printlist(nlist): for i in nlist: print(" 성적 =", i)
def main(): nlist = readlist() processlist(nlist) printlist(nlist) if name == " main ": main() 숫자를입력하시오 : 30 숫자를입력하시오 : 50 숫자를입력하시오 : 10 숫자를입력하시오 : 90 숫자를입력하시오 : 60 숫자를입력하시오 : -1 성적 = 10 성적 = 30 성적 = 50 성적 = 60 성적 = 90
함수는동일한코드를재사용하기위한것이다. 함수는 def 로작성된다. 함수안에서선언되는변수는지역변수이고함수의외부에서선언되는변수는전역변수이다. 함수나변수들을모아놓은파일을모듈 (module) 이라고한다.