python2.7与python3的一些常见差异

本文详细介绍了从Python2迁移到Python3的过程中遇到的主要差异,包括from __future__ import语句的使用、除法运算符的行为变化、__init__.py文件的作用及变化、以及导入模块和包的不同规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有个在修改一份code,原始版本是python2.7的,需要转到python3,中间遇到了一些问题,遂记录下。以后也可能会补充

from future import xx 的妙用

一般在python2.7经常见到类似如下的import语句:

from __future__ import print_function
from __future__ import division

其实就是调用高版本的python库,如上面的print和除法division。

division的差异

这里顺便提一下两个版本的除法区别:

python2.7:向下取整

在这里插入图片描述
python3:浮点型小数

在这里插入图片描述

关于__init__.py文件效用差异

关于导入模块的规则可以参考这篇博客,下面为上述链接的部分引用:

在Python2中,把一个文件夹认定为一个模块需要在文件夹中包含__init__.py的文件,否则无法读入;而Ptyhon3无需__init__.py ,反而是如果在sys.path中一旦遇到包含__init__.py的文件夹,就把这个文件夹当成唯一的模块,不再去寻找sys.path中的其他路径中的模块,导致开发者指定的模块往往无法正常导入。

注:关于init的改动,出现在python3.3以后的版本中
这里关于python3其实说的并不清楚。所以再仔细浏览了一下官方文档, 为了有直观的概念,我们直接看如下示例:

Directory:

project/
    example/
        foo.py
project2/
    example/
        __init__.py
        bar.py

这里 PYTHONPATH=dir 是将dir加入到查找package的目录中
示例一: 如下,在project2/example下有__init__.py的时候,python会建立一个directory package,其中只包含该目录下的modules。对于其他同名的如project1/example下的modules则会忽略

$ PYTHONPATH=../project2 python3 -c "import example.bar"
Hello from  example.bar
$ PYTHONPATH=../project2 python3 -c "import example.foo"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named 'example.foo'

示例二: 删掉了__init__.py,则bar.py和foo.py都可以找到。

$ rm ../project2/example/__init__.py
$ PYTHONPATH=../project2 python3 -c "import example.bar"
Hello from  example.bar
$ PYTHONPATH=../project2 python3 -c "import example.foo"
Hello from  example.foo



import导入模块和包的差异

前面提到了__init__.py,在python2下如果没有该文件,则检索不到directory下的modules。除此之外,还有路径上的差异:

python3是按照程序运行的绝对路径
python2默认是按照相对路径导入模块和包

这篇博客介绍的非常好,可以参考,我这里不再赘述。

待补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值