Python 3 和 Python 2 存在许多显著差异,下面为你详细介绍主要的不同之处:
语法层面
- 打印函数 :
- Python 2 里,
print属于语句,使用时无需括号。例如:print "Hello, World!" - Python 3 中,
print变为函数,必须使用括号。例如:print("Hello, World!")
- Python 2 里,
- 除法运算 :
- Python 2 中,整数相除结果为整数,小数部分会被截断。例如:
3 / 2结果是 1 - Python 3 里,整数相除结果为浮点数。例如:
3 / 2结果是 1.5。若想得到整数结果,需使用//运算符,如3 // 2结果是 1
- Python 2 中,整数相除结果为整数,小数部分会被截断。例如:
- Unicode 编码 :
- Python 2 对 Unicode 支持欠佳,字符串默认是 ASCII 编码,若要使用 Unicode 字符串,需在字符串前加
u,如u"你好" - Python 3 中,字符串默认是 Unicode 编码,可直接处理多种语言文字,无需额外指定
- Python 2 对 Unicode 支持欠佳,字符串默认是 ASCII 编码,若要使用 Unicode 字符串,需在字符串前加
异常处理
- 异常捕获语法 :
- Python 2 可使用
except Exception, e来捕获异常 - Python 3 要求使用
except Exception as e这种语法
- Python 2 可使用
迭代器与生成器
range函数 :- Python 2 有
range和xrange两个函数。range返回列表,xrange返回迭代器对象 - Python 3 里,
range函数等同于 Python 2 的xrange,返回迭代器对象,节省内存
- Python 2 有
- 字典方法 :
- Python 2 中,
dict.keys()、dict.values()和dict.items()返回列表 - Python 3 里,这些方法返回视图对象,是迭代器,并非列表
- Python 2 中,
模块和库
- 标准库变动 :
- Python 3 中部分模块的名称和位置有所改变。例如,
urllib模块被拆分成多个子模块,像urllib.request、urllib.parse等 - 一些 Python 2 的库在 Python 3 中需要重新安装或更新以确保兼容
- Python 3 中部分模块的名称和位置有所改变。例如,
其他Python3特性
- Python3还提供了比如 f-string 等新特性(允许使用
print(f'{a}{b}{c+d}')这种代码来组织字符串)
示例代码对比
Python 2 代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 打印语句
print "Hello, Python 2!"
# 除法运算
result = 3 / 2
print result
# 异常处理
try:
num = 1 / 0
except ZeroDivisionError, e:
print "Error:", e
# range 函数
for i in range(5):
print i
# 字典方法
my_dict = {'a': 1, 'b': 2}
print my_dict.keys()Python 3 代码示例 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 打印函数
print("Hello, Python 3!")
# 除法运算
result = 3 / 2
print(result)
# 异常处理
try:
num = 1 / 0
except ZeroDivisionError as e:
print("Error:", e)
# range 函数
for i in range(5):
print(i)
# 字典方法
my_dict = {'a': 1, 'b': 2}
print(my_dict.keys())- 在捕捉多个异常时可以使用
1
except (ZeroDivisionError, ABCError) as e:
- 在捕捉多个异常时可以使用
附录:Python 3 可以指定参数类型
- Python 3 可以指定参数类型(Python2不可以),不过这属于类型提示(Type Hints),它只是一种提示,并不会在运行时强制检查参数类型
- 虽然类型提示不会在运行时进行强制检查,但它能提升代码的可读性和可维护性,同时还能让 IDE 提供更精准的代码提示和错误检查。若要在运行时进行类型检查,可以使用第三方库,例如
pydantic - 下面从不同方面介绍 Python 3 中指定参数类型的方式
函数参数类型提示
在定义函数时,可以为参数和返回值指定类型,示例如下:
1
2def add_numbers(a: int, b: int) -> int:
return a + b- 在上述代码里,
a: int和b: int表明a和b应当是整数类型,-> int表示该函数返回值为整数类型
- 在上述代码里,
类属性类型提示
在类中,也能够为属性指定类型,示例如下:
1
2
3
4
5
6
7class Person:
name: str
age: int
def __init__(self, name: str, age: int):
self.name = name
self.age = age- 在这个示例中,
name: str和age: int分别指定了Person类的name和age属性的类型
- 在这个示例中,
复杂类型提示
Python 还提供了
typing模块,借助该模块可以进行更复杂的类型提示,例如列表、字典等。示例如下:1
2
3
4
5
6
7from typing import List, Dict
def process_list(numbers: List[int]) -> int:
return sum(numbers)
def process_dict(data: Dict[str, int]) -> int:
return sum(data.values())- 在上述代码中,
List[int]表示列表中的元素应当是整数类型,Dict[str, int]表示字典的键为字符串类型,值为整数类型
- 在上述代码中,
可选类型和联合类型
使用
typing模块的Optional和Union可以表示可选类型和联合类型。示例如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24from typing import Optional, Union
def get_length(s: Optional[str]) -> int:
if s is None:
return 0
return len(s)
print(get_length("Alice")) # OK
print(get_length(None)) # OK
print(get_length([1,2,3])) # 运行正常,但编译器会有提示
def convert_to_number(value: Union[int, str]) -> int:
if isinstance(value, str):
return int(value)
return value
print(convert_to_number("112")) # OK
print(convert_to_number(112)) # OK
print(convert_to_number(112.0)) # 运行正常,但编译器会有提示
# 5
# 0
# 3
# 112
# 112
# 112.0- 在
get_length函数里,Optional[str]意味着参数s可以是字符串类型,也可以是None - 在
convert_to_number函数中,Union[int, str]表示参数value可以是整数类型或者字符串类型
- 在