>>> (1+3)/2
2.0
>>> type((1+3)/2)
float
整数相除的类型
这一点区别要尤其注意。尤其将整数相除的结果作为数组的索引时,会有莫名其妙
的意外发生。
# python 2.7
>>> type(4/2)
int
>>> 10/3
3
# python 3
>>> type(4/2)
float
>>> 10/3
3.3333333333333335
>>> 4/2
2.0
也即是python3中,默认除法运算/
会转换为float类型,使用//
用法同各编程语言(C、Python2.7)的处理,也避免了类型转换的步骤:
# python 3
>>> 5/2
2.5
>>> 5//2
2
python3更强调使用迭代器类型
比如python2中:
zip()返回的是list;
map()返回的也是list;
一个字典的items()成员返回的也是list;
range()得到的也是一个数组;
。。。
这些在python3中都转化为对应的对象类型,仅用于迭代和遍历(也即轻易地进行类型转换),这会带来效率的提升,也是python所推荐的做法。
# python 2
>>> range(5)
[0, 1, 2, 3, 4]
>>> xrange(5)
xrange(5)
>>> a = (1, 2, 3)
>>> b = ('a', 'b', 'c')
>>> zip(a, b)
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> fruits = ('apple', 'banana', 'orange')
>>> dict.fromkeys(fruits, 10.5).items()
[('orange', 10.5), ('apple', 10.5), ('banana', 10.5)]
>>> map(float, ['1', '2'])
[1.0, 2.0]
>>> map(float, ('1', '2'))
[1.0, 2.0]
# python 3
>>> range(5) # 基本等价于python 2中的xrange(5)
range(0, 5)
>>> a = (1, 2, 3)
>>> b = ('a', 'b', 'c')
>>> zip(a, b)
<zip at 0x2955f30>
>>> fruits = ('apple', 'banana', 'orange')
>>> dict.fromkeys(fruits, 10.5).items()
dict_items([('orange', 10.5), ('banana', 10.5), ('apple', 10.5)])
>>> type(dict.fromkeys(fruits, 10.5).items())
dict_items
>>> map(float, ['1', '2'])
<map at 0x2b66170>
>>> type(map(float, ['1', '2']))
map
>>> list(map(float, ['1', '2']))
[1.0, 2.0]
pickle
# Python2.7
with gzip.open('./mnist.pkl.gz') as fp:
train_set, valid_set, test_set = cPickle.load(fp)
# Python3
with gzip.open('./mnist.pkl.gz') as fp:
train_set, valid_set, test_set = pickle.load(fp, encoding='latin1')
print >> sys.stderr
# python 2
print >> sys.stderr, 'spam'
python3不再支持这一语法,可以采用一种相兼容的可读性较好的做法,如下所示:
from __future__ import print_function
def warning(*objs):
print('WARNING: ', *objs, sys.stderr)
xrange range
# python 2.7
>>> xrange(5)
xrange(5)
>>> range(5)
[0, 1, 2, 3, 4]
# python 3
>>> xrange(5)
NameError: name 'xrange' is not defined
>>> range(5)
range(0, 5)
可以看到python2.7中的xrange()
功能上等价于python3中的range()
zip
python2.7中的zip(x, y)返回的是list,自然可以索引。
python3中的zip(x, y)返回的是zip对象,自然不可以索引。
# for Python2.7
>>> l1 = xrange(1, 27)
>>> l2 = [chr(i) for i in xrange(97, 123)]
>>> type(zip(l1, l2))
list
>>> zip(l1, l2)
[(1, 'a'),
(2, 'b'),
(3, 'c'),
(4, 'd'),
...
(23, 'w'),
(24, 'x'),
(25, 'y'),
(26, 'z')]
# for Python3.4
>>> l1 = range(1, 27)
>>> l2 = [chr(i) for i in range(97, 123)]
>>> type(zip(l1, l2))
zip
>>> zip(l1, l2)
<zip at 0x2d33378> # 是一个zip对象,必定不可索引