Python2.x와 3.x 버전의 차이점


Python 3.0 버전은 Python 3000, 줄여서 Py3k라고도 합니다. 이는 이전 버전의 Python에 비해 주요 업그레이드입니다.

Python 3.0은 너무 많은 부담을 주지 않기 위해 하위 호환성을 염두에 두고 설계되지 않았습니다.

이전 Python 버전용으로 설계된 많은 프로그램은 Python 3.0에서 제대로 실행되지 않습니다.

기존 프로그램을 관리하기 위해 Python 2.6은 기본적으로 Python 2.x의 구문과 라이브러리를 사용하는 전환 버전입니다. 또한 Python 3.0으로의 마이그레이션을 고려하고 일부 Python 3.0의 사용을 허용합니다. 구문과 기능.


새로운 Python 프로그램에서는 Python 버전 3.0 구문을 사용하는 것이 좋습니다.


실행 환경이 Python 3.0을 설치할 수 없거나 프로그램 자체가 Python 3.0을 지원하지 않는 타사 라이브러리를 사용하지 않는 한. 현재 Python 3.0을 지원하지 않는 타사 라이브러리에는 Twisted, py2exe, PIL 등이 포함됩니다.

대부분의 타사 라이브러리는 Python 3.0 버전과 호환되도록 열심히 노력하고 있습니다. Python 3.0을 바로 사용할 수 없더라도 Python 3.0 버전과 호환되는 프로그램을 작성한 후 Python 2.6 또는 Python 2.7을 사용하여 실행하는 것이 좋습니다.

Python 3.0의 변경 사항은 주로 다음과 같은 측면입니다.


print 함수

print 문이 사라지고 print() 함수로 대체되었습니다. Python 2.6 및 Python 2.7은 이러한 형식의 인쇄 구문을 부분적으로 지원합니다. Python 2.6과 Python 2.7에서는 다음 세 가지 형식이 동일합니다.

print "fish"
print ("fish") #注意print后面有个空格
print("fish") #print()不能带有任何其它参数

그러나 Python 2.6은 실제로 새로운 print() 구문을 지원합니다.

from __future__ import print_function
print("fish", "panda", sep=', ')

유니코드

Python 2에는 ASCII str() 유형이 있으며 unicode()는 바이트 유형이 아닌 별도입니다.

이제 Python 3에서는 마침내 유니코드(utf-8) 문자열과 바이트 클래스인 byte 및 bytearrays를 갖게 되었습니다.


Python3.X 소스 코드 파일은 기본적으로 utf-8 인코딩을 사용하므로 다음 코드가 합법적입니다.

>>> 中国 = 'china' 
>>>print(中国) 
china

Python 2.x

>>> str = "我爱北京天安门"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
>>> str = u"我爱北京天安门"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

Python 3.x

>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'

나누기 연산

Python의 나누기는 다른 언어에 비해 매우 고급 기능이며 매우 복잡한 규칙을 가지고 있습니다. Python의 Division에는 /와 //

우선, /division:

Python 2.x에서 /division은 우리에게 친숙한 대부분의 언어와 같습니다. Java 및 C와 같은 정수 나누기 결과는 정수입니다. 부동 소수점 나누기는 소수 부분을 유지하고 부동 소수점 결과를 얻습니다.

Python 3.x/division에서는 더 이상 정수를 나누는 경우 결과가 부동 소수점 숫자가 됩니다.

Python 2.x:

>>> 1 / 2
0
>>> 1.0 / 2.0
0.5

Python 3.x:

>>> 1/2
0.5

//division의 경우 이 나누기를 바닥 나누기라고 하며 나누기의 결과는 다음과 같습니다. Python 2.x와 Python 3.x에서 일관된 Floor 연산을 자동으로 수행합니다.

python 2.x:

>>> -1 // 2
-1

python 3.x:

>>> -1 // 2
-1

소수점 부분은 버리지 않고 원할 경우 바닥 연산을 수행한다는 점에 유의하세요. 소수 부분을 가로채면 수학 모듈

python 3.x:

>>> import math
>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0

Exception

예외 처리도 변경되었습니다. Python 3에서는 약간. Python 3에서는 이제 as 키워드를 사용합니다.

에서 예외를 포착하는 구문이 exc, var에서 exc as var로 변경되었습니다.

여러 범주의 예외를 동시에 포착하려면 Except (exc1, ex2) 구문을 var로 사용하세요. Python 2.6은 이미 두 구문을 모두 지원합니다.

  • 1. 2.x 시대에서는 모든 유형의 객체를 직접 던질 수 있습니다. 3.x 시대에서는 BaseException을 상속받은 객체만 던질 수 있습니다.

  • 2.x raise 문은 쉼표를 사용하여 던져진 객체 유형과 매개변수를 구분합니다. 3.x에서는 이 이상한 쓰기 방법을 취소하고 객체를 직접 호출합니다.


2.x 시대에 코드의 예외는 프로그램 오류를 나타낼 뿐만 아니라 일반적인 제어 구조가 수행해야 하는 작업을 수행하는 경우도 많습니다. 3에서는 디자이너가 예외를 더 구체적으로 만들었음을 알 수 있습니다. 오류가 발생한 경우에만 예외 포착 문을 사용하여 처리할 수 있습니다.


xrange

Python 2에서는 반복 가능한 객체를 생성하기 위해 xrange()를 사용하는 것이 매우 인기가 있습니다. 예: for 루프 또는 목록/설정/사전 이해.

이는 생성기와 매우 유사하게 동작합니다(예: "지연 평가"). 하지만 이 xrange-iterable은 무한하므로 무한히 탐색할 수 있습니다.

지연 평가로 인해 xrange() 함수는 한 번만 반복해야 하는 경우(예: for 루프) range() 함수보다 빠릅니다. 하지만 한 번 반복하는 것보다 여러 번 반복하는 것은 생성기가 매번 처음부터 시작되기 때문에 권장되지 않습니다.

Python 3에서 range()는 xrange()처럼 구현되어 전용 xrange() 함수가 더 이상 존재하지 않습니다(Python 3에서는 xrange()가 명명된 예외를 발생시킵니다).

import timeit

n = 10000
def test_range(n):
    return for i in range(n):
        pass

def test_xrange(n):
    for i in xrange(n):
        pass

Python 2

print 'Python', python_version()

print '\ntiming range()' 
%timeit test_range(n)

print '\n\ntiming xrange()' 
%timeit test_xrange(n)

Python 2.7.6

timing range()
1000 loops, best of 3: 433 µs per loop


timing xrange()
1000 loops, best of 3: 350 µs per loop

Python 3

print('Python', python_version())

print('\ntiming range()')
%timeit test_range(n)

Python 3.4.1

timing range()
1000 loops, best of 3: 520 µs per loop
rrree

8진수 리터럴 표현

8진수는 0o777로 작성해야 하며 원래 형식 0777은 사용할 수 없습니다. 사용하려면 바이너리를 0b111로 작성해야 합니다.

정수를 이진 문자열로 변환하는 새로운 bin() 함수가 추가되었습니다. Python 2.6은 이미 두 구문을 모두 지원합니다.

Python 3.x에서는 8진수 리터럴을 표현하는 방법은 0o1000 한 가지뿐입니다.

python 2.x

print(xrange(10))
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-5d8f9b79ea70> in <module>()
----> 1 print(xrange(10))

NameError: name 'xrange' is not defined

python 3.x

>>> 0o1000
512
>>> 01000
512

불균등 연산자

Python 2.x에는 두 가지 부등 연산자가 있습니다. !=와 <>

Python 3.x에서는 <>를 쓰는 두 가지 방법이 있으며, !=를 쓰는 방법은 한 가지뿐입니다. <>


repr 표현식 ``

Python 2.x의 백틱 ``은 repr 함수의 역할과 동일합니다

이것은 Python 3.x에서 제거되었습니다. 이 방법으로 작성하면 repr 함수만 사용할 수 있습니다. 코드가 더 명확해 보이도록 하기 위한 것인가요? 그러나 나는 repr을 사용할 기회가 거의 없다고 생각합니다. 일반적으로 디버깅 중에만 사용되며 대부분의 경우 str 함수는 문자열로 개체를 설명하는 데 사용됩니다.

>>> 01000
  File "<stdin>", line 1
    01000
        ^
SyntaxError: invalid token
>>> 0o1000
512

여러 모듈의 이름이 변경되었습니다(PEP8에 따라)

旧的名字新的名字
_winregwinreg
ConfigParserconfigparser
copy_regcopyreg
Queuequeue
SocketServersocketserver
reprreprlib

이제 StringIO 모듈이 새로운 io 모듈로 병합되었습니다. 신규, md5, gopherlib 및 기타 모듈이 삭제되었습니다. Python 2.6은 이미 새로운 io 모듈을 지원합니다.

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib가 http 패키지에 병합됩니다.

exec 문이 취소되고 exec() 함수만 남습니다. Python 2.6은 이미 exec() 함수를 지원합니다.


5. 데이터 유형

1) Py3.X는 long 유형을 제거했으며 이제 정수 유형(int)만 있지만 2.X 버전처럼 동작합니다. long

2) 버전 2.X의 옥텟 문자열에 해당하는 새로운 바이트 유형이 추가되었습니다. 바이트 리터럴을 정의하는 방법은 다음과 같습니다:

def sendMail(from_: str, to: str, title: str, body: str) -> bool:
    pass

str 객체 및 바이트 객체 encode() (str -> bytes) 또는 .decode() (bytes -> str) 메서드를 서로 변환할 수 있습니다.

>>> b = b'china' 
>>> type(b) 
<type 'bytes'>

3) dict의 .keys(), .items 및 .values() 메서드는 반복자를 반환하는 반면, 이전 iterkeys() 및 기타 함수는 폐기되었습니다. 또한 제거된 것은 dict.has_key()를 in으로 교체하세요.