py2.7与py3区别(七)(7.1)(持续更新中)
py3较py2.7有些许改进。这里做简单的总结。另py在多线程方面不足,出现了pypy,设计了微线程予以弥补。
1)print后的内容,py2.7无需括号(添加括号也可以),py3必须加括号。
>>> print 'parentheses' parentheses >>> print ('parentheses') parentheses >>>
2)除法结果处理不同,py2.7对于正常的int类除法/,默认为地板除,即商只输出整数,如下例。
>>> 7/2 3 >>>
当被除数不能被整除时,若想商输出为小数,则需要引用另外的方法。form __future__ import division,如下例。
>>> from __future__ import division >>> 7/2 3.5 >>>
注意future前后都是两个下划线。
在py3中不必引用division,默认支持正常除法。
3)range和xrange函数,py2.7中这两个函数都存在,不同点在于range从执行开始即刻创建包含参数范围内所有需要迭代的内容项的列表。而xrange只在循环时才产生此 次循环所对应的序列号的内容。如下例。
print range(0,10) print xrange(0,10) print type(xrange(0,10)) for i in range(0,10): print 'rangeCycle = ',i for i in xrange(0,10): print 'Xrange = ',i >>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] xrange(10) <type 'xrange'> rangeCycle = 0 rangeCycle = 1 rangeCycle = 2 rangeCycle = 3 rangeCycle = 4 rangeCycle = 5 rangeCycle = 6 rangeCycle = 7 rangeCycle = 8 rangeCycle = 9 Xrange = 0 Xrange = 1 Xrange = 2 Xrange = 3 Xrange = 4 Xrange = 5 Xrange = 6 Xrange = 7 Xrange = 8 Xrange = 9 >>>
从例子中能够看出type(xrange())显示为<type 'xrange'>类型,xrange(0,10)返回xrange(10),而不是相对占用较多内存的列表。所以大大节省了内存。 这样在py3中仍然保留range()函数名但是等同于xrange()。在py3中无xrange()函数。
4)raw_input和input函数,py2.7中这两个函数都存在,不同点在于input函数输入需要描述输入类型,比如输入a,必须带引号表明输入的为字符串类型。如下例。
a = input('p input:') print a >>> p input:pu Traceback (most recent call last): File "C:/Python27/xrange.py", line 9, in <module> a = input('p input:') File "<string>", line 1, in <module> NameError: name 'pu' is not defined >>> >>> p input:'pu' pu >>>
py2.7中raw_input函数无此限制,但是输入的结果全部默认是字符串类型。输入数字,进行算数运算时必须先转换为数值类型。如下例。、
a = raw_input('p input:') print a,'***success eg' c = int(raw_input('p input num:')) b = c+3 print b,'**eg success' print '***###eg fail' c = raw_input('p input num:') b = c+3 print b >>> p input:1 1 ***success eg p input num:2 5 **eg success ***###eg fail p input num:3 Traceback (most recent call last): File "C:/Python27/inputtest.py", line 9, in <module> b = c+3 TypeError: cannot concatenate 'str' and 'int' objects >>>
py3中保留input函数名,功能等同于raw_input,可以随意输入不用区分类型,输出默认为字符串。
5)先来介绍一下编码的前世今生。最早只有asc码,0-255都对应一个字符,chr(97)转化为a,ord('a')转化为97.后来出现万国码,unicode,字符最少占用2字节,其 中汉字占用3字节。后来针对unicode对于英文的内存存储由原来一字节扩大到两字节,所以出现utf-8,英文占用一字节,汉字3字节。再后来为了汉语国家的需要产生 GBK码,从此汉字占用2个字节。utf8码与GBK码互转只要记住两种码是同级,根源在unicode,都是先解码为unicode然后再编码互转。助记:参数中不出现unicode。
py2.7默认使用asc码,py3默认使用utf-8编码。所以py2.7想输入输出汉字必须在py文件起始位置添加#-*- coding:utf-8 -*-。py3则不用。
另外encode函数也有所区别,下面是py2.7版本utf-8码转化为GBK码例子。因为本身py解释器存在问题,所以暂不显示程序结果。
#-*- coding:utf-8 -*- a = raw_input('请输入汉字:') a_uni=a.decode('utf-8') print a_uni resultGbk=a_uni.encode('gbk') print resultGbk
但是在py3中可以直接用encode转为GBK码无需中间调用解码函数。如下例。
#-*- coding:utf-8 -*- a = raw_input('请输入汉字:') resultGbk=a.encode('gbk') print resultGbk
注意:当输出为乱码时,一定先明确显示编码的格式是什么编码,比如在windows终端显示乱码,查看编码方式为gbk码,转成gbk码即可,若显示编码方式与编译器编码方式相同,显示乱码,那就是另外的原因了,待根据具体情况分析。
6)bytes函数,3.5有这种函数,将字符转成16进制的字节,比如utf-8汉字编码占用3个字节,那么bytes就转化为3个16进制的字节可以迭代的对象,用for in 输出显示为10进制数。将汉字转化为2进制的方法,见下例。
1 #! /usr/bin/env python 2 #-*- coding:utf8 -*- 3 a = '小亮' 4 for i in a: 5 print (i) 6 bytesList=bytes(i,encoding='utf-8')#转成16进制 7 print (type(bytesList)) 8 print (bytesList) 9 for j in bytesList:#for in 后面迭代对象输出为10进制 10 print (j) # 11 b =bin(j) #转成2进制 12 print (b) 13 14 >>> 15 RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python35-32/bytesname.py 16 小 17 <class 'bytes'> 18 b'\xe5\xb0\x8f' 19 229 20 0b11100101 21 176 22 0b10110000 23 143 24 0b10001111 25 亮 26 <class 'bytes'> 27 b'\xe4\xba\xae' 28 228 29 0b11100100 30 186 31 0b10111010 32 174 33 0b10101110 34 >>>
浙公网安备 33010602011771号