22.09.23(금) Today I Learned

정형빈·2022년 9월 27일
0

TIL

목록 보기
17/71

9/23 오늘의 시간표

09:00 ~ 10:00 [원격] 파이썬 장고 실무 기초
10:00 ~ 11:00 [원격] 파이썬 장고 실무 기초
11:00 ~ 12:00 [원격] 파이썬 장고 실무 기초
12:00 ~ 13:00 [원격] 파이썬 장고 실무 기초
13:00 ~ 14:00 점심식사
14:00 ~ 15:00 [원격] 파이썬 장고 실무 기초
15:00 ~ 16:00 [원격] 파이썬 장고 실무 기초
16:00 ~ 17:00 [원격] 파이썬 장고 실무 기초
17:00 ~ 18:00 [테스트] 타임어택 구현 테스트
18:00 ~ 19:00 저녁식사
19:00 ~ 20:00 [원격] 파이썬 장고 실무 기초
20:00 ~ 21:00 [원격] 파이썬 장고 실무 기초

오늘도 어제와 같이 장고 원격 강의를 들으면서 보내는 날인데 중간에 타임어택 테스트가 있는 날이다.

장고 원격 강의

오늘은 장고 강의 2주차 강의를 수강했다. 2주차에서 배운 내용들을 요약하자면

  • 장고에서 사용하는 여러가지 명령어
    • django-admin startapp @ -> 프로젝트의 '앱'을 만드는 명령어
    • python @.py makemigrations -> 데이터베이스 변경을 알려주는 명령어
    • python @.py migrate -> 변경 된 데이터베이스를 적용시켜주는 명령어
  • 장고 admin 화면을 띄우고 그 화면에 생성한 데이터베이스 모델을 추가했다.
  • ORM
    • ORM (Object Relational Mapping) 은 데이터베이스를 하나의 '객체(Object)' 덩어리로 보고, 데이터베이스를 SQL언어가 아닌 클래스로 쉽게 표현 및 사용 할 수 있게 해 준다.
  • admin에 나의 데이터베이스 모델을 추가
  • POST, GET을 분리해서 view.py안에 넣어 기능하도록 작성

이정도가 되겠다.
좀 더 많은 내용을 작성하고 싶었지만 강의의 주된 내용이 이론적인 부분은 적고 실제 회원가입&로그인 사이트를 만드는 과정을 보고 따라하는 것이 대부분이었기 때문에 내용요약은 이정도로 마쳐두고 사이트를 만든 경험만 내 머리속에 남겨두도록 하겠다.

타임어택 구현 테스트

지금까지 해본 적 없는 새로운 프로그램이다. 내용은 특별한 것은 없고 튜터님이 주신 문제를 시간안에 풀어서 제출하면 된다. 문제의 난이도도 지금까지 배운 파이썬 범위 내에서 나오기 때문에 크게 어렵지는 않았지만 시간의 제약이 있다보니 쉽게 되지는 않았다.

1. 전역변수와 지역변수 구분하기

아래 코드에서 a, b 변수가 지역변수인지 / 전역변수인지 구분하고, 코드 실행 없이 결과를 예상해서 적어주세요

a = 10

def test1():
    b = 20

def test2():
    print(a)
    print(b)

test1()
test2()
# 실행이 잘 될까요?
# 실행이 되지 않는다면 어떤 에러가 발생할까요?

A. a는 코드 전체에 적용되는 전역변수이고 b는 test1함수 내에서만 적용되는 지역변수이기 때문에 test2 함수에서 출력할 b의 값이 지정되지 않기 때문에 코드실행에 오류가 발생한다.

2. mutable과 immutable 구분하기

mutable에 해당하는 자료형과 immutable에 해당하는 자료형을 적어주세요

A.

mutable
 - list
 - dictionary

immutable
 - int
 - float
 - str
 - tuple

3. filter/map 혹은 리스트 축약식 활용해서 리스트 다뤄보기

아래 문제를 filter와 map 함수 혹은 리스트 축약식을 활용해 풀어주세요

  1. 1부터 10000까지의 숫자를 numbers 변수에 할당해주세요
  2. 1부터 10000까지 숫자 중, 짝수에 해당하는 숫자만 even_numbers 변수에 할당해주세요
  3. 1부터 10000까지의 숫자 중, 3의 배수이며 15의 배수가 아닌 숫자에 10을 곱하여 some_numbers 에 할당해주세요
def get_even_numbers(numbers):
    result = []
    # some code
    return result

def get_some_numbers(numbers):
    result = []
    # some code
    return result

def main():
    numbers = [] # 1 ~ 10000
    even_numbers = get_even_numbers(numbers)
    some_numbers = get_some_numbers(numbers)
    print(even_numbers) # [2, 4, 6, ...]
    print(some_numbers) # [30, 60, 90, 120, 180, ...]
    
main()

A.

  1. 1부터 10000까지의 숫자를 'numbers'에 할당하려면 방법은 크게 네 가지가 있다.
    첫째, 'numbers'안에 1부터 10000까지 숫자를 하나하나 입력해 넣는 방법
    둘째, for문을 사용해 비어있는 리스트에 append하는 방법
    셋째, list함수와 range함수를 사용하는방법
    넷째, 리스트 축약식을 사용하는 방법

첫번째 방법은 시간이 너무 오래걸리므로 제외하고 두번째 세번째 방법을 사용하는 선택지가 있다.

    # case 2
    numbers = [] # 1 ~ 10000
    for i in range(1, 10001):
        numbers.append(i)

    # case 3
    numbers = list(range(1, 10001))

    # case 4
    numbers = [x for x in range(1, 101)]

나는 여기서 3번째 방법을 사용하여 문제를 풀었다.

  1. 여기서도 결과를 내는 방법이 2가지 있다. 똑같이 리스트 축약식을 사용하는 방법과 lambda함수를 사용하는 방법이다.
    # case 1
    result = [x for x in numbers if x%2 == 0]
    
    # case 2
    result = list(filter(lambda x: x%2 == 0, numbers))
    return result
  1. 이것 또한 마찬가지로 lambda 함수를 활용하는 방법과 리스트 축약식을 사용하는 방법으로 나누어진다.
    # 3의 배수이자 15의 배수가 아닌 숫자 골라내기
    # 결과물에 10 곱해주기
    # case 1
    result = list(filter(lambda x: x%3 == 0 and x%15 != 0, numbers))
    result = list(map(lambda x: x*10, result))

    # case 2
    result = [x*10 for x in numbers if x%3 == 0 and x%15 != 0]
    
    return result

이렇게 해서 최종적으로 나온 답안이다.

def get_even_numbers(numbers):
    result = list(filter(lambda x: x%2 == 0, numbers))
    return result

def get_some_numbers(numbers):
    result = list(filter(lambda x: x%3 == 0 and x%15 !=0, numbers))
    result = list(map(lambda x: x*10, result))
    return result

def main():
    numbers = list(map(int, range(1, 10001))) # 1 ~ 10000
    even_numbers = get_even_numbers(numbers)
    some_numbers = get_some_numbers(numbers)
    print(even_numbers) # [2, 4, 6, ...]
    print(some_numbers) # [30, 60, 90, 120, 180, ...]
    
main()

4. lambda를 활용해서 정렬해보기

아래 사용자들을 수학, 과학, 영어, 사회 점수의 총 합을 기준으로 총 합이 가장 높은 사람이 첫 번째에 오도록 정렬해주세요

from pprint import pprint

users = [
    {"name": "Ronald", "age": 30, "math_score": 93, "science_score": 65, "english_score": 93, "social_score": 92},
    {"name": "Amelia", "age": 24, "math_score": 88, "science_score": 52, "english_score": 78, "social_score": 91},
    {"name": "Nathaniel", "age": 28, "math_score": 48, "science_score": 40, "english_score": 49, "social_score": 91},
    {"name": "Sally", "age": 29, "math_score": 100, "science_score": 69, "english_score": 67, "social_score": 82},
    {"name": "Alexander", "age": 30, "math_score": 69, "science_score": 52, "english_score": 98, "social_score": 44},
    {"name": "Madge", "age": 22, "math_score": 52, "science_score": 63, "english_score": 54, "social_score": 47},
    {"name": "Trevor", "age": 23, "math_score": 89, "science_score": 88, "english_score": 69, "social_score": 93},
    {"name": "Andre", "age": 23, "math_score": 50, "science_score": 56, "english_score": 99, "social_score": 54},
    {"name": "Rodney", "age": 16, "math_score": 66, "science_score": 55, "english_score": 58, "social_score": 43},
    {"name": "Raymond", "age": 26, "math_score": 49, "science_score": 55, "english_score": 95, "social_score": 82},
    {"name": "Scott", "age": 15, "math_score": 85, "science_score": 92, "english_score": 56, "social_score": 85},
    {"name": "Jeanette", "age": 28, "math_score": 48, "science_score": 65, "english_score": 77, "social_score": 94},
    {"name": "Sallie", "age": 25, "math_score": 42, "science_score": 72, "english_score": 95, "social_score": 44},
    {"name": "Richard", "age": 21, "math_score": 71, "science_score": 95, "english_score": 61, "social_score": 59},
    {"name": "Callie", "age": 15, "math_score": 98, "science_score": 50, "english_score": 100, "social_score": 74},
]

# some code

pprint(users, width=300, sort_dicts=False)
"""
[{'name': 'Ronald', 'age': 30, 'math_score': 93, 'science_score': 65, 'english_score': 93, 'social_score': 92},
 {'name': 'Trevor', 'age': 23, 'math_score': 89, 'science_score': 88, 'english_score': 69, 'social_score': 93},
 {'name': 'Callie', 'age': 15, 'math_score': 98, 'science_score': 50, 'english_score': 100, 'social_score': 74},
 {'name': 'Sally', 'age': 29, 'math_score': 100, 'science_score': 69, 'english_score': 67, 'social_score': 82},
 {'name': 'Scott', 'age': 15, 'math_score': 85, 'science_score': 92, 'english_score': 56, 'social_score': 85},
 {'name': 'Amelia', 'age': 24, 'math_score': 88, 'science_score': 52, 'english_score': 78, 'social_score': 91},
 {'name': 'Richard', 'age': 21, 'math_score': 71, 'science_score': 95, 'english_score': 61, 'social_score': 59},
 {'name': 'Jeanette', 'age': 28, 'math_score': 48, 'science_score': 65, 'english_score': 77, 'social_score': 94},
 {'name': 'Raymond', 'age': 26, 'math_score': 49, 'science_score': 55, 'english_score': 95, 'social_score': 82},
 {'name': 'Alexander', 'age': 30, 'math_score': 69, 'science_score': 52, 'english_score': 98, 'social_score': 44},
 {'name': 'Andre', 'age': 23, 'math_score': 50, 'science_score': 56, 'english_score': 99, 'social_score': 54},
 {'name': 'Sallie', 'age': 25, 'math_score': 42, 'science_score': 72, 'english_score': 95, 'social_score': 44},
 {'name': 'Nathaniel', 'age': 28, 'math_score': 48, 'science_score': 40, 'english_score': 49, 'social_score': 91},
 {'name': 'Rodney', 'age': 16, 'math_score': 66, 'science_score': 55, 'english_score': 58, 'social_score': 43},
 {'name': 'Madge', 'age': 22, 'math_score': 52, 'science_score': 63, 'english_score': 54, 'social_score': 47}]
"""

A.

users.sort(key=lambda x: sum([x["math_score"], x["science_score"], x["english_score"], x["social_score"]]), reverse=True)

람다함수를 사용해 dictionary의 키 값만 계산해서 조건에 맞게 정렬한 방법이다.

이렇게 4문제를 풀어봤는데 사실 나는 시간안에 다 풀지 못했다. 시간이 더 있었다면 풀 수는 있었겠지만 직접 코드를 입력해보며 실행이 되는지 안되는지 확인해가며 풀려고하니 생각보다 시간이 너무 많이 걸렸다.

오늘 하루를 마치며

새롭게 시작한 장고도 쉽지는 않았지만 타임어택 구현 테스트가 생각보다 힘들었다. 난이도가 어려운 것은 결코 아니지만 아직 코드를 짜는게 미숙한 것이 느껴지는 것이 마치 요리에 들어가는 재료는 아는데 요리법은 모르는 요리초보의 모습 같다는 생각이 들고 있다. 이럴때 요리하는 법은 레시피를 찾아보거나 요리를 할 줄 아는 사람에게 조언을 받거나 직접 시행착오를 겪으며 깨닫는 방법이 있는데 여기서 요리를 코딩에 적용한다면 정확히 내 상황이 된다. 결론은 구글링을 해보면서 최대한 직접 해보고 안되면 튜터님께 질문을 해서 푸는 것밖에 없다는 것이다.

profile
스파르타 내일배움캠프 3기 수강생 정형빈

0개의 댓글