현재 대부분의 Python 코드는 표준적으로 3.6 이상의 버전을 사용하지만 간혹 2.x 버전의 코드를 읽어야 하는 상황이 생겨 일부 변경 사항을 정리해 보았다. 이곳에 작성되지 않은 변경 사항은 공식문서에서 확인할 수 있다.
Python 2.7 실습: https://workat.tech/ide/online-python2-compiler
문자(열)
2.x: ASCII
3.x: UTF-8
2.x에서 UTF-8으로 인코딩하기 위해서는 아래 주석을 소스 코드 첫 줄에 작성해야 했다.
# -*- coding: utf-8 -*-
2.x의 unicode 자료형(u'...')은 3.x에서 binary(b'...')가 되었다. 그리고 str과 binary를 섞어서 사용할 수 없다.
숫자
# 2.x
>>> 3 / 2
1
>>> 3.0 / 2.0
1.5
# 3.x
>>> 3 / 2
1.5
2.x에서는 int / int의 결괏값을 int로 가졌지만, 3.x에서는 자동으로 float를 반환할 수 있도록 계산한다.
2.x에 존재하던 long 자료형은 int라는 이름으로 통일되었다.
변화된 문법
# 2.x
def foo(a, (b, c)):
...
# 3.x
def foo(a, b_c):
b, c = b_c
...
# 2.x
>>> 3 <> 4
True
# 3.x
>>> 3 != 4
True
# 2.x
print 'python'
# 3.x
print('python')
# 2.x
>>> r = raw_input("Input Integer: ") # 입력된 값은 모두 str로 처리
Input Integer: 3
>>> r
'3'
>>> r = input("Input Integer: ") # 입력된 값에 자료형이 달라짐
Input Integer: 3
>>> r
3
# 3.x
>>> r = raw_input("Input Integer: ")
NameError: name 'raw_input' is not defined
>>> r = input("Input Integer: ") # 입력된 값은 모두 str로 처리
Input Integer: 3
>>> r
'3'
예외 처리
# 2.x
try:
...
except ValueError, err:
print "Error:", err
# 3.x
try:
...
except ValueError as err:
print("Error:", err)
2.x은 as 대신 ,(comma)를 이용해 발생한 예외를 받아올 수 있었다.
2.x에 존재했던 StandardError가 삭제되었다.
Views And Iterators
2.x | 3.x |
dict.keys(), dict.items(), dict.values() → list |
→ 각각의 객체 |
dict.iterkeys(), dict.iteritems(), dict.itervalues() | (지원하지 않음) |
range → list xrange → 객체 |
range → 객체 |
map, filter → list | → iterator |
객체 비교
# 2.x
>>> 1 < ''
True
>>> None < None
False
# 3.x
>>> 1 < ''
TypeError: '<' not supported between instances of 'int' and 'str'
>>> None < None
TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'
3.x은 같은 객체끼리(natural ordering)의 비교만 가능해졌다.