py2.7与py3区别(七)(7.1)(持续更新中)

py3较py2.7有些许改进。这里做简单的总结。另py在多线程方面不足,出现了pypy,设计了微线程予以弥补。

1)print后的内容,py2.7无需括号(添加括号也可以),py3必须加括号。    

>>> print 'parentheses'
parentheses
>>> print ('parentheses')
parentheses
>>> 
View Code_py2.7代码

2)除法结果处理不同,py2.7对于正常的int类除法/,默认为地板除,即商只输出整数,如下例。

>>> 7/2
3
>>>
View Code_py2.7代码

     当被除数不能被整除时,若想商输出为小数,则需要引用另外的方法。form __future__ import division,如下例。

>>> from __future__ import division
>>> 7/2
3.5
>>> 
View Code_py2.7代码

     注意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
>>> 
View Code_py2.7代码

     从例子中能够看出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
>>> 
View Code_py2.7代码

     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
>>> 
View Code_py2.7代码

    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
View Code

    但是在py3中可以直接用encode转为GBK码无需中间调用解码函数。如下例。

#-*- coding:utf-8 -*-
a = raw_input('请输入汉字:')
resultGbk=a.encode('gbk')
print resultGbk
View Code

    注意:当输出为乱码时,一定先明确显示编码的格式是什么编码,比如在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 >>> 
View Code

 

 

  

    

posted on 2016-05-14 13:45  lexn  阅读(367)  评论(0)    收藏  举报

导航