취뽀 기록

#열심히 살자 #취업 #공부

기타/[하나로_수업]

5/16

hyunnn_00 2023. 5. 16. 17:08

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
  • 재귀함수
    • 팩토리얼
    1. 반복문으로 팩토리얼 구하기
# 팩토리얼
# 반복문으로 구현
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]

'기타 > [하나로_수업]' 카테고리의 다른 글

5/22  (0) 2023.05.22
5/19  (1) 2023.05.22
5/15  (0) 2023.05.15
5/12  (0) 2023.05.12
5/11  (0) 2023.05.11