생능출판사 (가칭)"데이터과학 파이썬" 코드 6장

6.2 def 예약어를 이용하여 함수를 작성하고 호출하기

In [1]:
def print_address() :
    print('경상북도')
    print('울릉군 울릉읍')
    print('독도리 산 1-96번지')

print_address()  # 정의한 함수를 호출
경상북도
울릉군 울릉읍
독도리 산 1-96번지

6.3 왜 우리는 함수를 작성하는가?

In [2]:
print('경상북도')
print('울릉군 울릉읍')
print('독도리 산 1-96번지')
경상북도
울릉군 울릉읍
독도리 산 1-96번지
In [3]:
print_address()
print_address()
print_address()
경상북도
울릉군 울릉읍
독도리 산 1-96번지
경상북도
울릉군 울릉읍
독도리 산 1-96번지
경상북도
울릉군 울릉읍
독도리 산 1-96번지

6.4 함수에 1개의 입력 전달하기

In [4]:
def print_address(name):
    print("서울 특별시 종로구 1번지")
    print("파이썬 빌딩 7층")
    print(name)

print_address("홍길동")
서울 특별시 종로구 1번지
파이썬 빌딩 7층
홍길동

6.5 값 반환하기

In [5]:
def calculate_area(radius): 
    area = 3.14 * radius**2 
    return area      # 이전 줄에서 구한 area 값을 호출문에 돌려준다
In [6]:
c_area = calculate_area(5.0)   # calculate_are() 함수가 계산한 값을 c_area에 저장
In [7]:
print(calculate_area (5.0))
78.5
In [8]:
area_sum = calculate_area(5.0) + calculate_area(10.0)
print(area_sum)
392.5
In [9]:
calculate_area(10.0)   # 함수를 호출만 하고 그 반환값을 사용안함
Out[9]:
314.0

6.6 여러 개의 값 반환하기

In [10]:
def sort_num(n1, n2):      # 2개의 값을 받아오는 함수
    if n1 < n2:
        return n1, n2      # n1이 더 작으면 n1, n2 순서로 반환
    else:
        return n2, n1      # n2가 더 작으면 n2, n1 순서로 반환

print(sort_num(110, 210))  # 110과 210을 함수의 인자로 전달하고 반환되는 값을 출력
print(sort_num(2100, 80))
(110, 210)
(80, 2100)
In [11]:
def calc(n1, n2):
    return n1 + n2, n1 - n2, n1 * n2, n1 / n2  # 덧셈, 뺄셈, 곱셈, 나눗셈 결과를 반환

n1, n2 = 200, 100
t1, t2, t3, t4 = calc(n1, n2)  # 네 개의 값을 반환받기 위해 4개의 변수를 사용함
print(n1, '+', n2, '=', t1)
print(n1, '-', n2, '=', t2)
print(n1, '*', n2, '=', t3)
print(n1, '/', n2, '=', t4)
200 + 100 = 300
200 - 100 = 100
200 * 100 = 20000
200 / 100 = 2.0

6.7 함수에 여러 개의 값을 전달하기

In [12]:
def get_sum(start, end):   # start, end를 매개변수로하여 인자를 받는다
    s = 0 
    for i in range(start, end+1): # start부터 end까지 정수의 합을 구함
        s += i 
    return s    # start부터 end까지 수의 합을 반환한다
 
print(get_sum(1, 10)) # 1에서 10까지 정수의 합 55를 출력한다
55
In [13]:
x = get_sum(1, 10)    # 1과 10이 get_sum()의 인자가 된다. 
print('x =', x)

y = get_sum(1, 20)    # 1과 20이 get_sum()의 인자가 된다. 
print('y =', y)
x = 55
y = 210

LAB 6-1 사각형을 그리는 함수 작성하기

In [14]:
import turtle 

t = turtle.Turtle() 
t.shape("turtle") 

def square(length):       # length는 한변의 길이 
    for i in range(4): 
        t.forward(length) 
        t.left(90) 
 
square(100)      # square() 함수를 호출한다. 
square(200)      # 호출시 인자값을 100, 200, 300으로 다르게 한다
square(300) 

turtle.done()
try:
    turtle.bye()
except:
    print("bye") 
bye

LAB 6-2 n-각형을 그리는 함수 작성하기

In [15]:
import turtle 
t = turtle.Turtle() 
 
# n-각형을 그리는 함수를 정의한다. 
def n_polygon(n, length): 
    for i in range(n): 
        t.forward(length) 
        t.left(360//n)      # 정수 나눗셈은 //으로 한다. 
 
for i in range(10): 
    t.left(20) 
    n_polygon(6, 100) 
    
turtle.done()
try:
    turtle.bye()
except:
    print("bye")     
bye

6.8 변수의 범위

In [16]:
def print_counter():
    print('counter =', counter)  # 함수 내부의 counter 값

counter = 100
print_counter()
print('counter =', counter)      # 함수 외부의 counter 값
counter = 100
counter = 100
In [17]:
def print_counter():
    counter = 200
    print('counter =', counter)  # 함수 내부의 counter 값

counter = 100
print_counter()
print('counter =', counter)      # 함수 외부의 counter 값
counter = 200
counter = 100

6.9 함수 안에서 전역변수 사용하기

In [18]:
def print_counter():
    global counter      # 함수 외부의 전역변수 counter를 사용하겠다는 선언
    counter = 200
    print('counter =', counter)  # 함수 내부의 counter 값

counter = 100
print_counter()
print('counter =', counter)      # 함수 외부의 counter 값
counter = 200
counter = 200
In [19]:
def calculate_area(radius): 
    global area 
    area = 3.14 * radius**2 
    return 
 
area = 0 
r = float(input("원의 반지름: ")) 
calculate_area(r) 
print(area) 
원의 반지름: 10
314.0

6.10 디폴트 인자

In [20]:
def greet(name, msg): 
    print("안녕", name + ', ' + msg) 
 
greet("철수", "좋은 아침!")
안녕 철수, 좋은 아침!
In [21]:
greet("영희")    # 인자를 1개만 전달하여 greet()을 호출함
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-21-4261a76d49a5> in <module>
----> 1 greet("영희")    # 인자를 1개만 전달하여 greet()을 호출함

TypeError: greet() missing 1 required positional argument: 'msg'
In [22]:
def greet(name, msg="별일없죠?"): 
    print("안녕", name + ', ' + msg) 
 
greet("영희")
greet("철수")
greet("민수", "잘 지내고 있으시죠?")
안녕 영희, 별일없죠?
안녕 철수, 별일없죠?
안녕 민수, 잘 지내고 있으시죠?

6.11 키워드 인자

In [23]:
def power(base, exponent): 
    return base**exponent   # base가 밑이고, exponent가 지수값이다.
In [24]:
 power(2, 10)  # 2의 10승을 반환한다
Out[24]:
1024
In [25]:
power(10, 2)  # 10의 2승을 반환한다
Out[25]:
100
In [26]:
power(base=2, exponent=10)  # 2의 10승을 반환한다
Out[26]:
1024
In [27]:
power(exponent=10, base=2)  # 2의 10승을 반환한다
Out[27]:
1024
In [28]:
power(base = 10, 2)
  File "<ipython-input-28-1d2882bbce62>", line 1
    power(base = 10, 2)
                    ^
SyntaxError: positional argument follows keyword argument

LAB 6-3 주급 계산 프로그램

In [29]:
def weeklyPay(rate, hour): 
    if (hour > 30): 
        money = rate*30 + 1.5*rate*(hour-30)
    else: 
        money = rate*hour
    return money

r = int(input("시급을 입력하시오: "))       # 시급입력받기
h = int(input("근무 시간을  입력하시오: ")) # 근무시간 입력받기
print("주급은 " + str(weeklyPay(rate = r, hour = h)))
시급을 입력하시오: 10000
근무 시간을  입력하시오: 38
주급은 420000.0

LAB 6-4 리스트에서 최대값을 찾는 함수

In [30]:
def getMinMax(mylist, method = 'max'):
   minValue = 999999999999999999999999999999999
   maxValue = -minValue

   if method == 'max' :
       for value in mylist:
           if value > maxValue:
               maxValue = value;
       return maxValue
   elif method == 'min' :
       for value in mylist:
           if value < minValue:
               minValue = value;
       return minValue
   else :
       print('illegal method')

list_data = [27, 90, 30, 87, 56]
i=0
while(True) :
   print(list_data)
   method_input = input('최대값을 원하면 max, 최소값을 원하면 min을 입력하시오: ')
   print(getMinMax(list_data, method_input))
   i+=1
   if(i==4):
    break
[27, 90, 30, 87, 56]
최대값을 원하면 max, 최소값을 원하면 min을 입력하시오: min
27
[27, 90, 30, 87, 56]
최대값을 원하면 max, 최소값을 원하면 min을 입력하시오: max
90
[27, 90, 30, 87, 56]
최대값을 원하면 max, 최소값을 원하면 min을 입력하시오: minmax
illegal method
None
[27, 90, 30, 87, 56]
최대값을 원하면 max, 최소값을 원하면 min을 입력하시오: max
90

LAB 6-5 막대 그래프 그리기

In [31]:
import turtle 

def drawBar(height): 
    t.begin_fill()
    t.left(90)
    t.forward(height)
    t.write(str(height), font = ('Times New Roman', 16, 'bold'))
    t.right(90)
    t.forward(40)
    t.right(90)
    t.forward(height)
    t.left(90)
    t.end_fill()

data = [120, 56, 309, 220, 156, 23, 98] 
 
t = turtle.Turtle() 
t.color("blue") 
t.fillcolor("red")  
t.pensize(3) 
 
for d in data: 
    drawBar(d) 
    
turtle.done()
try:
    turtle.bye()
except:
    print("bye")     
bye

LAB 6-6 함수 그리기

In [35]:
import turtle 
t = turtle.Turtle() 
t.shape("turtle") 
t.speed(0) 
 
def f(x): 
    return x**2 + 1 
 
t.goto(200, 0) 
t.goto(0, 0) 
t.goto(0, 200) 
t.goto(0, 0) 
 
for x in range(150): 
    t.goto(x, int(0.01*f(x)))

turtle.done()
try:
    turtle.bye()
except:
    print("bye")            
bye

6.12 자기자신을 호출하는 재귀 함수

In [36]:
def factorial(n):                   # n!의 재귀적 구현
    if n <= 1 :                     # 종료 조건이 반드시 필요하다			
        return 1 
    else :				
        return n * factorial(n-1)   # n * (n-1)! 정의에 따른 구현 

print('4! = ', factorial(4))        # 인자로 4를 넣어 호출
4! =  24

LAB 6-7 피보나치 함수 계산하기

In [37]:
def fibonacci(n): 
    if n<0:                                   # 입력 오류 검사
        print("잘못된 입력입니다.") 
    elif n==1:                                # 재귀호출 중단 조건
        return 0 
    elif n==2:                                # 재귀호출 중단 조건
        return 1 
    else: 
        return fibonacci(n-1) + fibonacci(n-2)  # 재귀호출

i = int(input("몇 번째 항: ")) 
print(fibonacci(i))  
몇 번째 항: 7
8

6.13 모듈을 이용한 함수의 재활용

In [38]:
import datetime              # 날짜와 시간을 다루는 모듈
datetime.datetime.now()
Out[38]:
datetime.datetime(2022, 3, 24, 2, 37, 2, 619067)
In [39]:
today = datetime.date.today()
print(today)
2022-03-24
In [40]:
today
Out[40]:
datetime.date(2022, 3, 24)
In [41]:
today.year
Out[41]:
2022
In [42]:
today.month
Out[42]:
3
In [43]:
today.day
Out[43]:
24

6.14 나만의 모듈을 만들고 불러서 사용해 보자

In [44]:
# filename: my_func.py
def mf_print(msg, n = 1) :
   print(msg * n)
In [45]:
# filename: main.py
import my_func

my_func.mf_print("my_func was imported ", 3)  # my_func 모듈의 mf_print() 함수 호출
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-45-1f9877d0ac4e> in <module>
      1 # filename: main.py
----> 2 import my_func
      3 
      4 my_func.mf_print("my_func was imported ", 3)  # my_func 모듈의 mf_print() 함수 호출

ModuleNotFoundError: No module named 'my_func'
In [ ]:
# filename: main.py
import my_func as mf

mf.mf_print('[alias]', 5)  # mf라는 별명을 사용해서 메시지를 5회 반복출력
In [ ]:
# filename: main.py
from my_func import mf_print

mf_print('-no module name-', 2)  # mf_print()를 호출할 때 my_func.을 사용안해도 됨
In [ ]:
# filename: main.py
from my_func import *

mf_print('-no module name-', 2)