Python2.x vs Python3

>>> (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')
# 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对象,必定不可索引
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值