https://www.notion.so/e88436be3a5543329543f47f732660cf?pvs=4
교재 진도
구분 내부에 여러 문자열 사용시 문제점
www.notion.so

구분 내부에 여러 문자열 사용시 문제점
- 조건문이나 반복문 안에서 들여쓰기
- 문장 안에서 줄바꿈으로 여러 문자열을 사용하게 되면 같이 들여쓰기가 됨
- \n을 사용하면 해결 가능
# 홀수, 짝수 구분하는 프로그램
number = int(input("정수를 입력하세요> "))
if number % 2 == 0: # 짝수
print("""\
입력한 숫자는 {}입니다.
{}는 짝수입니다.\
""".format(number, number))
else: # 홀수
print("""\
입력한 숫자는 {}입니다.
{}는 홀수입니다.\
""".format(number, number))
-----------------------------------------------------
정수를 입력하세요> 16
입력한 숫자는 16입니다.
16는 짝수입니다
해결1
number = int(input("정수를 입력하세요> "))
if number % 2 == 0: # 짝수
print("입력한 숫자는 {}입니다.\n{}는 짝수입니다.".format(number, number))
else: # 홀수
print("입력한 숫자는 {}입니다.\n{}는 홀수입니다.".format(number, number))
-----------------------------------------------------
정수를 입력하세요> 16
입력한 숫자는 16입니다.
16는 짝수입니다.
- 함수 join( )
- 리스트 안의 문자열을 지정한 문자로 연결하여 합쳐줌
print("-".join(["010", "1234", "5678"]))
print(" ".join(["010", "1234", "5678"]))
print("|".join(["010", "1234", "5678"]))
-----------------------------------------------------
010-1234-5678
010 1234 5678
010|1234|5678
해결2
number = int(input("정수를 입력하세요> "))
if number % 2 == 0: # 짝수
print("\n".join(["입력한 숫자는 {}입니다.", "{}는 짝수입니다."]).format(number, number))
else: # 홀수
print("\n".join(["입력한 숫자는 {}입니다.", "{}는 홀수입니다."]).format(number, number))
-----------------------------------------------------
정수를 입력하세요> 16
입력한 숫자는 16입니다.
16는 짝수입니다.
- 소괄호로 문자열 연결하기
- 쉼표 없이 사용해야 함
# 소괄호로 문자 열결
a = (
"나는 "
"여름을 "
"좋아합니다"
)
print(a)
print(type(a))
-----------------------------------------------------
나는 여름을 좋아합니다
<class 'str'>
a = (
"나는 ",
"여름을 ",
"좋아합니다"
)
print(a) # 튜플이 되어버림
print(type(a))
-----------------------------------------------------
('나는 ', '여름을 ', '좋아합니다')
<class 'tuple'>
해결3
number = int(input("정수를 입력하세요> "))
if number % 2 == 0: # 짝수
print(("입력한 숫자는 {}입니다.\n"
"{}는 짝수입니다.").format(number, number))
else: # 홀수
print(("입력한 숫자는 {}입니다.\n"
"{}는 짝수입니다.").format(number, number))
-----------------------------------------------------
정수를 입력하세요> 16
입력한 숫자는 16입니다.
16는 짝수입니다.
- 이터레이터
- 이터러블 : 반복할 수 있는 것, 내부 요소를 순서대로 꺼내어 쓸 수 있는 객체 ex) 리스트, 딕셔너리, 문자열, 튜플
- 이터레이터 : 함수 next( )를 사용하여 꺼낼 수 있는 요소
a = [1, 2, 3]
b = reversed(a)
print(b)
print(list(b))
print(list(b)) # 메모리 효율성
-----------------------------------------------------
<list_reverseiterator object at 0x7fdbc68ffa30>
[3, 2, 1]
[]
a = [1, 2, 3]
b = list(reversed(a))
print(b); print(b)
-----------------------------------------------------
[3, 2, 1]
[3, 2, 1]
a = [1, 2, 3]
b = reversed(a)
print(next(b)) # 내부 요소를 순서대로 꺼내어 쓸 수 있음
print(next(b))
print(next(b))
-----------------------------------------------------
3
2
1
9. 함수
- 함수 만들기 - def 함수 이름( ):
- 매개변수 만들기
# 일반매개변수 = 값을 순서대로 입력
def printntimes(value, n):
for i in range(n): # n은 반드시 정수
print(value) # 무슨 값이든 상관 없음
printntimes("안녕", 3)
-----------------------------------------------------
안녕
안녕
안녕
# 일반 매개변수
def printntimes(value, n):
for i in range(n): # n은 반드시 정수
print(value) # 무슨 값이든 상관 없음
printntimes("안녕", 3)
-----------------------------------------------------
안녕
안녕
안녕
- 가변 매개변수 함수
- 원하는 만큼 매개변수를 받을 수 있는 함수
- 사용시 주의점
- 가변 매개변수 뒤에 매개변수가 올 수 없음
- 가변 매개변수는 하나만 사용 가능
# 가변매개변수 = 입력할 수 있는 값의 개수 제한이 없음
# 일반매개변수 뒤에 와야 함
def printntimes(n, * values):
for i in range(n): # n은 반드시 정수
for j in values:
print(j)
printntimes(3, "안녕", "파이썬", "재밌니")
-----------------------------------------------------
안녕
파이썬
재밌니
안녕
파이썬
재밌니
안녕
파이썬
재밌니
- 기본 매개변수와 가변 매개변수
- 기본 매개변수가 가변 매개변수 앞에 올 때
- 기본 매개변수가 가변 매개변수 뒤에 올 때
- 키워드 매개변수
- 기본 매개변수와 가변 매개변수를 함께 사용하기 위한 방법
- 매개변수 이름을 지정해서 입력하는 매개변수
- 위치가 아닌 키워드(매개변수 이름 직접 입력)로 전달하는 방식으로 사용
- 위치 매개변수 전달 방식 : 매개변수를 순서대로 입력
- 주의할 점
- 위치 매개변수 먼저 입력 후 키워드 매개변수 입력
- 키워드로 모두 사용할 때는 상관없음
# 키워드 매개변수를 사용하면 좋은 점
# 순서 고려하지 않아도 됨
def test(a, b = 3, c = 4):
print(a + b + c)
# 1) 기본 형태로 사용 = 매개변수 순서대로 입력
test(2, 4, 6)
-----------------------------------------------------
12
# 2) 키워드 매개변수로 입력
test(a = 2)
-----------------------------------------------------
9
# 3) 키워드 매개변수 순서를 바꿔 입력
test(b = 4, c = 7, a = 2)
-----------------------------------------------------
13
# 4) 키워드 매개변수 일부만 사용
test(a = 2, c = 7)
-----------------------------------------------------
12
test(2, c = 7)
-----------------------------------------------------
12
- 함수의 결과[반환값, 리턴값]
- 자료 없이 리턴
# 리턴 = 반환값, 리턴값 = 함수 적용 결과
# 1) 자료 없이 리턴
def return_test():
print("A")
return # 여기까지 실행
print("B")
return_test()
-----------------------------------------------------
A
- 자료와 함께 리턴
# 2) 자료와 함께 리턴
def return_test():
return ("B")
return_test()
-----------------------------------------------------
B
# 가장 일반적인 방식
def return_test():
a = 3 + 2
return (a)
return_test()
-----------------------------------------------------
5
- 아무것도 리턴하지 않기
# 3) None 리턴
def return_test():
return
a = return_test()
print(a)
-----------------------------------------------------
None
입력한 값을 모두 더하는 함수
# 일반매개변수
def sum_all(start, end):
output = 0
for i in range(start, end + 1):
output += i
return output
# 일반매개변수로 사용 = 순서대로 입력
sum_all(1, 3)
-----------------------------------------------------
6
# 키워드 매개변수로 사용 = 순서 상관 없음
sum_all(start = 1, end = 3)
-----------------------------------------------------
6
sum_all( end = 3, start = 1)
-----------------------------------------------------
6
# 기본매개변수
# 간격을 추가해서 합계
def sum_all(start = 1, end = 10, step = 2):
output = 0
for i in range(start, end + 1, step):
output += i
return output
sum_all()
-----------------------------------------------------
25
# 일반매개변수로 사용 = 순서대로 입력
sum_all(1, 5, 2)
-----------------------------------------------------
9
# 키워드 매개변수로 사용 = 순서 상관 없음
sum_all(start = 1, end = 5, step = 2)
-----------------------------------------------------
9
sum_all(step = 2, start = 1, end = 5)
-----------------------------------------------------
9
# 키워드 매개변수 일부만 사용
sum_all(start = 1, step = 2)
-----------------------------------------------------
25
- 재귀함수
- 팩토리얼
- 반복문으로 팩토리얼 구하기
# 팩토리얼
# 반복문으로 구현
def factorial(n):
output = 1 # 초기값 설정
for i in range(1, n + 1):
output *= i
return output
print(factorial(1))
print(factorial(2))
print(factorial(3))
-----------------------------------------------------
1
2
6
2. 재귀함수로 팩토리얼 구하기
# 재귀함수로 구현
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
# n = 3
# 3 * factorial(2)
# 3 * 2 * factorial(1)
# 3 * 2 * 1 * factorial(0)
# 3 * 2 * 1 * 1 = 6
print(factorial(1))
print(factorial(2))
print(factorial(3))
-----------------------------------------------------
1
2
6
함수의 활용
- 피보나치 수열
# 피보나치 수열 = 앞의 두 숫자를 합한 것이 다음 숫자
def fibonacci(n):
if n == 1 :
return 1
elif n == 2 :
return 1
else :
return fibonacci(n-1) + fibonacci(n-2)
# n = 3
# f(3) = f(2) + f(1) = 1 + 1 = 2
# n = 4
# f(4) = f(3) + f(2) = 2 + 1 = 3
print(fibonacci(1))
print(fibonacci(2))
print(fibonacci(3))
print(fibonacci(4))
print(fibonacci(5))
-----------------------------------------------------
1
1
2
3
5
print(fibonacci(25)) # 같은 계산 반복하는 문제 발생
-----------------------------------------------------
75025
- 키워드 global
- 파이썬에서는 함수 내부에서 외부에 있는 변수 참조하지 못함
- global을 사용하면 함수 내부에서 외부 변수 참조할 수 있음
# 재귀 함수 사용 횟수 계산
# 함수 밖에 있는 변수 참조하기 위해서 global 키워드가 필요
count = 0
def fibonacci(n):
global count
count += 1
if n == 1 :
return 1
elif n == 2 :
return 1
else :
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(25))
print(count)
-----------------------------------------------------
75025
150049
- UnboundLocalError : 키워드 global 없이 외부 변수 참조하면 발생하는 에러
# global 키워드가 없는 경우
count = 0
def fibonacci(n):
count += 1
if n == 1 :
return 1
elif n == 2 :
return 1
else :
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(25))
print(count)
-----------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-34-b9bbcc4aa2a4> in <cell line: 11>()
9 else :
10 return fibonacci(n-1) + fibonacci(n-2)
---> 11 print(fibonacci(25))
12 print(count)
<ipython-input-34-b9bbcc4aa2a4> in fibonacci(n)
2 count = 0
3 def fibonacci(n):
----> 4 count += 1
5 if n == 1 :
6 return 1
UnboundLocalError: local variable 'count' referenced before assignment
- 메모화
- 같은 값을 반복해서 구하지 않고 저장(메모)
- 새로운 값만 계산할 수 있게 코딩
- 조기 리턴
- 코드 중간에 키워드 return을 사용하는 것
- 과거에는 변수는 앞쪽에 리턴은 뒤쪽에 작성하는 경향이 있었지만, 최근에는 필요할 때 씀
f_dict = {
1: 1,
2: 1
}
#조기리턴
def fibonacci(n): # n은 딕셔너리 키
if n in f_dict:
return f_dict[n] # 존재하는 키의 값을 가져오는 경우 = 계산한 것이 있음
output = fibonacci(n-1) + fibonacci(n-2)
f_dict[n] = output # 존재하지 않는 키의 값을 저장하는 경우 = 계산한 것이 없음
return output
# 조기리턴 사용하지 않는 경우
def fibonacci(n): # n은 딕셔너리 키
if n in f_dict:
return f_dict[n] # 존재하는 키의 값을 가져오는 경우 = 계산한 것이 있음
else:
output = fibonacci(n-1) + fibonacci(n-2)
f_dict[n] = output # 존재하지 않는 키의 값을 저장하는 경우 = 계산한 것이 없음
return output
fibonacci(50)
-----------------------------------------------------
12586269025
- 리스트 평탄화
- 중첩된 리스트를 모두 풀어서 1차원 리스트로 만드는 것
# 2차원 리스트 반복문 2번 사용해서 평탄화
# 실제로 중괄호가 몇 번 나올지 예상할 수 없음
# 재귀함수로 해결 가능
def flat(data):
output = []
for i in data:
if type(i) == list: # 리스트인 경우
output += flat(i) # 리스트가 아닐 때까지 반복
else: # 요소인 경우
output.append(i) # 요소 추가
return output
# [1, 2, 3] => flat([1, 2, 3]) => 리스트 아니므로 요소 추가
# [4, [5, 6]] => flat([1, 2, 3]) => 4는 요소 추가
# [5, 6] => flat([5, 6]) => 5, 6는 요소 추가
# 7 => 리스트 아니므로 요소 추가
# [8, 9] => flat([8, 9]) => 리스트 아니므로 요소 추가
a = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
a
flat(a)
-----------------------------------------------------
[1, 2, 3, 4, 5, 6, 7, 8, 9]
※ 에러
def flat(data):
output = []
for i in data:
if type(i) == list: # 리스트인 경우
output += flat(i) # 리스트가 아닐 때까지 반복
else: # 요소인 경우
output += i # 요소 추가가 아닌 리스트 연결
output.extend(i) # 요소 추가가 아닌 리스트 연결
return output
a = [[1, 2, 3], [4, [5, 6]], 7, [8, 9]]
a
flat(a)
함수 고급
- 튜플
- 리스트와 유사한 자료형
- 요소 변경 불가능
- 리스트는 [ ] 대괄호 <=> 튜플 ( ) 소괄호
- 리스트처럼 +, * 연산자 사용 가능
# 튜플 생성
list_a = [1, 2, 3]
tuple_a = (1, 2, 3)
print(list_a); print(tuple_a)
print(type(list_a)); print(type(tuple(a)))
-----------------------------------------------------
[1, 2, 3]
(1, 2, 3)
<class 'list'>
<class 'tuple'>
print(list_a[0]); print(list_a[1]); print(list_a[2])
print(tuple_a[0]); print(tuple_a[1]); print(tuple_a[2])
-----------------------------------------------------
1
2
3
1
2
3
# 요소 변경
list_a[0] = 10
tuple_a[0] = 10 # 튜플은 요소 변경 불가
# 여러 변수를 한 번에 할당
[a, b] = [1, 2]
(c, d) = (3, 4)
print(a); print(b); print(c); print(d)
print(type(a)); print(type(b)); print(type(c)); print(type(d))
-----------------------------------------------------
1
2
3
4
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
- 람다
- 함수를 간단하고 쉽게 선언하는 방법
# map 함수 = 콜백 함수 적용 결과 값
def sqr(x):
return x ** 2
list_a = [1, 2, 3]
output_map = map(sqr,list_a)
print(output_map)
print(list(output_map))
-----------------------------------------------------
<map object at 0x7f0bd28298d0>
[1, 4, 9]
# filter 함수 = 콜백 함수 적용 결과 중에서 True인 것
def under_3(x):
return x < 3
list_a = [1, 2, 3]
output_filter = filter(under_3,list_a)
print(output_filter)
print(list(output_filter))
-----------------------------------------------------
<filter object at 0x7f0bd282a3e0>
[1, 2]
람다를 이용하기
# 람다로 변경
list_a = [1, 2, 3]
# 콜백 함수 자리에 람다
# 람다 사용법 : lambda 매개변수: 리턴값(기능 결과)
output_map = map(lambda x: x ** 2, list_a)
print(output_map)
print(list(output_map))
-----------------------------------------------------
<map object at 0x7f0bd282ada0>
[1, 4, 9]
list_a = [1, 2, 3]
output_filter = filter(lambda x: x<3, list_a)
print(output_filter)
print(list(output_filter))
-----------------------------------------------------
<filter object at 0x7f0bd2828460>
[1, 2]