Python2.x与Python3​​.x版本区别

本文总结了Python2.x与Python3.x的主要区别,包括:1)整型除法变化;2)字符串与字节处理;3)默认编码差异;4)新增关键字与函数;5)输入输出、异常处理、字典方法的更新,以及一些模块和类的变动。了解这些差异能帮助避免版本切换时的编译错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       学习了一段时间的python,经常在python3.5上实战一些python2.x编写的代码,导致各种报错,然后各种寻找错误解决方法。经过几次错误(1. python3中print为一个函数,必须用括号()括起来 2.输入问题上python3用input,python2用raw_input 3.python3-range()而python2-xrange() 4. import sys reload(sys)报错,python3不存在reload)点醒,终于觉得应该将Python2.x与Python3​​.x版本区别整理出来,避免以后再在版本差异导致编译错误问题上花费大量的时间和经历,并以此分享给学习python的小伙伴们。

      1. 原来python2中1/2(两个整数相除)结果是0,现在python3.5是0.5了,整型除法/返回浮点数,要得到整型结果,则使用//取整;

      2. python3.5增加了对 bytes 和 原生 unicode字符串的支持, 删除了 unicode 对象, str 为原生 unicode 字符串, bytes 替代了之前的 str 这个是最核心的;

      3.python2 默认编码是asscii(8-bit 字符串),python3默认采用utf-8(16-bit Unicode 字符串存储)作为默认编码,因此不需要在文件顶部写#coding=utf-8了;

     (一)字符串编码(encode) 为 bytes

        例:   s = "张三abc12"

               b = s.encode( 编码方式)# b 就是 bytes 类型的数据

                                                     # 常用的编码方式为 : "uft-16"    , "utf-8", "gbk", "gb2312", "ascii" , "latin1" 等

                                                     # 注 : 当字符串不能编码为指定的“编码方式”时,会引发异常

     (二) bytes 解码(decode)为字符串

               s = "张三abc12"

               b = s.encode( "gbk")    # 字符串 s 编码为 gbk 格式的字节序列

              s1 = b.decode("gbk")   # 将字节序列 b以gbk格式 解码为字符串

             # 说明,当字节序列不能以指定的编码格式解码时会引发异常

     (三) chr( K ) 与 ord( c )

             chr( K )   将编码K 转为字符,K的范围是 0 ~ 65535

             ord( c )   取单个字符的编码, 返回值的范围: 0 ~ 65535

      4.关键词加入as 和with,还有True,False,None;

      5.去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数;

      6.输入函数改变了,删除了raw_input,用input代替;

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

      8. bytes对象不能hash,也不支持 b.lower()、b.strip()和b.split()方法,但对于后两者可以使用 b.strip(b’ 
\n\t\r \f’)和b.split(b’ ‘)来达到相同目的;    

      9.zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload()函数都被去除了;现在可以使用hasattr()来替换 callable(). hasattr()的语法如:hasattr(string, '__name__')

      10.string.letters和相关的.lowercase和.uppercase被去除,改用string.ascii_letters 等 ;

      11.如果x < y的不能比较,抛出TypeError异常。2.x版本是返回伪随机布尔值的 ;

      12.__getslice__系列成员被废弃。a[i:j]根据上下文转换为a.__getitem__(slice(I, j))或 __setitem__和  __delitem__调用

      13.file类被废弃,在python3.5中NameError: name 'file' is not defined。打开文件只能用open(...)

      14.python3.5去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long;

      15.python3.5,新增了bytes类型,str对象和bytes对象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互转化;

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

      17.python3.5所以异常都从 BaseException继承,并删除了StardardError;

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

      19.python3.5用 raise Exception(args)代替 raise Exception, args语法;

      20.python3.5捕获异常的语法改变,引入了as关键字来标识异常实例,try:...except Exception as e:替代try:...except Exception,e;

      21.移除了cPickle模块,可以使用pickle模块代替。移除了imageop模块,移除了audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块,移除了new模块;

      22.os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下;tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是 tokenize.tokenize() ;

      23.,“import  thread”问题,2.x中的模块thread在3.x中编程"_thread"(需要在前面加一个下划线).否则会出现“ImportError: No module named thread;

      24.多个模块被改名

                   旧的名字          新的名字

                   _winreg              winreg

                  ConfigParser      configparser

                  copy_reg            copyreg

                  Queue                queue

                  SocketServer     socketserver

                  repr                    reprlib

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值