Python 3.x 新特性及10大变化

一、print() and exec() 函数

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

1. print的变化
 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)!
2.exec()的变化

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

二、整数及除法

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

Old: >>>1/2   #结果是0   
New: >>>1/2   #结果是0.5 

三、input()代替raw_input()

# 变简洁了
Old:  >>>question = raw_input("What is your quest? ")
New:  >>>question = input("What is your quest? ")

四、源文件编码默认为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

五、字符串格式变化

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

>>>"I love {0}, {1}, and {2}".format("chen", "jing", "bao")
'I love chen, jing, and bao'

>>>"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'

六、比较

Python3对于值的比较要严格得多。在Python2中,任意两个对象均可进行比较,例如:

Old: >>>11 < 'ORACLE'   # Python 2 结果为:True
New: >>>11 < 'ORACLE'   # Python 3 这种比较将导致TypeError异常

七、标识符支持非 ASCII 字符

八、异常处理

  • 异常类必须继承自BaseException,它是异常结构的基类。
  • 移除了StandardError
  • 抛出异常:使用raise Exception(args)而不是原来的raise Exception, args
  • 捕获异常: 使用except Exception as identifier而不是原来的except Exception, identifier
  • 异常链(Exception chain)。
  • 改良了一些windows不能加载模式时的异常信息,具有本地化处理。

例子1: Python 3中的异常处理

# 绑定ValueError到本地的ex
try:
    x = float('blah')
except ValueError as ex:
    print("value exception occurred ", ex)

# 同时捕获两个不用的异常
try:
    x = float('blah')
except (ValueError, NameError):
    print("caught both types of exceptions")

例子2: Python 3中的隐式异常链

def divide(a, b):
    try:
        print(a/b)
    except Exception as exc:
        def log(exc):
            fid = open('logfile.txt') # missing 'w'
            print(exc, file=fid)
            fid.close()
            log(exc)

divide(1,0)

九、字典

Python 3.0 内的另一个重大改变是字典内dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的删除。取而代之的是:dict.keys(),dict.values(),dict.items(),它们被进行了修补,可以返回轻量的、类似于集的容器对象,而不是键和值的列表。这样的好处是在不进行键和条目复制的情况下,就能在其上执行set操作。dict.has_key()同样被移除。

>>> d = {1:"Food",2:"Book"}
>>> d.keys(), d.values(),d.items()
>>> for values in d.items():
 print (values)
(1, 'Food')
(2, 'Book')
>>> keys = list(d.items())
>>> print (keys)
[(1, 'Food'), (2, 'Book')]
Old:  >>> d.has_key(1)
True
New: >>> 1 in d     #新版本判断key是否在字典里面
True 

十、其他变化

  • 移除了backticks(使用repr()代替)
  • 移除了<>(不等号,使用!=代替)
  • as和with 变成了关键字
  • True,False和None变成了关键字
  • 移除了getslice,语法a[i:j]被解释成a.getitem(slice(i,j))
  • nonlocal声明。使用nonlocal可以声明一个外部变量(不是global变量)
  • xrange()改名为range(),range()现在不是产生一个列表(list),而是一个迭代器。
  • next()重命名为next(),新的内建函数next()可以调用一个对象的next()方法。
  • 八进制字,二进制和bin()函数。应该写0o666而不是0666,oct()函数也做了响应的改动。同样,0b1010等价于10,bin(10)返回”0b1010″。
>>>0o13             #八进制转十进制
11
>>>0b010101         #八进制转二进制
21
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值