Skip to content Skip to main navigation Skip to footer

python 3.x版本的新特性以及10个最大的变化

本文主要介绍了python 3.x版本的新特性,说明了在使用python3.x版本时需要注意的地方,并介绍了python3.x中10个最大的变化,比如print()和exec函数的变化,源码默认的编码方式变为UTF-8等等:

Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3

Python之父Guido van Rossum谈到了Python 3.0的构思:

一直以来,除非要打破向后兼容性,否则很多缺陷和错误都无法修复。因此,Python 3000将会作为第一个放弃向后兼容性的Python版本,目的就是要让Python向着最好的语言前进。

Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下兼容。许多针对早期Python版本设计的程序都无法在Python 3.0上正常运行。为了照顾现有程序,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。基于早期Python版本而能正常运行于Python 2.6并无警告。程序可以通过一个2to3的转换工具无缝迁移到Python 3.0。Python有一些很有用的测试模块,包括doctext和unitest。确保在尝试移植到Python3之前,对应用程序进行全面测试。要确保测试范围尽可能大,而且程序在Python2.6上运行时,能通过测试并且没有出现任何警告信息。

新的Python程序建议使用Python 3.0版本的语法。除非运行环境无法安装Python 3.0或者程序本身使用了不支持Python 3.0的第三方库。目前不支持Python 3.0的第三方库有Twisted, py2exe, PIL等。大多数第三方库都正在努力地兼容Python 3.0版本。即使无法立即使用Python 3.0,也建议编写兼容Python 3.0版本的程序,然后使用Python 2.6, Python 2.7来运行。Python 2.7被确定为最后一个Python 2.x版本,它除了支持Python 2.x语法外,还支持部分Python 3.1语法.

变化大致总结如下:

01.print() and exec() 函数

python旧版本里,print和exec是作为一语句出现,可以用print “Hello,World!”, 来打印一个语句,在新版本里,print()和exec()作为一个函数出现,所以上面的写就是错误的,应该写成print (“Hello,World!”)对于Java的程序员来说,这样的改变应该是比较熟悉. System.out.print(“Hello,World!”);

Old: >>>print "The answer is", 2*2
New: >>>print("The answer is", 2*2)
Old: >>>print x,           # Trailing comma suppresses newline
New: >>>print(x, end=" ")  # Appends a space instead of a newline
Old: >>>print              # Prints a newline
New: >>>print()            # You must call the function!
Old: >>>print >>sys.stderr, "fatal error"
New: >>>print("fatal error", file=sys.stderr)
Old: >>>print (x, y)       # prints repr((x, y))
New: >>>print((x, y))      # Not the same as print(x, y)!
 

不过在Python 2.6版本里面: from __future__ import print_function

>>> from __future__ import print_function
>>> print ('Jerry','Sherry',sep='-')
Jerry-Sherry
 

下面的修改在新版本是正确的:

>>>print("There are <", 2**32, "> possibilities!", sep="")
There are <4294967296> possibilities!
>>>fid = open("log.txt", "a")
>>>print("log.txt", file=fid)
>>>print("Foo", "Bar", sep="%")
>>>Foo%Bar
 

exec() 同样是函数,在python 2.x里,下列代码是ok的.

>>> def foo():
 exec('a=4')
 print a
>>> foo()
4
 

但在python 3.x里面就不行了,会报NameError: global name ‘a’ is not defined. 因为变量a没有定义。原因在于exec()作为函数,只操作globals()和locals()函数返回的字典。但locals()函数返回的字典实际上是局部变量的一个副本。exec()函数中进行的赋值只修改了局部变量的这份副本,而非局部变量本身。下面给出了一种解决办法:

>>> def foo():
 _locals = locals()
 exec('a=4',globals(),_locals)
 a = _locals['a']
 print (a)
>>> foo()
4
 

02.整数及除法

int和long统一为int, int表示任何精度的整数,移除sys.maxint, 因为int已经是最大的整数。新版本移除了含糊的除法符号(’/’),而只返回浮点数。在以前的版本中,如果参数是int或者是long的话,就会返回相除后结果的向下取整(floor), 而如果参数是float或者是complex的话,那么就会返回相除后结果的一个恰当的近似。

Old: >>>1/2   #结果是0     晕死。。。
New: >>>1/2   #结果是0.5   总算接地气了。
 

03.input()代替raw_input()
变简洁了。

Old:  >>>question = raw_input("What is your quest&#63; ")
New:  >>>question = input("What is your quest&#63; ")
 

04.源文件编码默认为UTF-8
Python 3 在字符编码方面有很多改进,其中之一就是默认的源文件编码从ASCII变为UTF-8,也就是说以前在文件头加上的各种花样的 coding=utf-8不再需要了!

# coding: UTF-8
# vim:fileencoding=UTF-8
# -*- coding=UTF-8 -*-
# vim: set fileencoding=UTF-8
 

05.字符串格式化变化
格式化字符串的这个内置的%操作符太有限了,新版本新增加了format(),比以前更灵活了,%要逐渐被淘汰。举三个简单的例子如下:

>>>"I love {0}, {1}, and {2}".format("eggs", "bacon", "sausage")
'I love eggs, bacon, and sausage' 

>>>”I love {a}, {b}, and {c}”.format(a=”eggs”, b=”bacon”, c=”sausage”)
‘I love eggs, bacon, and sausage’

>>>”I love {0}, {1}, and {param}”.format(“eggs”, “bacon”, param=”sausage”)
‘I love eggs, bacon, and sausage’

python 3.x版本的新特性以及10个最大的变化就是这样,欢迎大家参考。。。。

0 Comments

There are no comments yet

Leave a comment

Your email address will not be published.