본문 바로가기
🐍Python

[20210728] Python 기본 문법 3 - 함수, 사용자 입력, 파일

by 캔 2021. 7. 28.

함수(function)

함수는 매개변수를 입력받아 작업을 수행한 후 값을 반환해준다. "def: 함수명(매개변수1, 매개변수2,..., 매개변수n)"와 같은 형식으로 함수를 직접 정의할 수 있다. 매개변수 지정 시에는 형을 지정하지 않아도 되며(참고로 Python 3.6 이후에는 정적 타입 선언도 가능해짐), 값 반환은 return 예약어를 사용한다.

# 함수
"""
기본구조
def 함수명(매개변수):
    수행할 문장 1
    수행할 문장 2
    return 리턴값
    ....
"""


# 인수와 매개변수
def add(a, b):  # a, b는 매개변수(parameters)
    return a + b


a = 3
b = 4
c = add(a, b)  # a, b는 인수(arguments)
print(c)

# 함수의 형태는 입력값과 결괏값의 존재 유무에 따라 4가지 유형으로 나뉜다.
# 1. 일반적인 함수: 입력값, 결괏값이 모두 있는 함수
"""
def 함수명(매개변수):
    수행할 문장
      ......
    return 결괏값
"""


# 호출 시
# 결괏값을 받을 변수 = 함수명(인수1, 인수2)
def mul(a, b):
    result = a * b
    return result


a = mul(3, 4)
print(a)

# 2. 입력값이 없는 함수
"""
def 함수명():
    return 출력값
"""


# 호출 시
# 결괏값을 받을 변수 = 함수명(), 인수 없음.


def sayhello():
    return 'Hi'


a = sayhello()
print(a)

# 3. 결괏값이 없는 함수
"""
def 함수명(매개변수):
    print(매개변수를 처리한 값)
"""


# 호출 시
# 함수명(인수)


def sub(a, b):
    print("%d, %d의 빼기는 %d입니다." % (a, b, a - b))


sub(5, 3)
a = sub(4, 2)  # 리턴값이 없으므로 None 반환

# a를 출력해보면 None: 거짓, a는 받는 값이 없다.
# 함수에서 처리되어 출력하고 돌려주는 값이 없기 때문
# None 의미: list, tuple, dictionary, String 등의 경우,
# 선언만 되어있고 값이 없을 때, 숫자는 0일 때
# 참: list, tuple, dictionary, String에 값이 있을 때, 숫자는 0을 제외한 값.

# 4. 입력값도 결괏값도 없는 함수
"""
def 함수명():
    print("특정값")
"""


# 호출 시
# 함수명()

def sayHi():
    print('Hi Everyone!!')


sayHi()


# 매개변수 지정하여 호출하기
def add(a, b):
    return a + b


result = add(a=3, b=7)  # a에 3, b에 7을 전달
print(result)

result = add(b=5, a=3)
# b = 5
# a = 3
# result = add(b, a)

# 매개변수가 몇 개가 될지 모를 때?
'''
def 함수명(*매개변수):
    수행할 문장
      ...
'''


def add_many(*args):
    result = 0
    for i in args:
        result += i
    return result


result1 = add_many(1, 2, 3)
print(result1)
result2 = add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(result2)


def add_mul(choice, *args):
    if choice == "add":
        result = 0
        for i in args:
            result += i
    elif choice == "mul":
        result = 1
        for i in args:
            result *= i
    return result


result1 = add_mul('add', 1, 2, 3, 4, 5)
print(result1)
result2 = add_mul('mul', 1, 2, 3, 4, 5)
print(result2)


# 키워드 파라미터 kwargs 앞에 '**'을 붙여 사용한다. kwargs: keyword arguments의 약자
# 관례적으로 사용
# 딕셔너리 자료형으로 출력된다.
def print_kwargs(**kwargs):
    print(kwargs)


print_kwargs(a=1)
print_kwargs(name='hgd', age=18)


# 함수의 결괏값?
def add_and_mul(a, b):
    return a + b, a * b


result = add_and_mul(3, 4)  # 튜플 자료형으로 값이 리턴된다. (튜플은 값을 수정, 삭제 불가능)
print(result)  # add_and_mul 함수의 결괏값 a + b, a * b를 튜플값 하나인 (a + b, a * b)로 돌려준다.
# 결괏값을 따로 따로 받고 싶을때?
result1, result2 = add_and_mul(3, 4)
print(result1)
print(result2)


# return 문
def add_and_mul(a, b):
    return a + b  # 동작하고 탈출한다.
    return a * b  # 동작을 안한다.


result = add_and_mul(2, 3)  # 결괏값이 a + b 값만 출력된다.
print(result)


def say_nick(nick):
    if nick == "바보":
        return
    print("별명은 %s입니다." % nick)


say_nick('바보')
say_nick('천재')


# 매개변수에 초깃값 미리 설정하기
def say_myself(name, old, man=True):
    print("나의 이름은 %s입니다." % name)
    print("나이는 %d살입니다." % old)
    if man:
        print("남자입니다.")
    else:
        print("여자입니다.")


say_myself("이순신", 45)
say_myself("이순신", 45, True)
say_myself("김연아", 30, False)


def say_myself1(name, man=True, old):
    # non-default parameter follows default parameter
    # 초깃값을 정해놓은 변수 뒤에는 초깃값을 정해 놓지 않으면 매개변수를 사용할 수 없다.
    print("나의 이름은 %s 입니다." % name)
    print("나이는 %d살입니다." % old)
    if man:
        print("남자입니다.")
    else:
        print("여자입니다.")

# 함수 안에서 함수 밖의 변수를 변경하기
# vartest 함수에서 함수 밖의 변수 a를 1만큼 증가시키기..
# 1. return 사용
a = 1


def vartest(a):
    a = a + 1
    return a


a = vartest(a)
print(a)

# 2. global 명령어 사용
# global a: 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻. 권장하지 않는다.
a = 1


def vartest():
    global a
    a = a + 1


vartest()
print(a)

# 람다(lambda)는 함수를 생성할 때 사용하는 예약어이고 def와 동일한 역할을 한다.
# 보통 함수를 한 줄로 간결하게 만들 때 사용한다.
# 람다 예약어로 만든 함수는 return이 없어도 결과를 돌려준다.
"""
매개변수를 이용한 표현식:
    lambda 매개변수1, 매개변수2, ...
"""

add = lambda a, b: a + b
result = add(3, 4)
print(result)


def add(a, b):
    return a + b


result = add(3, 4)
print(result)

 

사용자 입력

input() 함수를 이용해서 값을 입력받을 수 있다. 기본적으로 문자열 자료형으로 값을 받아오며, int(), float() 등 다른 자료형으로 변환하여 사용 가능하다.

# 사용자 입력: 사용자가 입력한 값을 변수에 대입하고 싶을 때,
# input 사용
# 콘솔에 Life is too short, you need python를 입력하고 a를 출력하면
"""
>>> a = input()
Life is too short, you need python
"""
# 'Life is too short, you need python'이 나오는 걸 확인할  수 있다.
"""
>>> a
'Life is too short, you need python'
"""

# 프롬프트를 띄워서 사용자 입력받기
# input("질문 내용")
number = input("숫자를 입력하세요 :")
print(number)
type(number)  # <class 'str'> 문자열로 취급한다.

# 큰 따옴표(")로 둘러싼 문자열은 + 연산과 동일하다,
# 따옴표로 둘러싸인 문자열을 연속해서 쓰면 + 연산을 한 것과 같다.
print("Life" "is" "too short")  # 1
print("Life" + "is" + "too short")  # 2

# 문자열 띄어쓰기는 콤마(,)로 한다.
print("Life", "is", "too short")

# 한 줄에 결괏값 출력하기: 결괏값을 한 줄로 이어서 출력하기
for i in range(10):
    print(i, end='  ')

for i in range(10):
    print(i)

 

파일

파이썬에서는 open() 함수를 통해 파일을 읽거나 쓸 수 있다. 파일을 사용하고 난 후에는 파일 객체를 close() 함수로 닫아주어야 한다. with문을 사용하면 close() 함수로 닫아주지 않아도 된다.

# 파일을 읽고 쓰기
# 파일 생성하기
f = open("새 파일.txt", 'w')
f.close()

"""
open(): 파이썬 내장함수
파일 객체 = open(파일명, 파일 열기 모드)
파일	열기 모드	설명
r	읽기 모드	파일을 읽기만 할 때 사용
w	쓰기 모드	파일에 내용을 쓸 때 사용
a	추가 모드	파일의 마지막에 새로운 내용을 추가할 때 사용
"""

f = open("c:/pyworks/새 파일.txt", 'w')
# f = open("c:\\pyworks\\새 파일.txt",'w')처럼 역슬래시를 사용할 때는 이스케이프 시퀀스(\\) 사용
f.close()

# 파일을 쓰기 모드로 열어, 출력값 적기
f = open("c:/pyworks/새 파일.txt", 'w')
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()

# 화면 콘솔로 출력해준다.
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i
    print(data)

# 외부에 저장된 파일 읽어오기
# readline() 함수 사용
f = open("c:/pyworks/새 파일.txt", 'r')
line = f.readline()
print(line)  # 1번째 줄입니다.
f.close()

# 모든 줄을 읽어 오기, while 반복문 사용
f = open("c:/pyworks/새 파일.txt", 'r')
while True:
    line = f.readline()
    if not line:
        break
    print(line)
f.close()

# readlines() 함수 사용
f = open("c:/pyworks/새 파일.txt", 'r')
lines = f.readlines()
for line in lines:
    print(line)
f.close()

# 줄바꿈 \n 문자 제거
f = open("c:/pyworks/새 파일.txt", 'r')
lines = f.readlines()
for line in lines:
    line = line.strip()  # strip
    print(line)
f.close()

# read 함수 사용, 파일의 내용 전체를 문자열로 돌려준다. data는 파일의 전체 내용이다.
f = open("c:/pyworks/새 파일.txt", 'r')
data = f.read()
print(data)
f.close()

# 파일에 새로운 내용 추가하기, append 모드
f = open("c:/pyworks/새 파일.txt", 'a')
for i in range(11, 21):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()

# 파일을 읽어와서 추가된 내용 출력하기
f = open("c:/pyworks/새 파일.txt", 'r')
data = f.read()
print(data)
f.close()

# with문 사용: with 블록을 벗어나는 순간, 열린 파일 객체 f가 자동으로 close되어 편리하다.
f = open("aaa.txt", 'w')
f.write("Life is too short, you need python")
f.close()  # 파일 객체는 열면 닫아줘야 하는데 이는 잊어버리기 쉽고 귀찮은 일이다.

with open("aaa.txt", 'w') as f:
    f.write("Life is too short, you need python")