• python 3.x 与2.x的区别


    前言

      保持学习的态度,学一门动态语言其实是很早以前的就准备要做的事情,当时还在纠结python与ruby。现在不单单是要学python,还在考虑用它做点什么,这些等后续再说吧,因为看的是python2.x的书籍。用的是python 3.7.所以先把两者的区别记录一下,仅限于基础。

    python3.x 与2.x的区别

    1.print

    print语句没有了,取而代之的是print()函数。

    py 2.x:

    print "wyl" #语句
    print("wyl") 

    py 3.x:

    >> print("wyl")
    wyl
    >>> print 'wyl'
    SyntaxError: Missing parentheses in call to 'print'. Did you mean print('wyl')?

    2.Unicode

    Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。

    现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。

    由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的:

    py 2.x

    >>> str='王延领那小子真帅'
    >>> str
    'xe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8'

    py 3.x

    >>> str='王延领那小子真帅'
    >>> str
    '王延领那小子真帅'
    >>> 

     3.除法运算 

    Python中的除法有两个运算符,/和//

    首先来说/除法:

    在python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C#啊差不多,取整,把小数部分完全忽略掉。

    在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。

    py 2.x

    >>> 1/2
    0
    >>> 

    py 3.x

    >>> 1/2
    0.5
    >>>

    第二种//除法:

    这种除法叫做floor除法,py2.x与py3.x相同

     py2.x py3.x

    >>> 1//2
    0
    >>> 

    4.异常

    在 py3.x 中我们现在使用 as 作为关键词,而非‘,’

    所以异常都从 BaseException继承,并删除了StardardError 

    去除了异常类的序列行为和.message属性 

    用 raise Exception(args)代替 raise Exception, args语法 

    捕获异常的语法改变,引入了as关键字来标识异常实例

    py3.0:

    >>> try:
      1/0
    except Exception , err:
      print err
      
    SyntaxError: invalid syntax
    >>> 
    #正确的写法
    >>> try:
      1/0
    except Exception as err:
      print(err)
    
      
    division by zero
    >>> 

    5.xrange

    xrange() 改名为range(),要想使用range()获得一个list,必须显式调用: 

    py 2.x

    >>> range(1,10)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    py3.x

    >>> range(10)
    range(0, 10)
    >>> 

    py3.x 如果想使用range(),可以结合list

    >>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> 

     6.八进制

    python 八进制不能0开头而是以0o开头

    py 3.x

    >>> 0101
    SyntaxError: invalid token
    >>> 0o101
    65
    >>> 

    7.不等运算符

    不等运算py3.x只有“!=”,“<>”已被移除

    py3.x

    >>> 1!=3
    True
    >>> 1<>3
    SyntaxError: invalid syntax
    >>> 

    8.去掉了repr表达式``

    py3.x

    >>> s=`wyl`
    SyntaxError: invalid syntax
    >>> s='wyl'
    >>> repr(s)
    "'wyl'"

    9.多个模块被改名(根据PEP8)

    旧的名字新的名字
    _winreg winreg
    ConfigParser configparser
    copy_reg copyreg
    Queue queue
    SocketServer socketserver
    repr reprlib

    StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。

    Python 2.6已经支援新的io模组。

    httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。

    取消了exec语句,只剩下exec()函数。 Python 2.6已经支援exec()函数。

    10.数据类型

    py 3.x

    1>去掉了long

    2>新增了bytes类型,对应于2.X版本的八位串

    3>dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。

    11.面向对象

    1>引入抽象基类(Abstraact Base Classes,ABCs)

    2>容器类和迭代器类被ABCs化,所以cellections模块里的类型比Py2.x多了很多

    >>> import collections
    >>> print('
    '.join(dir(collections)))
    AsyncGenerator
    AsyncIterable
    AsyncIterator
    Awaitable
    ByteString
    Callable
    ChainMap
    Collection
    Container
    Coroutine
    Counter
    Generator
    Hashable
    ItemsView
    Iterable
    Iterator
    KeysView
    Mapping
    MappingView
    MutableMapping
    MutableSequence
    MutableSet
    OrderedDict
    Reversible
    Sequence
    Set
    Sized
    UserDict
    UserList
    UserString
    ValuesView
    _Link
    _OrderedDictItemsView
    _OrderedDictKeysView
    _OrderedDictValuesView
    __all__
    __builtins__
    __cached__
    __doc__
    __file__
    __loader__
    __name__
    __package__
    __path__
    __spec__
    _chain
    _collections_abc
    _count_elements
    _eq
    _heapq
    _iskeyword
    _itemgetter
    _nt_itemgetters
    _proxy
    _recursive_repr
    _repeat
    _starmap
    _sys
    abc
    defaultdict
    deque
    namedtuple
    >>> 
    View Code

    3>迭代器的next()方法改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法 

    4>增加了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便。

    12.模块

    1>移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。 

    2>移除了imageop模块 

    3>移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2,  rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块 

    4>移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取

    5>移除了new模块 

    6>os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下 

    7>tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是 tokenize.tokenize() 

  • 相关阅读:
    JavaScript 实现打印操作
    linux-centos7.6设置固定IP网络方法
    VMware网络配置三种网络模式(桥接、NAT、Host-only)
    SVN 执行cleanup报错:Cleanup failed to process the following paths
    word生成目录的pdf
    win10开机后将存在多个系统选择,改为直接进入系统无需选择
    Win10删除或是不显示快速访问中最近使用文件记录
    Dell T30解决报Alert! Cover was previously removed.
    WIN10安装.net报0x800F081F解决方法
    查看SVN当前登录用户
  • 原文地址:https://www.cnblogs.com/wyl1924/p/8279128.html
Copyright © 2020-2023  润新知