Python2与Python3差异之print

时代在发展,技术在进步。没有什么是停止不前的!2019年已经接近尾声,Python2停止更新的时间越来越近。其中比较流行的如 NumPy、Requests 和 TensorFlow 等承诺到 2020 年将停止支持2.x。尽管迁移过程也会花许多时间与精力,但是转Python3是早晚都要面对的。最近在迁移自己的代码到Python3,对于迁移的过程中遇到的情况进行总结。

首先我们来说一下常用的print。
最明显的区别就在于,我们在2.x版本中的print "hello world" ,在3.x版本中会报错。必须要以print("hello world")这样的格式。为什么会发生这样的变化呢?下面就让我们来看一下~

主要的变化就在于2.x中print是一个语句,我们可以讲要输出的内容直接放到print关键字后面即可。而3.x版本里,print()是一个函数,需要将输出的内容作为参数传递给print函数。
这里我们可以通过help函数来测试下。昨边终端的是2.7版本,右边的为3.7版本

我们可以看到,2.x版本中直接报语法错误,3.x版本中显示来函数的帮助信息。
我们来看一下3.x中的函数说明:

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file:  a file-like object (stream); defaults to the current sys.stdout.
    sep:   string inserted between values, default a space.
    end:   string appended after the last value, default a newline.
    flush: whether to forcibly flush the stream.

value表示要输出的内容,可以有多个,其中用逗号隔开即可。可以使用格式化方法输出,也可以占位符的方式输出。具体转换的类型,可以去查阅相关表格,这里不做过多说明。
例如:

print("123","456","789")
print("My name is %s,I'm %d years old." % ('Tom',18))
print("My name is {0},,I'm %d years old.{1}".format('Tom', 18))

sep表示要使用的间隔符号,默认逗号隔开的参数会以空格间隔,使用sep参数可以替换成想要的分隔符,如下划线等符号。

print("hello","world",sep="_")

end表示换行,不加该参数默认是回车,使用end可以控制是否换行,比如:
print("lines",end="")

file表示输出到的位置,默认是stdout,即输出到控制台。如果要输出到文件,首先需要open打开文件,然后设置打开的文件。

fp = open("1.txt", "w")
print("write file", file=fp)

flush 指是否立即输出,默认情况下优先存放到缓冲区,系统碰到\n换行的时候会立即输出,没有换行不立即输出,flush=True可在没有换行的情况下立即输出。不过这个目前看不太常用。

接下来要说的是关于输出的字符类型:
2.x版本的编码问题一直比较蛋疼,2.x版本中有两种字符串类型:Unicode字符串和非Unicode字符串。3.x中只有一种字符串类型,即Unicode字符串。3.x中减少了2.x中比较蛋疼的字符串问题。

迁移过程中的代码批量替换
可以使用编辑器中的正则替换功能进行批量替换,这里大家使用的不同编辑器可能会存在些差异,可以根据具体情况来定,我这里使用vscode。如下图:

搜索的正则为:print\s*(.*)
替换的内容为:print($1)

这里仅仅是第一篇,后续会继续更新。如http处理,字符串差异,异常处理、数据类型等。避免大家在过程中踩坑。大家也有一些场景问题,也可以在评论中发出来。