01 Sep 2017 » python

2017-09-01-python

함수

파이썬에서는 def를 이용해 함수를 만들 수 있다.

  1. 코드조각에 이름을 붙인다. 함수명
  2. 스크립트가 argv를 받듯이 실행 인자를 받음.
  3. 1번과 2번을 이용해 '작은 스크립트'나 '작은 명령'을 만든다.

함수는 작은 스크립트라고 생각하면 된다.

"함수를 실행, 호출, 사용한다는 것은 모두 같은 뜻이다."

In [1]:
# -*- coding: utf-8 -*-

# argv를 쓴 스크립트와 비슷한 함수
def print_two(*args):
    arg1, arg2 = args
    print("실행인자1: {}, 실행인자2: {}".format(arg1, arg2))

    
# 좋아요. 사실 *args는 필요가 없습니다. 그냥 이렇게 하죠.
def print_two_again(arg1, arg2):
    print("실행인자1: {}, 실행인자2: {}".format(arg1, arg2))

    
# 이 함수는 실행인자를 하나만 받습니다.
def print_one(arg1):
    print("실행인자1: {}".format(arg1))

    
# 이 함수는 실행인자를 하나도 받지 않습니다.
def print_none():
    print("아무것도 받지 않음.")

    
print_two("Zed", "Shaw")
print_two_again("Zed", "Shaw")
print_one("First!")
print_none()
실행인자1: Zed, 실행인자2: Shaw
실행인자1: Zed, 실행인자2: Shaw
실행인자1: First!
아무것도 받지 않음.

위 함수 뜯어보기

*args → argv 매개변수와 비슷함. 함수에서 사용됨.

*의 의미는 함수가 모든 실행인자를 받고 args에 리스트로 넣는다는 뜻

공백은 스페이스 네 개


이제부터는 스크립트를 터미널에서 실행시킬 필요가 없으면 Jupyter Notebook에서 직접 실행할 것이다.

cf. 터미널에서 실행시킬 경우는 아래와 같이 실행 시키면 된다.

$ python ex18.py

함수에서 쓴 변수는 스크립트에 쓴 변수와 연결되지 않는다.

In [2]:
# -*- coding: utf-8 -*-

def cheese_and_crackers(cheese_count, boxes_of_crackers):
    print("치즈가 {}개 있어요!".format(cheese_count))
    print("크래커가 {}상자 있어요!".format(boxes_of_crackers))
    print("파티 벌이기에 충분하네요!")
    print("담요 한 장 가져 오세요.\n")


print("함수에 그냥 숫자를 직접 줄 수 있습니다.")
cheese_and_crackers(20, 30)


print("스크립트의 변수를 쓸 수도 있고요.")
amount_of_cheese = 10
amount_of_crackers = 50


cheese_and_crackers(amount_of_cheese, amount_of_crackers)


print("안에서 계산을 해도 됩니다.")
cheese_and_crackers(10+20, 5+6)


print("합쳐서 변수도 쓰고 계산도 할 수도 있습니다.")
cheese_and_crackers(amount_of_cheese+100, amount_of_crackers+1000)
함수에 그냥 숫자를 직접 줄 수 있습니다.
치즈가 20개 있어요!
크래커가 30상자 있어요!
파티 벌이기에 충분하네요!
담요 한 장 가져 오세요.

스크립트의 변수를 쓸 수도 있고요.
치즈가 10개 있어요!
크래커가 50상자 있어요!
파티 벌이기에 충분하네요!
담요 한 장 가져 오세요.

안에서 계산을 해도 됩니다.
치즈가 30개 있어요!
크래커가 11상자 있어요!
파티 벌이기에 충분하네요!
담요 한 장 가져 오세요.

합쳐서 변수도 쓰고 계산도 할 수도 있습니다.
치즈가 110개 있어요!
크래커가 1050상자 있어요!
파티 벌이기에 충분하네요!
담요 한 장 가져 오세요.

치즈와 크래커의 수를 묻고 싶을 경우

raw_input 으로 받은 값을 정수로 변환해준다.

int()를 사용해서

함수 local변수명과 global변수명은 같아 지지 않도록 주의하자.

함수의 실행인자의 개수는 5개정도가 좋다.


함수와 파일

ex20.py 스크립트를 아래와 같이 작성하자.

In [ ]:
# -*- coding: utf-8 -*-

from sys import argv

script, input_file = argv

def print_all(f):
    print(f.read())

def rewind(f):
    f.seek(0)

def print_a_line(line_count, f):
    print(line_count, f.readline())

current_file = open(input_file)

print("파일 전체를 출력해 봅시다.\n")

print_all(current_file)

print("이번에는 테이프처럼 되감아 봅시다.")

rewind(current_file)

print("세 줄을 출력해 봅시다.")

current_line = 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)

스크립트를 실행시키면 다음과 같다.

+=를 써서 스크립트 수정

In [ ]:
# -*- coding: utf-8 -*-

from sys import argv

script, input_file = argv

def print_all(f):
    print(f.read())

def rewind(f):
    f.seek(0)

def print_a_line(line_count, f):
    print(line_count, f.readline())

current_file = open(input_file)

print("파일 전체를 출력해 봅시다.\n")

print_all(current_file)

print("이번에는 테이프처럼 되감아 봅시다.")

rewind(current_file)

print("세 줄을 출력해 봅시다.")


## +=를 써서 스크립트 수정
current_line = 0

for i in range(3):
    current_line += 1
    print_a_line(current_line, current_file)

seek

파일의 읽기 헤드를 원하는 위치로 이동(seek)시켜 작업할 수 있다.

In [ ]:
f.seek(0)     # 파일 처음으로 이동

f.readline()  # 파일에서 한 줄 읽어 드리고, 읽기 헤드를 \n 바로 다음으로 옮긴다.

+= 연산

아래 연산은 같은 연산이다.

In [ ]:
x = x + y

x += y

반환하는 함수

In [4]:
# -*- coding: utf-8 -*-

def add(a, b):
    print("덧셈 {} + {}".format(a,b))
    return(a + b)

def subtract(a, b):
    print("뺄셈 {} - {}".format(a, b))
    return(a - b)

def muliply(a, b):
    print("곱셈 {} * {}".format(a, b))
    return(a * b)

def divide(a, b):
    print("나눗셈 {} / {}".format(a, b))
    return(a / b)

print("함수만으로 계산해 봅시다!")

age = add(30, 5)
weight = subtract(78, 4)
height = muliply(90, 2)
iq = divide(100, 2)

print("나이: {}, 키: {}, 몸무게: {}, IQ: {}".format(age, height, weight, iq))

# 추가 점수 문제. 일단 써 보세요.
print("문제가 있어요.")

what = add(age, subtract(height, muliply(weight, divide(iq, 2))))

print("결과:", what, "손으로 계산할 수 있나요?")
함수만으로 계산해 봅시다!
덧셈 30 + 5
뺄셈 78 - 4
곱셈 90 * 2
나눗셈 100 / 2
나이: 35, 키: 180, 몸무게: 74, IQ: 50.0
문제가 있어요.
나눗셈 50.0 / 2
곱셈 74 * 25.0
뺄셈 180 - 1850.0
덧셈 35 + -1670.0
결과: -1635.0 손으로 계산할 수 있나요?

cf) raw_input( )

In [ ]:
## 정수로 값을 입력 받음
int(raw_input())


## 부동소수점으로 값을 입력 받음
float(raw_input())

Reference

  • 깐깐하게 배우는 파이썬


Related Posts