본문 바로가기

Python/Python 기초

파이썬 버전 2와 버전 3의 차이점

내 블로그에 포스팅된 Python 예제들은 Python 버전 3을 기준으로 작성되었다.


Python에는 수 많은 모듈과 라이브러리가 있는데 아직까지는 Python2 용이 더 많다. (하지만 점점 Python3로 옮겨갈 것이다...)


풍부한 Python2 의 라이브러리를 사용하기 위해서 아직까진 Python2를 이용하는 사람도 많다.


Python3 는 Python2의 많은 버그를 수정했지만 이로 인해


Python3 프로그램은 Python2 버전 인터프리터에서 수행되지 않고 


Python2 또한 Python3 인터프리터에서 수행되지 않는다.


쉽게 말해 호환되지 않는다.


두 버전 간에는 몇 가지 바뀐 점이 있는데 여기서는 바뀐 사항들이 무엇인지에 대해 조금다루겠다.


여건이 된다면 파이썬3와 파이썬2 모두 배워도 된다.





print()함수와 print 구문


파이썬3 에서 print()는 input()이나 len()처럼 함수가 되었다.


다른 함수 호출처럼 ()를 써줘야 한다.(물론 print 구문에서도 괄호를 옵션으로 쓸 수는 있었다).


파이썬2 의 print 구문은 문장의 끝에서 항상 줄 바꿈을 찍었다.


줄 바꿈을 하지 않고 그냥 빈칸만 보여주게 하려면 print문 끝에 쉼표를 써줘야 한다.


>>> # Python 2

>>> print "Hello",


파이썬3 의 print() 함수에서 문자열 끝에 줄 바꿈 문자 말고 다른 문자를 넣으려면


키워드 인자 end 를 사용해야 한다.


>>> # Python3

>>> print("Hello", end="")




input()과 raw_input() 함수


파이썬2 에서는 키보드로부터 입력을 받으려면 raw_input()을 썼다.

파이썬3 에서는 input()이 대신한다. 이 함수가 나오면 이름만 바꿔 쓰면 된다.


>>> # Python 2

>>> name = raw_input()


>>> # Python 3

>>> name = input()



range() 함수의 반환 값


파이썬2 에서 range() 함수는 정수로 된 실제 리스트를 반환한다.

파이썬3 에서 range() 함수는 range 객체를 반환한다.

for 문에서 두 반환 값은 동일하게 동작한다.


>>> for i in range(10): # 파이썬2 와 3에서 모두 동작

...print(i)


하지만 파이썬3 에서 정수로 이루어진 실제 리스트를 만들려고 하면

range() 객체를 list() 함수를 사용해서 리스트로 변환해야 한다.


>>> # Python2

>>> listOfInts = range(10)


>>> # Python3

>>> listOfints = list(range(10))



'/' 연산자로 나누기


파이썬2 에서는 '/' 연산자로 나누기를 하면 숫자 중 적어도 하나는 부동소수점이여야 결과 값이 부동소수점이 되었다.

>>> # Python2

>>> 25.0 / 8

3.125

>>> 25 / 8.0

3.125


하지만 파이썬2 에서 2개의 숫자가 모두 정수이면 결과 값은 반내림을 해서 정수로 보여주었다.

파이썬3 에서는 따로 부동소수점을 쓰지 않아도 결과를 부동소수점으로 보여준다.

>>> # Python2

>>> 25 / 8

3

>>> # Python3

>>> 25 / 8

3.125



format()메소드와 %s로 문자열 포매팅하기


파이썬2 와 파이썬3 에서 모두 문자열 안에 %s를 두고 각 %s에 들어갈 수 있도록 값의 리스트를 추가할 수 있다.

>>> # Python2 and 3

>>> 'My name is %s and I am from %s.' % ('Al', 'Houston')

'My name is Al and I am from Houston'


파이썬3 에서는 format() 이라는 문자열 메소드가 추가되었다.

format()의 파라미터로 인자의 리스트를 주어 문자열에서 사용할 수 있다,

%s 대신 {0},{1},{2} 등을 사용한다.

>>> # Python 3

>>> 'My name is {0} and I am from {1}.'.format('Al', 'Houston')

'My name is Al and I am from Houston'


{}안에 들어가는 숫자가 format() 파라미터의 인덱스가 된다.

따라서 문자열 안에서 위치를 바꿔도 format()안의 해당하는 파라미터가 들어간다.

>>> # Python 3

>>> 'My name is {1} and I am from {0}.'.format('Al', 'Houston')

'My name is 'Houston' and I am from Al'


또 format()을 쓰면 파라미터를 여러 개 쓰지 않고도 문자열에서 중복해서 사용할 수 있다.

>>> # Python 3

>>> 'My name is {0}, {0}, {0}, {0} and I am from {1}.'.format('Jimy Four Times', 'Houston')

My name is Jimmy Four Times, Jimmy Four Times, Jimmy Four Times, Jimmy Four Times, and I am from Houston'


숫자 인덱스만 사용할 수 있는 게 아니고 {}안에 텍스트를 넣을 수도 있다.

텍스트를 넣으면 format() 안에서 키워드 인자를 쓰면 된다.

>>> # Python3

>>> 'My name is {0} and I like {thing} and I am from {hometown}.'.format('Al', homtown='Houston', thing='cats')

'My name is Al and I like cats and I am from Houston.'