알고리즘 문제풀이 - 페어프로그래밍
👇 문제 👇
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
1차 풀이
def solution(x):
# 하샤드수 판별!
# X가 양의정수! 각 자리수를 더해야한다 → 반복! 반복문! for 사용!
# 자릿수별로 뽑아내야하니, 숫자형을 문자열로 변경 후 뽑아내자!
str_x = str(x)
y=0
for i in str_x:
y += int(i)
# 기존 x가 합한 수 y로 나누어 떨어지는지 판별
if x % y == 0:
answer = True
return answer
2차 풀이 - 배운 거 복습 겸
마침 테스트할 입력값도 여러개겠다, 선발대 특강에서 어제 배운 코루틴도 한번 적용해보기로 했다. 실습하는 느낌...
그렇게 되니까 코드가 길어져서 리팩토링도 함께 진행
# 리팩토링 - 코루틴적용 + 리스트컴프리헨션 + 삼항연산자
def solution():
while True:
x = yield
# 리스트컴프리헨션
y = sum([int(x_) for x_ in str(x)]) # list각 원소의 합!
y = sum(int(x_) for x_ in str(x)) # []가 없어도 작동하는 이유?
answer = True if x % y == 0 else False #삼항연산자
print(answer)
#코루틴 객체 생성
coco = solution()
#객체 실행 준비
next(coco)
#값 줘
coco.send(10)
coco.send(11)
coco.send(12)
coco.send(13)
coco.send(14)
coco.send(15)
최종 답안
# 리팩토링코드 - 리스트컴프리헨션 + 삼항연산자 + 변수 직관적으로 변경
def solution(x):
# 리스트컴프리헨션
sum_x = sum(int(x_) for x_ in str(x)) # []가 없어도 작동하는 이유?
answer = True if x % sum_x == 0 else False #삼항연산자
return answer
sum_x도 그냥 대입해서 한 줄로 만들어버릴까 하다가, 그러면 너무 한 줄로 길어지는 코드라
의미도 없고 오히려 지저분해 보여서 패스
놓친 것 or 새로 알게된 것
True, False return
근데 제출하고 보니까 이런 코드가 있다.
def solution(n):
return n%sum(int(x) for x in str(n)) == 0
True, False 를 판별할 때는 return에 판별할 구문을 넣으면 알아서 True,False 로 반환된다는 점
👉 if문을 쓸 필요가 없었다...!
제너레이터 표현식(generator expression)
전에 리스트컴프리헨션을 사용할 때 []로 감싸주지 않아 에러가 발생했던 이슈가 있었다.
이번에도 혹시 싶어서 빼봤는데, 잘 작동한다. 당황함
알고보니 이런 경우는 리스트를 만들기 위해 쓴 게 아니라 함수 안에 넣고 그 결과값을 반환하기 때문이라고 한다. 리스트를 명시할 때는 []로 감싸주지 않으면 안 된다.
정리하면,
👉 sum() 함수는 원래 iterable 한 객체를 받아 넣고 실행하는 함수
👉 그런데 인자로 리스트컴프리헨션을 사용하면 굳이 반복가능한 객체가 생성되지 않아도 결과를 받을 수 있다.
👉 제너레이터 표현식(generator expression)이라고 한다.
여기서는 int(x_) for x_ in str(x)
가 제너레이터 객체가 되며, 이럴 때는 감싸주지 않아도 된다는 것!
파이썬 장고 실무 심화 2주차 : DRF 튜토리얼
프로젝트 세팅
원래처럼 싹 다 하고 레포지토리까지 연결
+ 'rest_framework' 를 INSTALLED_APPS에 추가
@api_view(['GET'])
def index(request):
articles = Article.objects.all()
print(articles)
articles = articles[0]
article_data = {
"title" : articles.title,
"content" : articles.content,
"created_at" :articles.created_at,
"updated_at" : articles.updated_at
}
return Response(article_data)
이게 원래 하던 방법인데
좀 귀찮음
그래서 쓰는 게 drf
-->시리얼라이저
GitHub 댓글