1.源代码编码和标识符
        Python3假定源代码使用UTF-8编码。另外,关于标识符中哪些字符是合法的规则也放宽了。特别是,标识符可以包含代码点为U+0080及以上的任意有效Unicode字符。例如:
        π = 3.1415926
2.集合字面量
        在{}中放入一组值就可以定义一个集合,例如:
        days = {'Mon','Tue','Wed','Thu','Fri','Sat','Sun'}
同:
        days = set(['Mon','Tue','Wed','Thu','Fri','Sat','Sun'])
3.集合和字典包含
语法{expr for x in s if condition}称为集合包含。它将一种操作应用给集合s的所有元素,然后返回一个集合。
语法{kexpr:vexpr for k,v in s if condition}称为字典包含。它将一种操作应用给(key,value)元组序列s中的所有键和值。然后返回一个字典。
4.扩展的可迭代项解包
在Python2中,使用如下语法将一个可迭代项解包到一些变量中:
items = [1,2,3,4]
a,b,c,d = items        #将各个项解包到变量中
只有变量个数与要解包的项数完全相等,解包才能进行。
在Python3中,可以使用通配符变量仅仅解包一个序列中的某些项,而将其他值放到一个列表中,例如:
a,*rest = items            #a = 1 ,rest = [2,3,4]
a,*rest,d = items         #a = 1 ,rest = [2,3],d = 4 
*rest,d = items            #rest = [1,2,3],d = 4
使用这种语法时,只能出现一个带有*号的变量。
5.nonlocal变量
使用nonlocal声明后,内部函数可以修改外部函数中的变量,例如:
def  countdown(n):
       def decrement():
             nonlocal n
             n -= 1
       while n > 0:
                print('T-minus',n)
                decrement()
Python2中,内部函数可以读取外部函数的变量,但不能修改它们,使用nonlocal声明后就能修改它们了。
6.函数注释
函数与方法在定义时都可以带有注释,其通常语法为:
def functionName(par1:exp1,par2:exp2,...,parN:expN)->rexp:
    suite
每个冒号表达式部分(:expX)是一个可选的注释,箭头返回表达式部分(->rexp)也是。
如果存在注释,就会被添加到__annotations__字典中;如果不存在,那么此字典为空。该字典的键为参数名,值为相应的表达式。这种语法格式允许我们对所有、部分或不对任何参数进行注释,对返回值也是如此。同样的语法也使用于各种位置参数和关键字参数。
def  foo(x:1,y:2) -> 3:
        pass
>>>foo.__annotations__
{'y':2,'x':1,'return':3}
7.只能通过关键字引用的参数
函数可以指定只能通过关键字引用的参数,方法是在第一个带*号的参数后定义额外的参数,例如:
def foo(x,*args,strict = False):
        statements
调用此函数时,只能以关键字的形式指定strict参数,例如:
a = foo(1,strict = True)
如果参数的数量不定,但又要使用只能通过关键字引用的参数,可以在参数列表中使用一个单独的*号,例如:
def foo(x,*,strict = False):
        statements
8.省略号表达式
Ellipsis对象(...)可以用作表达式,从而可放在容器中或赋值给变量,例如:
>>>x = ...        #赋值为省略号
>>>x
Ellipsis
>>>a = [1,2,...]
>>>a
[1,2,Ellipsis]
>>>... in a
True
>>>x is ...
True
9.链接异常
现在可以将异常链接在一起。从本质上讲,这是让当前异常携带与前面异常相关信息的一种途径。from限定符与raise语句在一起使用便可显示链接异常。例如:
try:
        statements
except  ValueError  as  e:
        raise SyntaxError('Could not parse configuration')  from e
引发SyntaxError异常时,就会生成像下面这样一条跟踪信息,同时显示两个异常:
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    raise ValueError
ValueError
 
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    raise SyntaxError('Could not parse configuration')
SyntaxError: Could not parse configuration
异常对象的__cause__属性被置为前一个异常,使用from限定符和raise语句可以设置该属性。
有趣的异常链接:在另一个异常处理器中引发异常,例如:
def error(msg):
        print(m)                    #m未定义
try:
        statements
except ValueError as e:
        error('Could not parse configuration')
如果在Python2中执行这段代码,在error()中只有一个与NameError相关的异常。而在Python3中,前一个要处理的异常与结果链接在了一起:
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ValueError
ValueError
 
During handling of the above exception, another exeption occurred:
 
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    print m
NameError: name 'm' is not defined
10.经过改进的super()函数
super()函数用于查找基类中的方法,在Python3中它可以不带任何参数运行,例如:
class C(A,B):
        def bar(self):
                return super().bar()        #调用基类中的bar()方法
而在Python2中,必须使用super(C,self).bar()。
11.高级元类
在Python3中,元类可以在类主体执行之前完成一些额外的工作,方法是在元类中定义一个特殊的类方法__prepare__(cls,name,bases,**kwargs)。该方法的返回结果必须是一个字典,而类定义的主体执行时将填充这个字典。例如:
class MyMeta(type):
    @classmethod
    def __prepare__(cls,name,bases,**kwargs):
        print('preparing',name,bases,kwargs)
        return {}
    def __new__(cls,name,bases,classdict):
        print('creating',name,bases,classdict)
        return type.__new__(cls,name,bases,classdict)
class Foo(metaclass=MyMeta):    
    print('About to define methods')
    def __init__(self):
        pass
    def bar(self):
        pass
    print('Done defining methods')
运行以上代码后,在输出中会看到控制流的走向:
preparing Foo () {}
About to define methods
Done defining methods
'creating', 'Foo', (), {'bar': <function bar at 0x03845d0>, '__module__': '__main__', '__init__': <function __init__ at 0x384588>}
元类的__prepare__方法上的额外关键字参数是从class语句的基类列表中使用的关键字参数传递而来。例如语句class Foo(metaclass=MyMeta,spam=42,blah='Hello')将关键字参数spam和blah传递给MyMeta.__prepare__()方法。这种约定可以将任意配置信息传递给元类。
 

Python3中的新特性(1)——新的语言特性的更多相关文章

  1. python3中使用python2中cmp函数出现错误

    在python2中我们经常会使用cmp函数来比较一些东西,但是在python3中,你再来使用这个函数的时候,发现就报错了,提示找不到这个函数,这是为啥呢? 答:新版的python已经舍弃这种用法 而在 ...

  2. Python3中的新特性(3)——代码迁移与2to3

    1.将代码移植到Python2.6 建议任何要将代码移植到Python3的用户首先将代码移植到Python2.6.Python2.6不仅与Python2.5向后兼容,而且支持Python3中的部分新特 ...

  3. Python3中的新特性(2)——常见陷阱

    1.文本与字节 Python3对文本字符串(字符)和二进制数据(字节)进行了严格区分,'hello'表示一个以Unicode编码保存的文本字符串,而b'hello'表示一个字节字符串. 在Python ...

  4. MySQL5.7中InnoDB不可不知的新特性

    讲师介绍  赖铮 Oracle InnoDB团队 Principle Software Developer 曾任达梦.Teradata高级工程师,主要负责研发数据库执行引擎和存储引擎,十年以商数据库内 ...

  5. python3中替换python2中cmp函数的新函数分析(lt、le、eq、ne、ge、gt)

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/11332589 作者:sushengmiyan 在python2中我们经常会使用cmp函 ...

  6. Python3中替代Python2中cmp()函数的新函数(gt,ge,eq,le,lt)

    原文出处:http://blog.csdn.net/Artprog/article/details/52197779 Python3中已经不能使用cmp()函数了,被如下五个函数替代: import ...

  7. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

  8. ES6中的模板字符串和新XSS Payload

    ES6中的模板字符串和新XSS Payload 众所周知,在XSS的实战对抗中,由于防守方经常会采用各种各样严格的过滤手段来过滤输入,所以我们使用的XSS Payload也会根据实际情况作出各种各样的 ...

  9. 在iOS开发中,给项目添加新的.framework

    首先需要了解一下iOS中静态库和动态库.framework的概念 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我 ...

随机推荐

  1. Java打印温度转换表

    按5度的增量打印出一个从摄氏温度到华氏温度的转换表.转换公式为h=c*9/5+32,其中h为华氏温度,c为摄氏温度. 主要是“按5度的增量”这个要求,一般摄氏温度的起始分别为0度和40度,所以循环可以 ...

  2. jqueryMobile应用第一课《构建跨平台APP:jQuery Mobile移动应用实战》连载一(Hello World)

    有人说每个程序员都曾经有过改变世界的梦想,笔者认为,这与程序员年轻时编写的第一个程序有着莫大的关系.简简单单的一句“hello world”让年轻的心开始相信梦想,用一种低调的壮志凌云向世界展示自己的 ...

  3. Resource is out of sync with the file system

    Resource is out of sync with the file system解决办法: 在eclipse或mycelipse中,启动run on server时或查看项目文件时报错:Res ...

  4. [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(四)

    八.HA环境下配置多节点的sshVIP(s1):[root@s1 ~]# mkdir /opt/PostgresPlus/9.2AS/.ssh[root@s1 ~]# chown enterprise ...

  5. Android--将图片存放到我们本地

    代码里面有详细的解释,我就不多说了 //处理并保存图像 private File dealPhoto(Bitmap photo){ FileOutputStream fileOutputStream ...

  6. django-south

    python manage.py schemamigration youappname --initial # --initial在数据库创建models定义的表,以及South需要的south_mi ...

  7. Python修饰器的函数式编程

    Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...

  8. 最基础的Hash

    type thash=^node; node=record state:longint; next:thash; end; var a,i:longint; p:thash; hash:..]of t ...

  9. Kinect帮助文档翻译之一 入门

    最近在玩Kinect,使用的是Unity,发现网上好像没有什么教程.自己就只有抱着英文版帮助文档啃,真是苦逼 本人英语也不好,大家将就着看吧 Kinect入门帮助 如何运行示例 1       下载并 ...

  10. How to insert a character into a NSString

    How do I insert a space to a NSString. I need to add a space at index 5 into: NString * dir = @" ...