(1) 반복적으로 사용되는 가치 있는 부분을 한 뭉치로 묶어서 어떤 입력값을 주었을 때 어떤 결과값을 돌려준다
(2) 기능 단위의 함수로 분리해 놓으면 프로그램 흐름을 일목요연하게 볼수 있다.
(3) 프로그램 흐름도 잘 파악할 수 있고 오류가 어디에서 나는지도 쉽게 알아차릴 수 있다.
파이썬 함수의 구조
def는 함수를 만들때 사용하는 예약어, 함수명은 개발자가 임의로 만들어 준다. 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수이다.
def 함수명(매개변수) :
수행할 문장1
수행할 문장2
...
def add(a, b) :
return a+b
a = 3
b = 4
c = add(a, b)
print(c) # 출력결과 : 7
위의 함수 이름은 add이고 입력값을 2개 받아서 더한값을 리턴(출력)하는 함수이다. 변수 a에 3, b에 4를 대입한 후 변수 c에 add 함수의 리턴값을 대입하면 c는 a와 b를 더한 값 7이 출력되는 것을 확인할 수 있다.
매개변수와 인수
매개변수와 인수는 혼용해서 사용되는 헷갈리는 용어다. 매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 전달하는 입력값을 의미한다.
def add(a, b) # a, b는 매개변수
return a+b
print(add(3, 4)) # 3, 4는 인수
매개변수 : 함수에 전달된 값을 저장하는 변수
인수 : 함수에 전달하는 값
여러개의 입력값을 받는 함수 만들기
예제로 여러 개의 입력값을 모두 더하는 함수를 만들어 보자. add_many(1, 2)면 3, add_many(1, 2, 3)이면 6, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이면 55를 리턴하는 함수를 만들어 보자
def add_many(*nums) :
result = 0
for i in nums :
result = result + i
return result
result = add_many(1, 2, 3)
print(result) # 출력결과 : 6
result = add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(result) # 출력결과 : 55
add_many함수는 입력값이 3개든 10개든 상관이 없다. *nums 처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어 준다. 또 *nums 하나만 사용하는 것이 아니라 다른 매개변수도 같이 사용할 수 있다.
def add_mul(choice, *nums) :
if choice == "add" :
result = 0
for i in nums :
result = result + i
elif choice == "mul" :
result = 1
for i in nums :
result = result * i
return result
result = add_mul('add', 1, 2, 3, 4, 5)
print(result) # 출력결과 : 15
result = add_mul('mul', 1, 2, 3, 4, 5)
print(result) # 출력결과 : 120
프로그램을 실행한 디렉터리에 새로운 파일을 만들 수 있다. 파이썬 내장함수 open을 사용해서 파일을 생성한다. open함수는 "파일 이름" 과 "파일 열기 모드" 를 입력값으로 받고 결괏값으로 파일 객체를 리턴한다.
파일 객체 = open(파일 이름, 파일 열기 모드)
파일열기모드
설명
r
읽기모드 - 파일을 읽기만 할 때 사용
w
쓰기모드 - 파일에 내용을 쓸 때 사용
a
추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용
f = open("새파일.txt", 'w')
f.close()
파일을 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성된다. 그리고 파일을 프로젝트가 생성된 경로가 아니라 (windows10 기준 바탕화면) C:/Users/user/Desktop/ 경로에 생성하고 싶다면 다음과 같이 작성한다.
f = open("C:/Users/user/Desktop/새파일.txt", 'w')
f.close()
f.close() 는 열려 있는 파일 객체를 닫아 주는 역할을 한다. 프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일 객체를 자동으로 닫아주기 때문에 생략이 가능하지만 close() 를 사용해서 열려있는 파일을 직접 닫아주는 것이 좋다. 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문이다.
x와 y는 조건식 혹은 조건문으로 이루어 진다. x에 money>=3000 이라는 식과 y 에 True 라는 값을 넣어서 확인해보자!
money = 2000
x = money >= 3000
y = True
if x or y :
print("x or y : True")
else :
print("x or y : False")
if x and y :
print("x and y : True")
else :
print("x and y : False")
if not x :
print("not x : True")
else :
print("not x : False")
'''
출력결과
x or y : True
x and y : False
not x : True
'''
in 연산자
다른 프로그래밍 언어에서는 쉽게 볼 수 없는 조건문을 제공한다. in의 뜻이 '~안에' 라는 의미가 있듯이 in 은 리스트, 튜플, 문자열안에 해당하는 값이 있다면 True, 없으면 False를 반환하고, not in의 경우에는 해당 리스트, 튜플, 문자열 안에 값이 없다면 True, 있으면 False값을 반환한다.
x = 'dokev archive'
y = [1, 2, 3]
print('d' in x) # 출력결과 : True
print('j' in x) # 출력결과 : False
print(1 not in y) # 출력결과 : False
print(4 not in y) # 출력결과 : True
elif 사용
보통 else if 로 자주 사용하지만 python에서는 elif로 사용된다. 조건문에서 처음 나오는 조건 if 이후에 나오는 다른 조건들은 elif (else if의 줄임말)을 사용해서 나타내도록 한다.
'''
elif 기본구조
if 조건문1 :
수행할 문장1
elif 조건문 2 :
수행할 문장2
elif 조건문 n :
수행할 문장n
else :
수행할 문장m
'''
money = 2000
if money >= 3000:
print("바닐라 라떼를 마신다")
elif money >= 1500:
print("아이스 아메리카노를 마신다")
else:
print("따뜻한 아메리카노를 마신다")
조건문이 참인 동안에 while문에 속한 문장들이 반복해서 수행된다. ex) "열번 찍어 안 넘어가는 나무 없다 "는 속담을 파이썬 프로그램으로 만들기
treeHit = 0
while treeHit < 10 :
treeHit = treeHit + 1
print("나무를 %d번 찍었습니다." %treeHit)
if treeHit == 10 :
print("나무가 넘어갑니다.")
'''
출력결과
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
나무가 넘어갑니다.
'''
위 예제에서 while문의 조건문은 treeHit < 10 이다. 즉 treeHit가 10보다 작은 동안에 while문이 반복돼서 실행된다. 그리고 treeHit가 10보다 크게 된다면 조건문이 False가 되므로 while문을 종료한다.
while문 강제로 빠져나가기
while문을 수행하다가 강제로 종료시키기 위해서는 break 문을 사용하면 된다. break문을 사용하는 시점에서 반복을 중지되고 while문이 종료되는 것을 볼 수 있다.
treeHit = 0
while treeHit < 10:
treeHit = treeHit +1
print("나무를 %d번 찍었습니다." % treeHit)
if treeHit == 3:
print("너무 힘들어서 그만둡니다.")
break
'''
출력결과
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
힘들어서 그만둡니다
'''
while문의 처음으로 돌아가기
break문은 while문을 빠져나갔다고 하면 continue문은 이후 문장을 실행하지 않고 while문의 처음으로 돌아가는 역할을 한다. treeHit가 3일때 이후 문장을 실행하지 않고 다시 while문의 처음으로 돌아가서 반복문을 다시 실행하는 것을 볼 수 있다.
treeHit = 0
while treeHit < 10 :
treeHit = treeHit + 1
if treeHit == 3 :
continue
print("나무를 %d번 찍었습니다." %treeHit)
'''
출력결과
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
'''
무한루프
while문의 조건식이 계속 참일 경우 반복문을 무한으로 실행한다. 아무 의미 없이 무한 루프를 돌리는 경우는 거의 없을 것이므로 무한루프를 빠져나가기 위해 [Ctrl]키 +[C]키를 눌러서 빠져 나오도록 한다.
for문
for문의 기본 구조
'''
for 변수 in 리스트(또는 튜플, 문자열) :
수행할 반복문1
수행할 반복문2
'''
fruits = ['strawberry', 'banana', 'orange']
for i in fruits:
print(i)
'''
출력결과
strawberry
banana
orange
'''
for문과 range함수
range 함수는 숫자 리스트를 자동으로 만들어 주는 함수로써 for문과 함께 사용하는 경우가 많다. range(10)은 0부터 10미만(10은 포함하지 않음)의 숫자를 포함하는 range객체를 만들어 주고, range(1, 11) 은 1부터 10까지(1이상, 11미만)의 숫자를 지정해준다.
a = range(10)
b = range(1, 11)
print(a) # 출력결과 : range(0, 10)
print(b) # 출력결과 : range(1, 11)
for문과 range함수를 함께 사용하는 예제를 살펴보자. 아래 예제는 1부터 10까지의 합을 구하는 문제를 for문과 range함수를 이용해서 작성한 것이다.
add = 0
for i in range(1, 11) :
add = add + i
print(add) # 출력결과 : 55
for문과 range함수를 이용한 구구단
for i in range(2, 10):
print("===", i, "단 ===", end="\n")
for j in range(1, 10):
print(i, "*", j, "=", i*j, end="\n")
print(end="\n")
'''
출력결과
=== 2 단 ===
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
.
.
.
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
'''
리스트 컴프리헨션
리스트 컴프리헨션(List comprehension) : 리스트 안에 for문을 포함, 좀 더 편리하고 직관적인 프로그램을 만들 수 있다. 아래 예제는 a리스트의 각 요소에 3을 곱한 결과를 result 리스트에 담는 예제이다.
a = [1, 2, 3, 4]
result = []
for num in a :
result.append(num*3)
print(result) # 출력결과 : [3, 6, 9, 12]
또한 리스트 컴프리헨션을 다음과 같이 표현할 수도 있다.
[ 표현식 for 항목 in 반복가능객체 if 조건문]
# a 리스트에서 짝수에만 3을 곱한다
a = [1, 2, 3, 4]
result = [num * 3 for num in a if num % 2 == 0]
print(result) # 출력결과 : [6, 12]
위와 같이 사용할 수도 있고, 복잡하지만 for문을 여러개 사용할 수도 있다. 구구단의 모든 결과를 리스트에 담아 보도록 하자
result = [x*y for x in range(2,10) for y in range(1,10)]
print(result) # 출력결과 : [2, 4, 6, ... 63, 72, 81]
변수 a에 저장한 문자열의 각 문자마다 번호를 매긴다. 번호는 0부터 시작한다. 그래서 index 0번(첫번째) 문자는 'L'이 되고 다음 index 1번(두번째) 문자는 'i' 가 된다. index 10번은 'o', 20번은 'o', 30번은 't' 가 된다. 그리고 index -1번은 문장의 가장 마지막에 있는 'n' 이 출력되는 것을 볼 수 있다.
a = "Life is too short, You need Python"
print(a[0]) # 출력결과 : L
print(a[1]) # 출력결과 : i
print(a[10]) # 출력결과 : o
print(a[-1]) # 출력결과 : n
"""
Life is too short, You need Python
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
0123456789012345678901234567890123
0 1 2 3
"""
- 문자열 슬라이싱(Slicing) : 자르다
a = "Life is too short, You need Python"
b = a[0] + a[1] + a[2] + a[3]
print(b) # 출력결과 : Life
위와 같이 단순하게 출력할 수도 있지만a [ 시작번호 : 끝번호 ]와 같은 방식으로 출력할 수 있다.
a = "Life is too short, You need Python"
b = a[0:4]
print(b) # 출력결과 : Life
print(a[19:]) # 출력결과 : You need Python
print(a[:17]) # 출력결과 : Life is too short
a[0:4]는 인덱스 0번부터 4번 전까지 출력하라는 의미다. a[7:] 은 인덱스 7번부터 끝까지, a[:20] 은 처음부터 인덱스20번 전까지 출력하라는 의미다.
- 문자열 포매팅(Formatting) : 문자열 안에 어떤 값을 삽입하는 방법
(1) 포맷 코드를 사용
코드
설명
%s
문자열(String)
%c
문자형(Character)
%d
정수(Integer)
%f
부동소수(floating-point)
%o
8진수
%x
16진수
%%
Literal % (문자 %)
# 숫자 대입
format1 = "I eat %d apples." % 3
print(format1) # 출력결과 : I eat 3 apples.
# 문자열 대입
format2 = "I eat %s apples." % "five"
print(format2) # 출력결과 : I eat five apples.
# 숫자 변수 대입
numbers = 2
format3 = "I eat %d apples." % numbers
print(format3) # 출력결과 : I eat 2 apples.
# 여러개 변수 대입
number = 10
day = "three"
format4 = "I eat %d apples. so I was sick for %s days." % (number, day)
print(format4) # 출력결과 : I eat 10 apples. so I was sick for three days.
# %문자 포함
format5 = "Error is %d%%." % 98
print(format5) # 출력결과 : Error is 98%.
(2) format() 함수 사용 : 문자열 작성 후 .format(data)
# 숫자 대입
format11 = "I eat {0} apples." .format(3)
print(format11) # 출력결과 : I eat 3 apples.
# 문자열 대입
format22 = "I eat {0} apples." .format("five")
print(format22) # 출력결과 : I eat five apples.
# 숫자 변수 대입
numbers = 2
format33 = "I eat {0} apples." .format(numbers)
print(format33) # 출력결과 : I eat 2 apples.
# 여러개 변수 대입
number = 10
day = "three"
format44 = "I eat {0} apples. so I was sick for {1} days." .format(number, day)
print(format44) # 출력결과 : I eat 10 apples. so I was sick for three days.
(3) f 문자열 포매팅 (파이썬 3.6버전 이상 사용가능)
문자열 앞에 f 접두사를 붙이면 f 문자열 포매팅 기능을 사용할 수 있다.
name = '도깨비'
age = 30
print(f'나의 이름은 {name}입니다. 나이는 {age}입니다.')
# 출력결과 : 나의 이름은 도깨비입니다. 나이는 30입니다.
f 문자열 포매팅은 문자열 안에서 변수와 +, -와 같은 수식을 함께 사용하는 표현식을 사용할 수 있다.
age = 30
print(f'나는 내년이면 {age+1}살이 된다.')
# 출력결과 : 나는 내년이면 31살이 된다.
Key와 Value를 한쌍으로 사용하는 딕셔너리도 사용이 가능하다.
d = {'name': '도깨비', 'age': 30}
# var = { 'key' : value }
print(f'나의 이름은 {d["name"]}입니다. 나이는 {d["age"]}입니다.')
# 출력결과 : 나의 이름은 도깨비입니다. 나이는 30입니다.