Python——Python3相对Python2的异同点总结

Python 3 和 Python 2 存在许多显著差异,下面为你详细介绍主要的不同之处:


语法层面

  • 打印函数
    • Python 2 里,print 属于语句,使用时无需括号。例如:print "Hello, World!"
    • Python 3 中,print 变为函数,必须使用括号。例如:print("Hello, World!")
  • 除法运算
    • Python 2 中,整数相除结果为整数,小数部分会被截断。例如:3 / 2 结果是 1
    • Python 3 里,整数相除结果为浮点数。例如:3 / 2 结果是 1.5。若想得到整数结果,需使用 // 运算符,如 3 // 2 结果是 1
  • Unicode 编码
    • Python 2 对 Unicode 支持欠佳,字符串默认是 ASCII 编码,若要使用 Unicode 字符串,需在字符串前加 u,如 u"你好"
    • Python 3 中,字符串默认是 Unicode 编码,可直接处理多种语言文字,无需额外指定

异常处理

  • 异常捕获语法
    • Python 2 可使用 except Exception, e 来捕获异常
    • Python 3 要求使用 except Exception as e 这种语法

迭代器与生成器

  • range 函数
    • Python 2 有 rangexrange 两个函数。range 返回列表,xrange 返回迭代器对象
    • Python 3 里,range 函数等同于 Python 2 的 xrange,返回迭代器对象,节省内存
  • 字典方法
    • Python 2 中,dict.keys()dict.values()dict.items() 返回列表
    • Python 3 里,这些方法返回视图对象,是迭代器,并非列表

模块和库

  • 标准库变动
    • Python 3 中部分模块的名称和位置有所改变。例如,urllib 模块被拆分成多个子模块,像 urllib.requesturllib.parse
    • 一些 Python 2 的库在 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
    2
    def add_numbers(a: int, b: int) -> int:
    return a + b
    • 在上述代码里,a: intb: int 表明 ab 应当是整数类型,-> int 表示该函数返回值为整数类型

类属性类型提示

  • 在类中,也能够为属性指定类型,示例如下:

    1
    2
    3
    4
    5
    6
    7
    class Person:
    name: str
    age: int

    def __init__(self, name: str, age: int):
    self.name = name
    self.age = age
    • 在这个示例中,name: strage: int 分别指定了 Person 类的 nameage 属性的类型

复杂类型提示

  • Python 还提供了 typing 模块,借助该模块可以进行更复杂的类型提示,例如列表、字典等。示例如下:

    1
    2
    3
    4
    5
    6
    7
    from 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 模块的 OptionalUnion 可以表示可选类型和联合类型。示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    from 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 可以是整数类型或者字符串类型