목록Dev/Python (14)
에르노트
좌표를 계산해야 할 때 (1,1)이라고 주어지면 깔끔하다. 그냥 그대로 사용하면 된다. x축으로 한칸 이동했을 때 (2,1)이다. 하지만 (A,1)이라고 주어질 수도 있다. 그러면 x축으로 한칸 이동했을 때 (B,1)로 옮겨주어야 한다. [A,B,C...] 형태로 좌표 배열을 만들어두고 인덱스를 옮겨다닐 수도 있겠지만 비효율적이고 또 불편하다. 그래서 (A, 1)이라고 입력이 들어오더라도 (1,1)로 변환할 수 있다면 문제가 좀 더 쉬워진다. 다행히 파이썬에서는 내장 함수 ord()를 이용하여 간단하게 문자를 유니코드 정수로 변환할 수 있다. ord('A') == 65 ord('B') == 66 ord('C') == 67 반대로 내장 함수 chr()를 이용하여 유니코드 정수를 받아서 문자를 반환할 수도 ..
알면 알수록, 그리고 쓰면 쓸수록 파이썬은 참 잘 만들어진 언어라는 생각이 든다. 코틀린이나 모던 자바스크립트 같은 최신 언어들도 다뤄봤지만 역시 파이썬이 가장 직관적이고 편한 것 같다. 아무튼 파이썬에는 다소 독특한 리스트 초기화 방법이 있다. 바로 리스트 컴프리헨션(List Comprehension)이다. 파이썬에서는 대괄호([]) 안에 조건문과 반복문을 사용해서 표현된 식으로 리스트를 초기화 할 수 있고, 이를 리스트 컴프리헨션이라 한다. 그럼 왜 이걸 리스트 컴프리헨션이라고 부를까? 영단어 'Comprehension'에는 '이해, 포용, 포괄'이라는 뜻이 있다. 즉, 대괄호 안에 어떤 수식을 적더라도 리스트로 감싸안아 준다는 뜻으로 이해하면 편하다. 따라서 리스트 컴프리헨션의 결과(반환값은)는 항..
개인적으로 그닥 좋아하지는 않지만, 재귀함수는 코딩을 하다보면 언젠가는 사용해야 할 필수불가결한 로직 형태의 하나이다. 그런데 간결함을 추구하는 파이썬의 철학 때문인지 기본으로 설정된 재귀 깊이(1000)가 너무 얕다. 그래서 코딩테스트 등에서 재귀 함수 관련된 문제를 풀 때는 로직을 제대로 설계했어도 테스트케이스를 통과하지 못할 수도 있다. 그럴 때는 간단히 setrecursionlimit() 함수를 이용하여 문제를 해결할 수 있다. setrecursionlimit()은 표준모듈 sys에 들어있으므로 미리 import해서 사용한다. import sys sys.setrecursionlimit(10**6) 이러면 백만 번까지 재귀를 돌릴 수 있게 된다. 컴퓨터 성능이 따라주는 선에서 얼마든지 Recursi..
c++ 또는 자바에 'this'라는 키워드가 있다면 파이썬에는 'self'라는 키워드가 있다. 그 뜻은 쉽게 유추가능한대로 '클래스의 인스턴스 자기 자신'이라는 뜻이다. 양쪽 다 실전에서 상당히 빈번하게 사용되는 키워드임은 분명하다. 그런데 c++이나 자바에서는 적어도 this 키워드의 사용을 강제하지는 않는다. 하지만 재밌게도 파이썬에서는 메소드를 정의할 때 self의 사용을 강제하는 것처럼 보인다. class A: def say_a(): print('a') a = A() a.say_a() 위의 코드는 다음과 같은 에러 메세지를 남긴다. TypeError: say_a() takes 0 positional arguments but 1 was given 위 에러 문구는 파이썬에서 클래스를 다루다보면 굉장히..
파이썬 논리 연산자를 사용해보면 파이썬의 철학을 느낄 수 있다. 난해한 것보단느 복잡한 것이, 복잡한 것보다는 단순한 것이 더 낫다. 그리고 사소한 부분일지라도 가독성은 정말로 중요하다. 그런 취지에서인지 파이썬은 &&, ||, ! 등의 기호를 완전히 배제하고 영단어 그대로를 연산자로 사용하고 있다. AND 연산자 print(True and True) #True print(True and False) #Fasle print(False and False) #Fasle and 연산자는 피연산자 모두가 True 일때만 True를 반환한다. 다시 말해 피연산자 하나라도 False이면 False를 반환한다. OR 연산자 print(True or True) #True print(True or False) #True..
파이썬에서는 C관련 언어들에서 흔히 보이는 'try~ catch~' 대신에 'try: except:' 형태로 예외를 처리한다. 우선 파이썬에서 흔히 볼 수 있는 예외(에러) 상황들을 정리해보자. 1. Value Error list = [1.0, 2.0, ''] for i in list: print(float(i)) 문자열을 float() 함수의 인자로 넣으면 당연히 float 타입으로 변환할 수 없으므로 ValueError가 발생한다. 2. Zero Division Error a = 1 b = 0 c = a/b 가끔 정신없이 코드를 짜다보면 종종 발생하는 에러.. 3. Index Error list = [1, 2, 3] print(list[3]) 실제로 존재하지 않는 인덱스에 대해서 접근하려 할 때 발생..
PIP는 파이썬의 패키지 관리자이다. 우분투의 apt-get과 비슷한 느낌으로 무언가 다운로드받고 싶은 패키지(라이브러리)가 있을 때 사용할 수 있는 명령어이다. 그런데 pip 명령어를 입력했을 때 아래와 같이 'Fatal error in launcher:'라는 에러가 뜨는 경우가 있다. 이는 파이썬 버전과 pip 버전이 안맞아서 나타나는 에러이며, 다음 명령어를 통해 pip를 업데이트함으로써 간단히 해결할 수 있다. python.exe -m pip install --upgrade pip 그러면 알아서 기존 버전을 삭제하고 알맞은 버전으로 다시 설치가 진행된다. 작업이 끝난 후에 다시 pip 명령어를 쳐보면 정상작동하는 것을 확인할 수 있다.
return문은 함수의 실행을 끝맺는 문장이다. 기본 기능은 수식을 계산해서 그 결과값을 돌려주는 것으로, 함수 내용물 안 어디서나 사용할 수 있다. 함수의 내용물 중간에서 return문이 실행되면 결과값이 반환되며 함수는 중단된다. return문과 비교되는 문장이 break문이다. return문이 함수의 실행을 중단하기 위해 쓰인다면, break문은 반복문의 실행을 중단하기 위해 쓰인다. 보통은 함수의 내용물로 반복문이 들어가기에 return의 조금 더 국소적인 버전이라 볼 수도 있다. 반복을 구성하는 조건문에서, if부분에서 이미 조건이 충족되어 원하는 실행이 모두 완료된다면 굳이 else부분이 없어도 된다는 것이다. if문의 실질적인 내용물 아래에 break를 적어줌으로써 반복문을 아예 탈출할 수 ..
파이썬 코드에서 사용되는 연산자는 매우 다양하다. 그러면 이러한 연산자들을 중첩해서 쓸 일도 많이 생기기 마련이고, 어떤 것들을 먼저 계산할지에 대한 사전 논의가 필요할 것이다. 그래서 Python에서는 연산자의 우선순위가 정해져있다. 여기(파이썬 공식사이트)로 들어가면 Operator precedence라고 명시된 연산자 우선순위를 확인할 수 있다. 표를 유심히 관찰해보면 다음과 같은 결론을 이끌어낼 수 있다. +,- 보다 *, / 연산자가 더 아래칸에 위치한 것으로 보아 우선순위가 높다. 일반적으로 수학에서 곱셈을 먼저 계산하고 덧셈을 생각하는 것과 같은 원리가 그대로 적용되는 것이다. 하지만 같은 +,- 연산자라도, +x, -x 등의 단항으로 쓰일 때는 *보다도 우선순위가 높다. 이러한 규칙들은 비..
숫자 형식에 int, float 등이 있었다면 시퀀스 형식에는 str과 더불어 list가 있다. 시퀀스 형식을 다룰 때는 [ ] 연산자를 사용한다. 우선 기존에 익숙한 str 형식으로 시험을 해보자면, msg = 'hello' 라는 할당문을 적은 후, msg[3]을 치면 'l'이라는 결과를 볼 수 있다. 이 'l'의 의미는 바로 'hello'라는 문자열에서 3번째 문자에 해당하는 것을 출력한 것이다. >>> msg = 'hello' >>> msg[3] 'l' 정리하면, [ ] 연산자는 시퀀스의 내용물 중 하나를 꺼내기 위해서 사용하는 것이다. 여기서 [ ]안에 들어있던 3을 index 값이라고 한다. 시퀀스 형식에서 정확히 한 칸만을 골라서 쓰고 싶을 때, 그 칸에 해당하는 index값을 말하자면 위의 ..