함수 내에서 또 다른 함수를 호출할 수 있음
def fun1():
print('fun1 호출!')
fun2()
def fun2():
print('fun2 호출!')
fun3()
def fun3():
print('fun3 호출!')
Python
복사
ex) 구구단을 연쇄해서 실행해보자.
def guguDan2():
for i in range(1,10):
print('2 * {} = {}'.format(i, 2*i))
guguDan3()
def guguDan3():
for i in range(1,10):
print('3 * {} = {}'.format(i, 3*i))
guguDan4()
def guguDan4():
for i in range(1,10):
print('4 * {} = {}'.format(i, 4*i))
guguDan5()
def guguDan5():
for i in range(1,10):
print('5 * {} = {}'.format(i, 5*i))
guguDan2()
Python
복사
pass 를 이용해서 실행문을 생략할 수 있다
def printTodayWeather(): # 함수 선언부
pass # 함수 실행부
Python
복사
함수의 매개변수와 인수는 개수가 동일해야 한다
ex) 계산기 함수
def cal(n1,n2):
print(f'{n1} + {n2} = {n1 + n2}')
print(f'{n1} - {n2} = {n1 - n2}')
print(f'{n1} / {n2} = {n1 / n2}')
print(f'{n1} * {n2} = {n1 * n2}')
cal(10,20)
Python
복사
매개변수의 개수가 정해지지 않은 경우에는 ‘*’ 를 매개변수 앞에 붙여준다.
•
이때 인수들의 타입은 튜플이다.
def printNumber(*numbers):
for number in numbers:
print(number, end='')
print()
printNumber()
printNumber(1)
printNumber(1,2)
printNumber(1,2,3)
printNumber(1,2,3,4)
Python
복사
# 국어,영어,수학 점수를 받고 총점, 평균을 출력하는 함수
def testResult(kor,eng,mat):
sum = kor + eng + mat
avg = sum / 3
print('총점 : {}'.format(sum))
print('평균 : {}'.format(round(avg,2)))
korScore = int(input('국어 점수 입력: '))
engScore = int(input('영어 점수 입력: '))
matScore = int(input('수학 점수 입력: '))
testResult(korScore,engScore,matScore)
Python
복사
return 을 만나면 그 아래 코드는 실행되지 않는다
def calculator(n1,n2):
result = n1 + n2
return result
print('hello') # -> 앞에 return 이 있기때문에 실행되지 않는다.
returnValue = calculator(10,20)
print(f'returnValue: {returnValue / 2}') # 'returnValue / 2' 한 값을 출력
Python
복사
ex) 사용자가 길이(cm)를 입력하면 mm로 환산한 값을 반환하는 함수
def cmTomm(cm):
result = cm * 10
return result
length = float(input('길이(cm) 입력: '))
returnValue = cmTomm(length)
print(f'returnValue: {returnVlaue}mm')
Python
복사
ex) 1 ~ 100 까지의 정수중 홀수인 난수를 반환하는 함수
# 1부터 100까지의 정수 중 홀수인 난수를 반환하는 함수
import random
def getOddRandomNumber():
while True:
num = random.randint(1,100)
if num % 2 != 0:
break
return num
print(f'returnValue: {getOddRandomNumber()}')
Python
복사
지역 변수 / 전역 변수
•
전역 변수 : 함수 밖에서 정의된 변수, 어디에서나 사용 가능. but 함수 안에서 수정 불가
◦
무슨 말이냐?
함수 안에서 전역 변수와 동일한 이름의 변수를 정의해준다고 해도, 전역변수와는 별개라는 의미! 함수 안에서만 유효한 변수다.
# ex. 지역 변수를 함수 밖에서 사용하면 error
def printNumbers():
num_in = 20
print(f'num_in : {num_in}')
print(f'num_in : {num_in}') # -> error 발생
Python
복사
# 사용자가 가로, 세로 길이를 입력하면 사각형과 삼각형의 넓이를 출력하는 함수
# 전역 변수 이용하기
def squareTriangle():
square = width * height
triangle = (width * height) / 2
print(f'사각형의 넓이 : {square}')
print(f'삼각형의 넓이 : {triangle}')
width = int(input('가로 길이: '))
height = int(input('세로 길이: '))
squareTriangle()
Python
복사
•
global 키워드 : 굳이 전역변수를 함수 안에서 수정하고 싶을 경우 사용한다.
num_out = 10
def printNumbers():
global num_out # 전역 변수를 갖고옴
num_out = 20 # 전역 변수 값을 변경
print(f'num_out: {num_out}')
printNumbers() # 20
print(f'num_out: {num_out}') # 전역 변수값도 변경됨
# num_out: 20
# num_out: 20
Python
복사
# 방문객수를 카운트하는 함수를 만들자
# global 키워드 -> 함수를 호출할 때마다 누적될 수 있다
totalVisit = 0
def countTotalVisit():
global totalVisit # 전역변수 가져옴
totalVisit += 1 # 1씩 더함
print(f'누적 방문객 수 : {totalVisit}') # 값을 출력
countTotalVisit()
countTotalVisit()
countTotalVisit()
countTotalVisit()
countTotalVisit()
Python
복사
중첩 함수
함수 안에 또 다른 함수가 선언 되고 있는 형태
•
내부 함수는 함수 안에서 호출될수는 있지만 함수 밖에서 호출될 수는 없다.
def out_function():
print('out_function called!')
def in_function():
print('in_function called!')
in_function() # -> 가능!!!
in_function() # -> error!
Python
복사
# calculator함수를 선언하고 안에 덧셈, 뺄셈, 곱셈, 나눗셈 함수를 선언하자
def calculator(x,y,operator):
def add():
result = x + y
print(f'덧셈 연산 : {result}')
def sub():
result = x - y
print(f'뺄셈 연산 : {result}')
def mul():
result = x * y
print(f'곱셈 연산 : {result}')
def div():
result = x / y
print(f'나눗셈 연산 : {result}')
if operator == 1:
add()
elif operator == 2:
sub()
elif operator == 3:
mul()
else:
div()
while True:
n1 = int(input('실수 n1 입력: '))
n2 = int(input('실수 n2 입력: '))
op = int(input('사용할 연산 입력(1:덧셈, 2:뺄셈, 3:곱셈, 4:나눗셈, 5:종료: '))
if op == 5:
print('계산 종료!')
break
calculator(n1,n2,op)
Python
복사
lambda 함수
함수 선언을 보다 간결하게 할 수 있다.
예를 들어 아래의 def 함수 식을
def calculator(x,y):
return x + y
returnValue = calculator(10,20)
print(f'returnValue: {returnValue}')
Python
복사
lambda 식을 활용하면 아래와 같다
calculator = lambda x,y : x + y
returnValue = calculator(10,20)
print(f'returnValue: {returnValue}')
Python
복사
ex) 삼각형, 사각형, 원의 넓이를 출력하는 함수를 lambda 식으로 만들어보자.
Triangle = lambda x,y : (x * y) / 2
Square = lambda x,y : x * y
Circle = lambda r : r * r * 3.14
width = int(input('가로 길이 입력: '))
height = int(input('세로 길이 입력: '))
radius = int(input('반지름 길이 입력: '))
triangleValue = Triangle(width,height)
squareValue = Square(width,height)
circleValue = Circle(radius)
print(f'삼각형의 넓이: {triangleValue}')
print(f'사각형의 넓이: {squareValue}')
print(f'원의 넓이: {circleValue}')
Python
복사
모듈
•
내부 모듈 : 파이썬 설치 시 기본적으로 사용할 수 있는 모듈
•
외부 모듈 : 별도 설치 후 사용할 수 있는 모듈 → import
◦
random
▪
random.randint : 정수 난수 1개를 발생
import random
rNum = random.randint(1,100) # 1 ~ 100까지의 정수 중 난수 1개 발생
Python
복사
▪
random.sample : 지정한 범위에서 지정한 개수만큼 난수 발생(2개의 매개변수)
import random
rNums = random.sample(range(1,101), 10) # 1 ~ 100까지의 값 중에서 10개의 난수 발생
Python
복사
•
사용자 모듈 : 사용자가 직접 만든 모듈
모듈 제작
내가 필요한 기능들을 넣어놓은 파이썬 파일을 만들어보자.
•
모듈은 파일이름.py 형태의 파이썬 파일이고
•
쓰고 싶을 때는 import 파일이름 으로 가져오면 된다.
ex) 로또 6개의 번호를 랜덤하게 추출해주는 py 모듈 만들기
# lottoMachine.py
import random
def getLottoNumbers():
result = random.sample(range(1,46),6)
return result
Python
복사
import lottoMachine
lottoNumbers = lottoMachine.getLottoNumbers()
print(f'lottoNumbers: {lottoNumbers}')
Python
복사
ex ) 입력한 문자열을 거꾸로 출력해주는 py 모듈 만들기
# reverseStr.py
def reverseStr(str):
return str[::-1]
Python
복사
import reverseStr
userInputStr = input('문자열 입력: ')
reversedString = reverseStr.reverseStr(userInputStr)
print(f'reversedString: {reversedString}')
Python
복사
중급 문제 풀이__함수
# 산술연산 계산기
def add(n1,n2):
return n1 + n2
def sub(n1,n2):
return n1 - n2
def mul(n1,n2):
return n1 * n2
def div(n1,n2):
return n1 / n2
def mod(n1,n2):
return n1 % n2
def flo(n1,n2):
return n1 // n2
def exp(n1,n2):
return n1 ** n2
while True:
cal = int(input('1.덧셈, 2.뺄셈, 3.곱셈, 4.나눗셈, 5.나머지, 6.몫, 7.제곱승, 8.종료'))
if cal == 8:
print('Bye ~')
break
n1 = int(input('첫 번째 숫자 입력: '))
n2 = int(input('두 번째 숫자 입력: '))
if cal == 1:
print(add(n1,n2))
elif cal == 2:
print(sub(n1,n2))
elif cal == 3:
print(mul(n1,n2))
elif cal == 4:
print(div(n1,n2))
elif cal == 5:
print(mod(n1,n2))
elif cal == 6:
print(flo(n1,n2))
elif cal == 7:
print(exp(n1,n2))
Python
복사
# 이동 거리 반환
print('-'*60)
s = float(input('속도(km/h) 입력: '))
h = float(input('시간(h) 입력: '))
m = float(input('시간(m) 입력: '))
def getDistance(s,h,m):
return s * (h + (m/60))
d = getDistance(s,h,m)
print(f'{s}(km/h)속도로 {h}(h)시간 {m}(m)분 동안 이동한 거리: {d}(km)')
Python
복사
# 이동 시간 반환 : 속도와 거리가 입력
def getTime(s,d):
time = d / s
print(f'time: {time}')
h = int(time) # '시'
m = int((time - h) * 100 * 60 / 100) # '분'
return [h,m]
s = float(input('속도(km/h) 입력: '))
d = float(input('거리(km) 입력: '))
t = getTime(s,d)
print(f'{s}(km/h)속도로 {d}(km) 이동한 시간: {t[0]}(h)시간 {t[1]}(m)분 ')
Python
복사
# 비행기 티켓 영수증 출력 함수
childPrice = 18000
infantPrice = 25000
adultPrice = 50000
specialDc = 0.5
def formatedNumber(n):
return format(n, ',')
def printAirPlaneReceipt(c1,c2,i1,i2,a1,a2):
cp = c1 * childPrice
cp_dc = c2 * childPrice * specialDc
print(f'유아 {c1}명 요금: {formatedNumber(cp)}원')
print(f'유아 할인 대상 {c2}명 요금: {formatedNumber(cp_dc)}원')
ip = i1 * infantPrice
ip_dc = i2 * infantPrice * specialDc
print(f'소아 {i1}명 요금: {formatedNumber(ip)}원')
print(f'소아 할인 대상 {i2}명 요금: {formatedNumber(ip_dc)}원')
ap = a1 * adultPrice
ap_dc = a2 * adultPrice * specialDc
print(f'성인 {a1}명 요금: {formatedNumber(ap)}원')
print(f'성인 할인 대상 {a2}명 요금: {formatedNumber(ap_dc)}원')
print(f'Total: {c1 + c2 + i1 + i2 + a1 + a2}명')
print(f'TotalPrice: {formatedNumber(cp + cp_dc + ip + ip_dc + ap + ap_dc)}원')
childCnt = int(input('유아 입력: '))
specialDcChildCnt = int(input('할인 대상 유아 입력: '))
infantCnt = int(input('소아 입력: '))
specialDcInfantCnt = int(input('할인 대상 소아 입력: '))
adultCnt = int(input('성인 입력: '))
specialDcadultCnt = int(input('할인 대상 성인 입력: '))
printAirPlaneReceipt(childCnt,specialDcChildCnt,infantCnt,specialDcInfantCnt,adultCnt,specialDcadultCnt)
Python
복사
# 재귀함수를 이용해서 팩토리얼 함수를 만들어보기
def factorial(n):
if n == 1:
return 1
return factorial(n-1)
num = int(input('input number: '))
print(format(factorial(num),','))
Python
복사
# 단리/월복리 계산기 함수를 만들자
# 단리 함수
def singleRate(m,t,r):
totalMoney = 0
totalRateMoney = 0
for i in range(t):
totalRateMoney += m * (r * 0.01)
totalMoney = m + totalRateMoney
return int(totalMoney) # 소수점은 모두 제거
# 월복리 함수
def multiRate(m,t,r):
totalMoney = m
t = t * 12
mr = (r / 12) * 0.01
for i in range(t):
totalMoney += totalMoney * mr
return int(totalMoney)
money = int(input('예치금(원): '))
term = int(input('기간(년): '))
rate = int(input('연이율(%): '))
print('단리 계산기')
print(format(singleRate(money,term,rate),','))
print('복리 계산기')
print(format(multiRate(money,term,rate),','))
Python
복사
# 등차수열의 n번째 값과 합을 출력하는 함수를 만들어보자.
a1 = int(input('a1 입력: '))
d = int(input('공차 입력: '))
n = int(input('n 입력: '))
def sequence(a,d,n):
valueN = 0; sumN = 0;
i = 1
while i <= n: #n번째 항까지 수행
valueN = a + (i-1)*d
sumN = sumN + valueN
print(f'{i}번째 항의 값: {valueN}')
print(f'{i}번째 항까지의 합: {sumN}')
i += 1
sequence(a1,d,n)
Python
복사
# 등비수열의 n번째 값과 합을 출력하는 함수
a1 = int(input('a1 입력: '))
r = int(input('공비 입력: '))
n = int(input('n 입력: '))
def sequenceR(a,r,n):
valueN = 0; sumN = 0;
i = 1
while i <= n: #n번째 항까지 수행
valueN = a * r**(i-1) # 해당 항의 값을 구하고
sumN = sumN + valueN
print(f'{i}번째 항의 값: {valueN}')
print(f'{i}번째 항까지의 합: {sumN}')
i += 1
sequenceR(a1,r,n)
Python
복사