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

最近有个在修改一份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默认是按照相对路径导入模块和包

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

待补充

发布了9 篇原创文章 · 获赞 1 · 访问量 479

猜你喜欢

转载自blog.csdn.net/BierOne/article/details/104476468