우리가 주로 사용하는 컴퓨터 언어에는 반올림 함수가 내장되어 있다.

 

예를 들면 C나 C++의 경우 round()라는 함수가 존재하고, 수학 관련 라이브러리를 사용한다.

 

#include <math.h>  // C언어의 경우

#include <cmath>  // C++의 경우

 

using namespace std // C++의 경우

 

int main(){

 

   int a = round(4.5);

 // a는 5라는 값을 가진다. 

 

   return 0;
}

 

이런 식으로 이미 구현되어있는 반올림 함수가 있다.

 

파이썬도 물론 있다.

 

파이썬의 반올림 내장함수는 round()이다.

 

하지만 여기서 매우 어이가 없는 걸 볼 수가 있는데

 

 

print(round(3.5))
print(round(3.4))
print(round(4.5))

print(round(4.6))

 

이렇게 하면 결과가 

4

3

5

5

 

이렇게 나올 것으로 예상할텐데 실제로는

4

3

4

5

이렇게 나온다.

 

그 이유는

파이썬에서 round 함수로 0.5를 반올림할 때, 정수 부분이 짝수면 반내림이 되고, 홀수면 반올림이 된다.

 

즉 3.5의 경우에는 반올림이 되서 4가 되고

4.5의 경우에는 반내림이 되어서 4가 된 것이다.

 

이 문제를 해결해주기 위해서는

1. 반올림 함수를 새로 구현해주든가,

2. 짝수일 경우 0.1을 더하여 round 함수를 사용하면 된다.

 

물론 round 함수에 인자를 넣으면, 소수점 첫번째가 아닌 다른 부분에서도 반올림할 수 있기 때문에

정수에서 반올림, 소숫점 두번째, 세번째에서 반올림할 때도 이 부분을 생각해주어야한다.

 

사사오입이 정확히 이런 의미는 아니지만, 편하게 외우기 위하여 사사오입이라고 외우면 편하다.

사(4)일 땐 버리고, 오(5)일 땐 올리고,

짝수일땐 버리고, 홀수일땐 올리고라고 생각하면 편하다.

 

 

 

C/C++/JavaScript 같은 C에서 파생된 언어에서는 내가 아는 반올림과 같았는데

파이썬은 이럴 줄은 몰랐다...ㅠㅠ 나중에 round를 사용한 코드에서 원하는 Output이 제대로 안나온다면

이 문제가 아닐까 생각해보는게 좋을 것 같다.

 

 

 

혹시 몰라서 테스트해본 JavaScript

내가 아는 반올림이 맞다..

 

왜 파이썬은..아닐까...하ㅠㅠ 

 

JavaScript

 

반응형

'Coding > Python' 카테고리의 다른 글

Python extend 와 append  (0) 2020.05.16
Python 입력 받기  (0) 2020.05.16

ES6 문법이 확장되면서 화살표 함수라는 것이 생겼다.

 

let a =  () => { } 이런 식으로 쓰는 함수인데, 

 

단순히 표기가 간편해졌다 뿐만 아니라 여러 가지 차이점들이 생겼다.

 

1. this

 

아마 가장 큰 차이가 this의 여부가 아닐까 싶은데, 화살표 함수에서는 this가 바인딩 되지 않는다.

즉 함수 내부에서 this를 생성하지 않으므로, this를 사용할 시 바로 바깥의 함수 또는 클래스의 this를 불러온다.

그래서 함수 안의 함수를 사용할 때, this를 바인딩해주어야하는 경우가 많은데, 화살표 함수는 그 수고를 줄일 수 있다.

 

하지만 이런 점 때문에, 화살표 함수는 함수나 클래스의 메소드를 만들때는 적절하지 않다.

 

 

 

2. arguments

 

일반적인 function에서는 argument라는 문법을 사용할 수 있는데

함수의 인자들을 접근할 수 있습니다.

 

예를 들면 

 

foo(){
    console.log(arguments[0])

}

 

이렇게 함수를 생성하면,

 

foo(1)로 함수를 사용하면, 1이 로그에 찍힙니다.

 

하지만 화살표함수는 이 기능을 지원하지않습니다.

 

하지만 args라는 조금은 다른 문법을 지원합니다.

 

 

 

3. new 사용 불가 ( 생성자로 사용 불가 )

 

말그대로 클래스나 객체의 생성자로 사용 불가하다

그와 동시에 new를 붙혀서 생성할 수 없다.

 

 

 

 

 

이 부분은 좀 더 사용하면서 익혀봐야할 것 같다.

여러 글을 읽으면서 느낀 것은 내가 화살표 함수를 모르는 것보다, 기존 함수를 잘 몰랐다는 생각이 많이 들었다.

반응형

학교를 다니면서 만들어보고 싶었던 것이 정말 많았다.

 

수강 신청 매크로, 컴공과 질의 응답 게시판, 맛집 추천 등등...

 

하지만 너무나 수업도 많이 듣고 공모전, 해커톤, 연구실 활동 등등 여러 활동 때문에 치여서 못하게 되었다...

 

그래서 늦었지만 4학년인 지금이라도 시작해보려한다.

 

먼저 맛집 추천 서비스인 맛집 족보!

 

현재까지는

1.맛집 추천, 2. 맛집 빙고, 2가지만 구현되어 있는데, 

앞으로 추가할 것들은

3. 최고의 맛집 투표

4. MatBTI

5. 결정고민을 심한 사람을 위한 선택지 

 

를 추가해보려한다

 

이번 방학에 다 할 수 있길..

파이팅

 

반응형

사실 구조 분해 자체는 어려운 개념은 아닌데, 구조 분해라는 이름을 모르고 쓰고 있어가지고 이렇게 정리하게 되었다.

 

React에서 많이 사용하는 것 중 하나가

 

const { props에 있는 변수명들~~~ } = props

 

이런 코드다.

 

예시를 설명하자면

 

const player1 =

{ name: "hello",

   id: 3, 

}  

 

const { name, id } = player1

 

이렇게 한다면

nameid에 각각 player1.name, player1.id 의 값이 저장된다.

 

따라서 console.log(name) 을 하면 "hello"가 출력된다.

 

그리고 name 값을 수정해도, player1.name의 값은 수정되지 않는다.

참조 복사가 아니라 값 복사가 이루어지기 때문이다.

 

그리고 재밌는 것은, 이것을 함수에도 활용할 수 있다는 것이다.

 

원래라면 player1의 name 값을 출력하기 위해

 

var printPlayerName = player1 => {

   console.log(player1.name)

}

 

이렇게 해주어야했다면,

 

var printPlayerName = ({ name }) =>  {

   console.log(name)

}

 

 

이렇게 출력이 가능하다.

 

또 이렇게하면 장점이 있는데, 작성자가 사용하는 변수만 코드에 작성하게 되므로,

 

작성자의 의도를 잘 알 수 있다.

 

그리고 이것을 선언적이라고 한다.

 

선언적이 무엇인지에 대해 간단히 설명하자면,

어떻게 보다 ,무엇을 할 것인지에 대해 초점을 맞추는 것이다.

 

이 부분이 궁금하다면 선언적 프로그래밍을 찾아보는 것이 좋을 것 같다.

 

그리고 배열 또한 구조 분해가 가능하다.

 

var [first] = [1, 2, 3]

 

이라면 first에는 1이 담긴다.

 

그리고 리스트 매칭 또한 활용 가능한데,

 

var [ , , third] = [1,2,3]

 

이면 third는 3이 된다.

 

리스트 매칭도 간단히 설명하자면,

배열에서 사용하지 않는 부분, 건들이지 않는 부분은 그냥 비워놓는 것이다.

 

물론 변수를 하나 뿐만 아니라 이렇게 

 

var [ first, second, third] = [1,2,3]

var [ first, , third] = [1,2,3]

 

여러 개도 가능하다.

 

아마 리스트 매칭도 선언적이다 라고 볼 수 있을 것 같다.

 

 

p.s

지금 공부하고 있는 러닝 자바스크립트에 리스트 매칭이라고 되어 있는데,

리스트 매칭이라고 검색하면 자료가 잘 없다...ㅠㅠ

 

이번에 구조 분해를 공부하면서, 선언적 프로그래밍, 리스트 매칭 등 사용하고는 있었지만, 그 이름을 몰랐는데 이름을 알게 되었다.

공부하면서 내가 쓰고 있는 것의 이름을 아는 것이 참 중요한 것 같다.

덕분에 검색하며 더 자세하고 깊게 알게 된 것 같다 ㅎㅎ

반응형

학교에서 Python 실습보조원을 하면서 많은 질문을 받았는데,

 

append 대신 extend를 사용했는데 작동이 제대로 안돼요! 라는 질문을 받았다.

 

나는 extend를 모르기에 바로 구글에 검색을 해보았다.

 

검색한 결과는 이 친구도 append처럼 리스트에 값을 삽입할 수 있지만

 

결론적으로 말하면 extend는 리스트에 원소를 삽입할 수 있다는 면에서는 append와 같지만, 전혀 다른 기능을 하는 함수였다.

 

extend는 오히려 Javascript의 spread operater 같은 느낌?... 요즘 자바스크립트만 계속 공부해서 그런지 보고 나서 이 생각이 들었다.

 

a = "hello"
append_list = []

expend_list = []

 

append_list.append(a)
extend_list.extend(a)

 

print(append_list)
print(extend_list)

 

만약 이렇게 한다면 결과는 어떻게 될까?

 

['hello']
['h', 'e', 'l', 'l', 'o']

 

이렇게 된다. JavaScript를 안다면 알겠지만, spread operater 같은 결과를 나타낸다.

 

설명하자면 잘기잘기 찢어서 그 원소들을 넣어주는 것이다!

"hello"같은 문자열 같은 경우는 한 글자씩 쪼개서 넣어주는 것이다!

그래서 int는 extend가 되지 않는다.

 

그렇다면 list를 넣어준다면?

 

a = ["hello"]
append_list = []

expend_list = []

 

append_list.append(a)
extend_list.extend(a)

 

print(append_list)
print(extend_list)

 

정말 재밌는 결과가 나온다.

 

[['hello']]
['hello']

 

이런 결과가 나온다.

 

처음 보는 사람은 헷갈릴 수 있겠다. 아마 이런 부분 때문에 질문을 한 것이 아닐까.

 

그러니까 append는 ["hello"] 라는 리스트 자체를 리스트에 넣은 것이다.

리스트 안에 리스트를 넣어준 것이다.

따라서 결과물은 이런 [['hello']]라는 2차원 배열이 된거다.

 

하지만 extend는 갈기갈기 찢은 거다.

a라는 리스트를 갈기갈기 찢어서 리스트의 원소인 "hello"만 꺼낸 뒤

extend에 넣어주었기 때문에, ['hello'] 이렇게 된 것이다.

 

그러니까 이해를 쉽게 하기 위해 비교하자면

 

for i in a:

    extend_list.append(i)

 

이거와 

 

extend_list.extend(a)

 

이 두 코드는 동일하다.!

반응형

'Coding > Python' 카테고리의 다른 글

파이썬 반올림 round() 흔히 하는 실수! 사사오입 원칙  (0) 2020.06.12
Python 입력 받기  (0) 2020.05.16

코딩테스트들을 준비하다보니 요즘은 Python으로 풀면 편해지는 문제가 너무 많다.

 

사실 주력 언어가 C++이고, 대학교와서 대부분의 개인 공부와 과제를 C++로 했지만, 눈물을 머금고 코딩 테스트 주력 언어를 바꾸어야할 것 같다. ㅠㅠ

 

사실 그래프를 그리거나 트리를 그리는 문제는 아직 익숙해지지 않아서 그런지 C++이 더 편해보이긴하지만,

 

문자열 관련 문제는 파이썬이 압도적으로 편하다...

그리고 시간 같은 경우도 C++에 비해 파이썬이 느려서 파이썬 시간 제한을 좀 더 여유롭게 주는 것 같다?

뭔가 C++은 시간을 빡빡하게 주는 느낌.. 파이썬은 넉넉하게 주고..

 

그래서 코딩테스트 준비를 위한 파이썬 기본 문법 정리를 해보려 한다.

 

코테를 여유롭게 푸는 그날까지.....ㅠ

 

 

입력은 파이썬에서는 input() 이라는 함수로 받는다.

 

입력이 너무 많으면 시간이 오래걸려서 sys.stdin.readline()이나 sys.stdin을 쓰기도 하지만, 

기본적으로는 input()이라는 함수를 쓴다.

 

n = input() 이렇게하면 입력된 문자열은 n에 담긴다.

 

n은 문자열이므로, 숫자와 같은 다른 형태로 사용하려면 형변환을 해주어야하는데

 

입력 받을 때부터 int로 받으려면 n = int(input)  이렇게 받아주면 된다.

 

그리고 만약 띄어쓰기 한 값들을 받고 싶다!

 

1 2 3 4 이 값들을 하나하나 리스트에 담고 싶다면

 

num_list = input().split() 하면 된다.

 

split(끊을 부분) 을 입력하면 다르게도 받을 수 있긴하다.

 

num_list = ['1', '2', '3', '4'] 이렇게 저장되므로, 숫자로 사용할거면 형변환을 해주어야한다.

 

아쉽게도 num_list = int(input().split())

이렇게는 불가능하다 ㅎㅎ

 

 

 

반응형

'Coding > Python' 카테고리의 다른 글

파이썬 반올림 round() 흔히 하는 실수! 사사오입 원칙  (0) 2020.06.12
Python extend 와 append  (0) 2020.05.16

* 간단 정리

 

State와 Event가 있다.

 

Event가 실행될 때 State의 값을 만지려면, 직접 건드리지 못하므로

 

Action을 만들고, 그것들 Dispatch(실행)해야한다.

 

Action을 어떻게 처리할지는 Reducer에서 관리를 한다.

 

State를 어떻게 바꿀지는 reducer에 기록한다.

 

---------------------------------------------------------------------------

 

사실 이 부분은 어떤 것인지 잘 몰라서 공부를 해보고 좀 더 익숙해져야하는데,

 

써보다가 setState와 비슷한 것 같아서 찾아보니 비슷한 역할을 하는 것이 맞다.

 

하지만 reduce는 Vuex ( 아직 redux를 안써봐서... ) 처럼 좀 더 중간에서 관리한다는 느낌이고,

 

setState는 단순 변수나 배열 같은 걸 관리하기 좋다면

 

reduce는 object를 관리하기 좋다고 한다.

 

많이 써봐서 손에 익혀봐야겠다.

반응형

hook을 사용했을 경우를 가정했다.

 

 

1.  npm install react-ga --save 으로 react-ga를 React 프로젝트에 설치한다.

 

2. 체크하고자하는 페이지에

 

import ReactGA from "react-ga"

 

 

export default function Home() {

 

useEffect(() => {

getGA();

}, []);

 

const getGA = () => {

console.log("페이지 들어옴");

const pathName = window.location.pathname;

ReactGA.initialize("UA-로 시작하는 값");

ReactGA.set({ page: pathName });

ReactGA.pageview(pathName);

};

 

return <wrapper/>;

 

}

 

이런 식으로 해주면 된다.

 

useEffect 안에 이렇게 함수화시켜서 넣어주지 않으면,

주소를 받기 전에 window.location.pathname를 찾는 경우가 생겨 오류가 발생했다.

window가 존재하지 않는다고 ㅠ

 

사실 hook을 사용할 때 이 오류 알려주는 글이 없어서 작성해보았다.

 

 

만약 이래도 안된다면 

import Router from "next/router";

를 추가해보아라...

반응형

+ Recent posts