zoukankan      html  css  js  c++  java
  • python学习笔记(2)--python3新特性

    本节点标题
    1、Python 3.x 新特性及10大变化
    1.1.print() and exec() 函数
    1.2.整数及除法
    1.3.input()代替raw_input()
    1.4.源文件编码默认为UTF-8
    1.5.字符串格式化变化
    1.6.比较
    1.7.标识符支持非 ASCII 字符
    1.8.异常处理
    1.9.字典dict
    1.10.其他改变


    =======================================================================================================================

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

    这篇文章主要介绍了Python 3.x 新特性及10大变化,本文讲解了Python之父Guido van Rossum谈到了Python 3.0的构思,Python3版本的一些变化如print() and exec() 函数、整数及除法、input()代替raw_input()等,需要的朋友可以参考下

    Python 3.x 起始版本是Python 3.0

    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语法.

    变化大致总结如下: 
    1.1.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

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

    1.3.input()代替raw_input()
    变简洁了。
    代码如下:
    Old:  >>>question = raw_input("What is your quest? ")
    New:  >>>question = input("What is your quest? ")

    这两个函数均能接收 字符串 ,但 raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。
    而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。

    raw_input() 将所有输入作为字符串看待,返回字符串类型。
    而 input() 在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float );
    input() 可接受合法的 python 表达式,举例:input( 1 + 3 ) 会返回 int 型的 4 

    1.4.源文件编码默认为UTF-8
    Python 3 在字符编码方面有很多改进,其中之一就是默认的源文件编码从ASCII变为UTF-8,也就是说以前在文件头加上的各种花样的 coding=utf-8不再需要了!(py2要指定utf-8,py3就不用)
    代码如下:
    # coding: UTF-8
    # vim:fileencoding=UTF-8
    # -*- coding=UTF-8 -*-
    # vim: set fileencoding=UTF-8

    1.5.字符串格式化变化
    格式化字符串的这个内置的%操作符太有限了,新版本新增加了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'


    1.6.比较
    Python3对于值的比较要严格得多。在Python2中,任意两个对象均可进行比较,例如:
    代码如下:
    Old: >>>11 < 'ORACLE'   # Python 2 结果为:True
    New: >>>11 < 'ORACLE'   # Python 3 这种比较将导致TypeError异常

    1.7.标识符支持非 ASCII 字符
    代码如下:
    所有 = all
    class 男人:
        @classmethod
        def 包括(cls,ta):
            return isinstance(ta,cls)
    def 一起玩(人们):
        if 所有(男人.包括(ta) for ta in 人们):
            print ("他们是基友")
        else:
            print ("他们是朋友")
    汤姆 = 男人()
    杰瑞 = 男人()

    一起玩([汤姆,杰瑞])
    >>>
    他们是基友


    1.8.异常处理
    * 异常类必须继承自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)


    1.9.字典dict
     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

    1.10.其他改变
    * 移除了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

  • 相关阅读:
    vue参考---自建vue插件
    vue参考---vue指令
    vue参考---vue基本实例
    Install Package and Software
    解决Gradle DSL method not found: ‘android()’
    再见理想
    HttpClientUtil
    AtomicLong
    Fastjson反序列化泛型类型时候的一个问题
    Java获取泛型的Class对象
  • 原文地址:https://www.cnblogs.com/helloxwr/p/6503493.html
Copyright © 2011-2022 走看看