热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3和Python2的区别

一、print函数python2的print声明已经被print()函数取代了,这意味着我们必须包装我们想打印在小括号中的对象二、通过input()解析用户的输入pyth

一、print函数
python2 的 print 声明已经被 print() 函数取代了,这意味着我们必须包装我们想打印在小括号中的对象

二、通过input()解析用户的输入
  • python3中input得到的为str,python3中没有raw_input
  • Python2的input的到的为int型,Python2的raw_input得到的为str类型

三、整除
  • Python3中/表示真除,%表示取余,//表示地板除(结果取整)
  • Python2中/表示根据除数被除数小数点位得到结果,//同样表示地板除)

python2

1     from platform import python_version
2     print 'Python', python_version()
3     print '5 / 3 =', 5 / 3
4     print '3 // 2 =', 3 // 2
5     print '3 / 2.0 =', 3 / 2.0
6     print '3 // 2.0 =', 3 // 2.0

Python 2.7.10
5 / 3 = 1
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

python3

1     from platform import python_version
2     print('Python', python_version())
3     print('5 / 3 =', 5 / 3)
4     print('3 // 2 =', 3 // 2)
5     print('3 / 2.0 =', 3 / 2.0)
6     print('3 // 2.0 =', 3 // 2.0)

Python 3.6.0
5 / 3 = 1.6666666666666667
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

四、xrange模块
python2 : range( 0, 4 ) 结果 是 列表 [0,1,2,3 ]
python3改为:list( range(0,4) )
python2原 : xrange( 0, 4 ) 适用于 for 循环的变量控制

python3改为:range(0,4)

 

  • python3
    在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中xrange() 会抛出命名异常)。
  • python2
    在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式

    这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。由于它的惰性求值,如果你不仅仅遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。

五、字符串
原: 字符串以 8-bit 字符串存储
改为: 字符串以 16-bit Unicode 字符串存储

 

六、try except 语句的变化
在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。
捕获异常的语法由 except exc, var 改为 except exc as var。

使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。
    1. 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
    2. 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。
在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。

 

1     原: try:
2         ......
3       except Exception, e :
4         ......
5     改为
6       try:
7         ......
8       except Exception as e :
9         ......

 

七、打开文件
    原: file( ..... )
    或 open(.....)
    改为:
    只能用 open(.....)

 

八、bytes 数据类型 -- 新增
1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long
2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下:
1     >>> b = b'china'
2     >>> type(b)
3     'bytes'>
str对象和bytes对象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互转化
1     >>>s = b.decode()
2     >>> s
3     'china'
4     >>> b1 = s.encode()
5     >>> b1
6     b'china'
A bytes object is an immutable array. The items are 8-bit bytes, represented by integers in the range 0 <= x <256.
bytes 可以看成是“字节数组”对象,每个元素是 8-bit 的字节,取值范围 0~255。
由于在 python 3.0中字符串以 unicode 编码存储,当写入二进制文件时,字符串无法直接写入(或读取),必须以某种方式的编码为字节序列后,方可写入。

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

    例: s = "张三abc12"
    b = s.encode( 编码方式)
    # b 就是 bytes 类型的数据
    # 常用的编码方式为 : "uft-16" , "utf-8", "gbk", "gb2312", "ascii" , "latin1" 等
    # 注 : 当字符串不能编码为指定的“编码方式”时,会引发异常

 

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

1      s = "张三abc12"
2     b = s.encode( "gbk") # 字符串 s 编码为 gbk 格式的字节序列
3     s1 = b.decode("gbk") # 将字节序列 b以gbk格式 解码为字符串
4     # 说明,当字节序列不能以指定的编码格式解码时会引发异常

 

(三)使用方法举例

 1     #coding=gbk
 2     f = open("c:\\1234.txt", "wb")
 3     s = "张三李四abcd1234"
 4     # -------------------------------
 5     # 在 python2.4 中我们可以这样写:
 6     # f.write( s )
 7     # 但在 python 3.0中会引发异常
 8     # -------------------------------
 9     b = s.encode("gbk")
10     f.write( b )
11     f.close()
12     input("?")

 

读取该文件的例子:

 1     #coding=gbk
 2     f = open("c:\\1234.txt", "rb")
 3     f.seek(0,2) #定位至文件尾
 4     n = f.tell() #读取文件的字节数
 5     f.seek(0,0) #重新定位至文件开始处
 6     b = f.read( n )
 7     # ------------------------------
 8     # 在 python 2.4 中 b 是字符串类型
 9     # 而 python 3.0 中 b 是 bytes 类型
10     # 因此需要按指定的编码方式确码
11     # ------------------------------
12     s = b.decode("gbk")
13     print ( s )
14     # ------------------------------
15     # 在 python 2.4 中 可以写作 print s 或 print ( s )
16     # 要 python 3.0 中 必须写作 print ( s )
17     # ------------------------------
18     f.close()
19     input("?")

 

运行后应显示:
张三李四abcd1234

(四) python3中bytes序列,一但形成,其内容是不可变的
例:

1     s="ABCD"
2     b=s.encode("gbk")
3     print b[0] # 显示 65
4     b[0] = 66
5     # 执行该句,出现异常: 'bytes' object does not support item assignment

九、chr( K ) 与 ord( c )
ord()函数主要用来返回对应字符的ascii码,chr()主要用来表示ascii码对应的字符他的输入时数字,可以用十进制,也可以用十六进制
python 2.4.2以前
    chr( K ) 将编码K 转为字符,K的范围是 0 ~ 255
    ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 255
python 3.0
    chr( K ) 将编码K 转为字符,K的范围是 0 ~ 65535
    ord( c ) 取单个字符的编码, 返回值的范围: 0 ~ 65535

 

十、字节数组对象bytearray -- 新增

(一) 初始化

    a = bytearray( 10 )
    # a 是一个由十个字节组成的数组,其每个元素是一个字节,类型借用 int
    # 此时,每个元素初始值为 0

 

(二) 字节数组 是可变的

    a = bytearray( 10 )
    a[0] = 25
    # 可以用赋值语句更改其元素,但所赋的值必须在 0 ~ 255 之间

(三) 字节数组的切片仍是字节数组
(四) 字符串转化为字节数组

1     #coding=gbk
2     s ="你好"
3     b = s.encode( "gbk") # 先将字符串按某种“GBK”编码方式转化为 bytes
4     c = bytearray( b ) #再将 bytes 转化为 字节数组
5     # 也可以写作
6     c = bytearray( "你好", "gbk")
View Code

(五) 字节数组转化为字符串

1      c = bytearray( 4 )
2     c[0] = 65 ; c[1]=66; c[2]= 67; c[3]= 68
3     s = c.decode( "gbk" )
4     print ( s )
5     # 应显示: ABCD

(六) 字节数组可用于写入文本文件

 1     #coding=gbk
 2     f = open("c:\\1234.txt", "wb")
 3     s = "张三李四abcd1234"
 4     # -------------------------------
 5     # 在 python2.4 中我们可以这样写:
 6     # f.write( s )
 7     # 但在 python 3.0中会引发异常
 8     # -------------------------------
 9     b = s.encode("gbk")
10     f.write( b )
11     # 或者
12     c=bytearray( s,"gbk")
13     f.write( c )
14     f.close()
15     input("?")

 

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

 

十二、不等运算符
Python 2.x中不等于有两种写法 != 和 <>
Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯

 

十三、去掉了repr表达式``
Python 2.x 中反引号``相当于repr函数的作用
Python 3.x 中去掉了``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。

 

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

 

十五、map、filter 和 reduce
这三个函数号称是函数式编程的代表。在 Python3.x 和 Python2.x 中也有了很大的差异。
首先我们先简单的在 Python2.x 的交互下输入 map 和 filter,看到它们两者的类型是 built-in function(内置函数):

 

python2.x它们输出的结果类型都是列表
1     >>> map(lambda x:x *2, [1,2,3])
2     [2, 4, 6]
3     >>> filter(lambda x:x %2 ==0,range(10))
4     [0, 2, 4, 6, 8]
5     >>>
但是在Python 3.x中它们却不是这个样子了:
1     >>> map
2     <class 'map'>
3     >>> map(print,[1,2,3])
4     
5     >>> filter
6     <class 'filter'>
7     >>> filter(lambda x:x % 2 == 0, range(10))
8     
9     >>>

 

首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用 next 函数来进行手工迭代:
 1     >>> f =filter(lambda x:x %2 ==0, range(10))
 2     >>> next(f)
 3     0
 4     >>> next(f)
 5     2
 6     >>> next(f)
 7     4
 8     >>> next(f)
 9     6
10     >>>

 

对于比较高端的 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中
1     >>> import functools
2     >>> b = functools.reduce(lambda x, y: x + y, [1, 3, 4, 5])
3     >>> print(b)
4     13
5     >>>

 

十六、cmp()函数的新函数(gt,ge,eq,le,lt)
Python3中已经不能使用cmp()函数了,被如下五个函数替代:
1     import operator #首先要导入运算符模块
2     operator.gt(1,2) #意思是greater than(大于)
3     operator.ge(1,2) #意思是greater and equal(大于等于)
4     operator.eq(1,2) #意思是equal(等于)
5     operator.le(1,2) #意思是less and equal(小于等于)
6     operator.lt(1,2) #意思是less than(小于)

 

十七、sort,sorted
Sort函数是list列表中的函数,而sorted可以对list或者iterator进行排序。
Python3.x和Python2.x的sorted函数有点不太一样,少了cmp参数。下面本渣渣主要基于Python2.x的sorted函数进行讲解,Python3.x直接忽略cmp这个参数即可,为了保证代码通用性,不建议大家在今后的编程中使用cmp参数

下面我们使用help来查看他们的用法及功能:

 

python2:

1     >>> help(list.sort)
2     Help on method_descriptor:
3     sort(...)
4     L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
5     cmp(x, y) -> -1, 0, 1
6     >>> help(sorted)
7     Help on built-in function sorted in module __builtin__:
8     sorted(...)
9     sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

 

python3:

 1 >>> help(list.sort)
 2 Help on method_descriptor:
 3 sort(...)
 4   L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*
 5 >>> help(sorted)
 6 Help on built-in function sorted in module builtins:
 7 sorted(iterable, key=None, reverse=False)
 8   Return a new list containing all items from the iterable in ascending order.
 9   A custom key function can be supplied to customize the sort order, and the
10   reverse flag can be set to request the result in descending order.

 

用sort函数对列表排序时会影响列表本身,而sorted不会。两者用法差不多。

以sorted为例,sorted(iterable,cmp,key,reverse)

参数: 
- iterable可以是list或者iterator; 
- cmp是带两个参数的比较函数; 
- key 是带一个参数的函数; 
- reverse为False或者True;

 

举例说明:
(1)用cmp函数排序:

1     >>> list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
2     >>> sorted(list1,cmp = lambda x,y: cmp(x[0],y[0]))
3     [('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]
4     >>> sorted(list1,cmp = lambda x,y: cmp(x[1],y[1]))
5     [('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]

 

(2)用key函数排序:

1     >>> list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
2     >>> sorted(list1,key = lambda list1: list1[0])
3     [('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]
4     >>> sorted(list1,key = lambda list1: list1[1])
5     [('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]

 

(3)用reverse排序:

1  >>> sorted(list1,reverse = True)
2     [('sara', 80), ('mary', 90), ('lily', 95), ('david', 90)]

 

(4)用operator.itemgetter函数排序:

1     >>> from operator import itemgetter
2     >>> sorted(list1, key=itemgetter(1))
3     [('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]
4     >>> sorted(list1, key=itemgetter(0))
5     [('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]

 

介绍operator.itemgetter函数:
operator.itemgetter函数获取的不是值,而是定义了一个函数。该函数是C语言实现,比python速度快。

1     >>> import operator
2     >>> a = [1,2,3]
3     >>> b = operator.itemgetter(0)
4     >>> b(a)
5     1

 

(5)多级排序:

1         >>> sorted(list1, key=itemgetter(0,1))
2         [('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]

 


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
author-avatar
欣欣大妮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有