인사말

여러분 벌써 목요일이네요

날씨도 갈수록 더 추워지는 거 같아요

감기 조심하시고, 오늘 하루도 파이팅입니다! 🔥

 

저는 오늘은 하루종일 머신러닝 이론 공부할 거예요!

 

오늘의 일정
오전(09:00 ~ 13:00) 09:00~10:00 코드 카타, 팀 오전 회의
10:00~ 12:00 베이직반 수업
12:00~13:00 베이직반 수업 복습 
오후(14:00 ~ 18:00) 14:00~18:00 머신러닝 이론 공부
저녁(19:00 ~ 21:00) 19:00~21:00 머신러닝 이론 공부

요약

  1. 코드 카타
    1. 피자 나눠 먹기(1)
    2. 최댓값 만들기(1)
    3. 배열 두 배 만들기
  2. 베이직반 수업
    1. 딕셔너리
    2. 리스트 컴프리헨션
    3. 함수
      1. 포지션 아규먼트(Positional Argument)
      2. 로직 오류
        1. 로직 오류 해결법
    4. 스코프(scope)
      1. LEGB Rule
  3. 머신러닝 이론 공부

(이건 카테고리를 따로 분류해서 글 작성했습니다!)


오전(09:00 ~ 13:00)

1. 코드 카타 3문제

1.1 피자 나눠 먹기(1)

def solution(n):
    if n % 7 == 0:
        answer = n/7
    elif n % 7 != 0:
        answer = n/7 +1
        
    return int(answer)

 

🤔 문제 풀이방법

  • 피자를 7명에서 나눠 먹을 거예요. 그럼 7의 배수면 되겠죠?
  • if n % 7 == 0: answer = n/7
    • 나머지(%)를 사용해서 7의 배수를 찾아줄게요
    • 7로 나누었을 때 나머지가 0이면 n/7을 하면 되겠죠!
  • elif n % 7 != 0: answer = n/7 +1
    • 만약 7로 나누었을 때 나머지가 0이 아니라면
    • 기존에 있던 피자 수를 7명이서 나누고, 피자 한 판을 더 시켜줄게요(+1)
  • int(answer)
    • 나누기를 해주고 마지막에 int로 형변환 해주면 정수값만 출력됩니다! 문제 해결!

 

1.2. 최댓값 만들기(1)

def solution(numbers):
    numbers.sort(reverse=True)
    
    return numbers[0] * numbers[1]

 

🤔 문제 풀이방법

  • numbers.sort(reverse=True)
    • 내림차 순으로 numbers를 정렬해 줄게요
  • return numbers[0] * numbers[1]
    • 그럼 numbers에 첫 번째 자리와 두 번째 자리가 큰 숫자일 테니, 두 개를 곱해주면 문제 해결!

 

1.3. 배열 두 배 만들기

def solution(numbers):
    answer = []
    
    for a in numbers:
        answer.append(a*2)
        
    return answer

 

🤔 문제 풀이방법

  • answer = []
    • 숫자를 담을 리스트를 만들어줄게요
  • for a in numbers: answer.append(a*2)
    • numbers에 있는 숫자를 a로 받아줄게요
    • a에 하나씩 2를 곱해주고, 먼저 만들어 놓았던 리스트에 추가 (append) 해줄게요

 

(10:00 ~ 12:00)

2. 베이직반 수업

2.1 딕셔너리

함수 설명 예시
.keys() 딕셔너리에 있는 key들만 불러옴 for i in dict.keys()
.values() 딕셔너리에 있는 values들만 불러옴 for i in dict.values()
.items() key, values 모두 불러옴 for i in dict.items()

 

2.2 컴프리헨션

# 일단 리스트 형식 및 코드
numbers = []
for n in range(1, 10+1):
    numbers.append(n)
# 컴프리헨션
[2*n for n in range(1,10+1)]

#[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

 

2.3. 함수

  • 개념
    • 인풋을 넣으면 아웃풋이 나오는 것
    • def {함수명}()
  • 특징
    • 인풋이 없는 함수가 있다 (print(), def my_func())
    • 아웃풋이 없는 함수도 있다
    • 두 번 이상 나오는 코드면 함수를 만들어서 쓰면 좋다

 

2.3.1. 포지션 아규먼트(Positional Argument) : 위치 인자

  • 개념 :함수 호출 시, 전달하는 인자가 함수 정의에서 매개변수의 위치에 따라 매핑되는 방식

def my_func(name, age):
    print(f"이름은 {name}이고 나이는 {age}입니다.")
    
my_func("John", 30)

 

🤔 코드 설명

  • def my_func(name, age):
    • 함수를 하나 만들어주었어요
    • 함수의 위치는 각각 name과 age를 의미하도록 만들었습니다.
  • my_func("John", 30)
    • 그렇기에 함수를 포지션 아규먼트로 해놓으면 자동으로 결괏값이 빨간색 칸처럼 나오게 됩니다.

2.3.2. 로직 오류

def my_func(name, age):
    print(f"이름은 {name}이고 나이는 {age}입니다.")
    
my_func(20, "John")

 

🤔 코드 설명

  • 위치 인자는 오류가 나지 않아요
  • my_func(20, "John")
    • 대신 이렇게 순서를 바꿔서 적는다면 결과는 "이름은 20이고 나이는 John입니다."가 출력됩니다
    • 이 경우를 로직 오류라고 해요

2.3.2.1. 로직 오류 해결법

 

def my_func(name, age):
    print(f"이름은 {name}이고 나이는 {age}입니다.")
    
my_func(age=20, name="John")

 

🤔 코드 설명

  • my_func(age=20, name="John")
    • 로직 오류가 났을 때는 이렇게 "="을 써서 할당해 주면 해결된답니다
    • 결괏값 : "이름은 John이고 나이는 20입니다."

<위치 인자들 경우의 수들>

def my_func(name, age):
    print(f"이름은 {name}이고 나이는 {age}입니다.")
    
my_func("John", 35)
my_func("John", age=35)
my_func(name="John", age=35)
my_func(age=35, name="John")

 

위치 인자를 이런 식으로 적어도 모두 결괏값은 함수대로 출력됩니다!

 

 

2.4. 스코프(scope)

  • 개념 : 코드를 구분하는 공간
    • 코드 내부에 local scope를 생성하고 그 외의 공간으로 global scope로 구분하는 것
      1. global scope : 코드 어디에서든 참조할 수 있는 공간
      2. local scope : 함수가 만든 scope. 함수 내부에서만 참조 가능.
  • scope 예시

 

🤔 코드 설명

오류가 났죠? 왜일까요?

  • 일단 test(10)이라고 위치인자를 주고, print(b)를 했어요
    • 그래서 test 함수는 제대로 10이라고 출력이 되었지만, print(b)는 오류가 뜨네요

  • b에 할당하는 값이 def test(a):라는 함수 안으로 정의 내려져서 그래요
    • def test(a):는 local scope가 되고 print(b)는 global scope이기 때문에 공간이 달라서 값을 불러올 수 없어요
  • 오류 없이 불러오고 싶다면?

 

print(b)와 같은 scope로 이동시켜 주시면 됩니다! 

 

2.4.1. LEGB Rule

  • 개념 : 이름(식별자) 검색 규칙 중 하나임
    1. Local scope : 지역 범위(현재 작업 중인 범위)
    2. Enclosed scope : 지역 범위 한 단계 위 범위
    3. Global scope : 최상단에 위치한 범위
    4. Bulit-in scope : 모든 것을 담고 있는 범위(정의하지 않고 사용할 수 있는 모든 것)
      • 예 : print()

a = 0
b = 1

def enclosed():
    a = 10
    c = 3
    
    def local(c):
        print(a,b,c)
        
    local(300)
    print(a,b,c)
    
enclosed()
print(a,b)

 

🤔 코드 설명

  • 식별자를 찾는 순서는 LEGB 순서대로 간다고 했죠? 그럼 함수 정의 중 local() 함수에 먼저 들어갈게요
    • def local(c):
              print(a, b, c)
      1. (a, b, c)를 출력할 거지만 local이 가지고 있는 식별자가 없어요
      2. 그럼 바로 윗 단계에서 식별자를 찾아볼게요
      3. enclosed()로 가서 보니까 a와 c가 있네요
      4. (10,b,300)으로 정의되었어요 왜 300이냐면 enclosed()에서 local(300)으로 c 값을 정의 내렸어요
      5. b는 더 나가서 global에 있는 b 값을 데려와서 (10,1,300)으로 결정 났어요
    • def enclosed():
          a = 10
          c = 3
          local(300)
          print(a,b,c)
      1. local은 끝났으니 다음 단계인 enclosed() 함수를 읽어볼게요
      2. 여기서도 (a,b,c)를 출력해야 하네요
      3. enclosed()에서 a와 c가 있어요 그럼 바로 (10,b,3)으로 완성이 되었네요
      4. b값은 enclosed()에선 찾을 수 없기에 global로 나가서 찾아 쓸게요
      5. 그렇게 해서 (10,1,3)으로 결정 났습니다.
    • a = 0
      b = 1
      print(a, b)
      1. 마지막 global에서는 print(a, b) 할 거기 때문에 그대로 하시면 (0,1)로 반환될 겁니다 :)

 

여기까지가 12월 19일 목요일 베이직반 수업 내용이었어요

LEGB가 나오면서부터 멘붕이 왔지만, 다시 혼자서 공부해 보니까 이해가 되네요!

이런 사소한 부분까지 챙겨주시고 알려주셔서 감사합니다 ☺️


마무리

베이직반 수업을 들으면서 함수를 더 알아갔고, 더 친해진 기분이었어요

특강을 들으면서 다음에 코드를 짜게 될 때 어떻게 할지 상상도 해봤어요

유용하게 한 번 써보고 싶어요 ㅎㅎ

 

뭐든 기본기가 제일 중요하다고 생각해요!

그래서 오늘도 머신러닝 개념에 대해서 공부했습니다!

 

오늘 하루종일 이론 공부만 했더니 손목이 조금 아프네요 ㅎㅎ

그래도 아픈 만큼 뿌듯했던 오늘이었어요!

 

수고 많으셨습니다, 감기 조심하시고 좋은 밤 보내세요 🤭

감사합니다.

+ Recent posts