나는 파이썬을 정말로 간단하게만 배웠었다
대학교 (1학년 전공같은 전공아닌 전공?) 그 마저도 GUI를 이용한 간단한 수업이었는데,
그 떄 이후로 거의 벽을 쌓고 살았고, 그나마 공모전? 준비하면서 파이썬을 잠시 써본 것 같다.
그래서일까 파이썬에 대한 지식이 많이 부족했는데,
오늘 파이썬 문법 기초를 수강하며 새로 얻게 된 지식을 글로써 남기고자 한다.
(변수나 뭐 이런 완전 기초적인 내용은 제외하고 내가 잘못 알고 있었던 혹은 새로 알게 된 지식에 대해서만 정리)
1. 파이썬은 흔히 우리가 사용하는 변수의 자료형을 명시하지 않는다
(명시를 하지 않아도 알아서 잡아주는게 편리하긴 했다.) 근데 어째서?
보통 파이썬처럼 변수의 자료형을 명시하지 않는 언어를 '동적 타입 언어'라고 한다
(그럼 자연스레 정적 타입 언어도 있겠네?라는 생각이 먼저 들었다. 바로 정리 ㄱㄱ)
동적 타입 언어 vs 정적 타입 언어
정적 타입 언어는 '타입' = '자료형'을 컴파일 시 결정하는 것으로, 우리가 자주 사용하는 C나 Java와 같이 변수를 선언할 때, 형에 따라 자료형을 지정해주는 언어를 말한다. 이 때 자료형에 맞지 않게 값을 할당하면 컴파일 에러가 발생하는 점.
그래서 컴파일 시에만 타입에 대한 정보를 결정해서 속도가 Fast
타입 에러로 발생하는 문제점을 초기에 발견할 수 있어 타입의 안정성 Good
(어 그럼 컴파일이 뭔데??... 5252 진정하라구 너굴맨..)
(컴파일은 각종 언어로 작성된 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스)라는 정도로만 우선 알고있자.
동적 타입 언어는 정적 타입 언어와 반대로 자료형을 컴파일 시 정하는 것이 아니고 실행 시(런타임) 결정하는 것인데, 대표적으로 Python과 JavaScript, Ruby 등이 있다.
그래서 코드에 대한 유연성과 효율성이 Good
런타임 시 예상치 못한 Error 발생 가능성
한줄 요약 : 정적 타입? 컴파일 시 타입 체크, 동적 타입? 런타임 시 타입 체크
이러한 이유로 파이썬은 동적 타입 언어에 해당하기에 자료형을 명시하지 않는다는 점
2. 파이썬 제곱의 표현
가끔 알고리즘이나 수학적 문제를 풀다보면 제곱을 사용해야 할 때가 온다.
(다른 언어들에서 제곱을 어떻게 표현했는지 잘 기억이 안나는데 쩄든..)
파이썬에선 제곱을 표현할 떄 **을 사용한다는 점(이 **는 기본 연산자)
대개 파이썬과 java 등 다양한 언어에서 지원하는 라이브러리 중 Math 라이브러리가 있다. (Math.pow(밑, 지수))
이 라이브러리 속에 pow라는 함수가 있는데, 이 함수를 주로 사용하고 이 함수 역시 제곱을 표현할 때 사용한다는 점이다.
또한 sqrt(n)의 형태로도 제곱근을 바로 구할 수 있으며, 이에 대한 결과는 실수 자료형이다.
그리고 마지막으로 파이썬에서 np (넘파이) 라이브러리에서도 함수를 이용해 제곱근을 구할 수 있다.
np.sqrt와 math.sqrt의 차이는를 간단하게 설명하면 np의 sqrt는 배열 단위 계산이 가능하며 dtype을 complex 조건으로 주게 된다면 복소수 결과를 얻을 수 있다. (math.sqrt는 복소수 지원 x, 또한 정수끼리의 연산이라도 결과는 항상 실수 형태)
(동작은 거의 비슷해서 자바 것을 참고함)
https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html
3. 파이썬 에서의 따옴표
파이썬 따옴표의 차이 (""), ('')
둘은 모두 문자열을 표시한다는 것, 보통 ''는 문법적 의미를 가지는 단위의 경우에 사용, ""는 크게 의미를 가지지 않을 때 사용 (큰 차이 x)
4. What is enumerate()?
일반적으로 우리가 인덱스(index)와 배열과 같은 리스트?의 원소에 동시에 접근하려고 한다면 보통 루프를 돌려서 인덱스와 원소를 매핑?해서 출력하는게 일반적이었다면, 파이썬에선 enumerate()라는 함수를 사용한다.
예를들어
for i in list_a:
반복 구문
이러한 반복문에서 우리가 인덱스와 컬렉션의 요소를 확인하기 위해선 인덱스 번호에 대한 변수도 선언해야하고, 이 변수를 반복문 속에서 출력하며 인덱스와 요소를 확인했어야 했다.
이러한 작업을 안하기 위해선 enumerate() 라는 함수를 사용하는데, 아주 간단하다 (이 함수는 데이터를 튜플형태로 반환)
for i in enumerate(list_a):
출력문
이런 방식으로 작성해주면 인덱스와 요소 값을 한 눈에 확인할 수 있다는 장점이 있다.
(참고)
https://www.daleseo.com/python-enumerate/
5. Python에는 왜 switch case가 없을까?
(공식문서)
https://docs.python.org/3/faq/design.html#why-isn-t-there-a-switch-or-case-statement-in-python
강의를 듣다 간단한 예제에서 내준 퀴즈 문제를 풀 때 발생했는데, 문제를 읽고 해답을 찾기 위해 자연스럽게 switch 문이 떠올랐고, switch 문을 이용해서 해결해야겠다고 생각했으나 현실은 녹록치 않았다.
우선 결론부터 말하면 Python에는 switch case가 없다! (왜요?)
공식 문서에서도 그냥 if elif를 사용해서 작업을 수행하라고 한다. if - elif문이 가독성이 좋고 switch문의 역할을 해낼 수 있어서, 혹은 사전(dictonary)라는 자료형을 사용해서 switch 문을 흉내내거나 더욱 간결하게 사용할 수 있기 때문이다.
그래서 파이썬의 입장에서는 굳이? (간단 명료함을 추구하는 파이썬의 본질..)
6. Python - Set (집합)
직접 파이썬을 딥하게 공부해본적이 없지만, 정처기를 공부하면서 set에 대한 정보를 습득한 적이 있다. set은 수학에서 말하는 것처럼 집합과 비슷한데, 순서가 없고, 집합 안에서는 unique한 값을 가지고 mutable한 객체이다. (수정가능한 객체)
그리고 자동으로 중복이 제거된다.
7. Python - f string
f - string은 파이썬 버전 3.6부터 사용가능한 기능으로 문자열 포매팅의 한 종류.( 이 방법 외에도 %, str.format 방법이 있음)
매우 직관적이다.
# print(f'{num} 은 {result}입니다')
8. Python - map
이미 map은 자료 구조 영역에서 다양하게 쓰이고 있다. 파이썬 역시 다른 언어들의 map과 비슷하다.
기본적으로 map은 map(function, iterable)과 같은 형태를 가진다.
(function = 함수, iterable = 반복 가능한 자료형)
map은 요소에 특정한 함수를 적용시킬 때 쓰는 함수.
map 함수는 반환 값이 map 객체라서 자료형을 list나 tuple로 형 변환을 해주어야 하며, 두번째 인자로 넘어온 데이터가 담고 있는 모든 데이터에 변환 함수를 적용해줘야 한다.
<참고>
https://codinglevelup.tistory.com/83
https://dojang.io/mod/page/view.php?id=2286
'TIL(Today I Learned)' 카테고리의 다른 글
Day.9 자료구조 그리고 알고리즘 언어의 선택(Linked List) (1) | 2022.11.10 |
---|---|
Day.8 Basic algorithm langu- python (0) | 2022.11.09 |
Day.6 돌 다리도 두들겨보고 건너라(Java) (0) | 2022.11.07 |
Day.5 MiNiProject의 엔딩.. - "Team 봄바람"의 마지막 회고- (1) | 2022.11.04 |
Day.4 미니 프로젝트 최종화.... 오류의 해결과 예외처리? 그리고 궁금증 해소 (0) | 2022.11.03 |