由于 bitcoin 项目的测试脚本都是用的python3.5, 之前只熟悉2.7, 记录一些2.7跟3.5的差异
print函数
3.5 版本的 print
必须加括号 print()
, 2.7版本 可加可不加
#py2.7
print "shooter", 2017; print("shooter", 2017)
#py3.5
print("shooter", 2017)
除法运算
//
/
计算结果不同
#py2.7
10/3 # 3
10//3 # 3
#py3.5
10/3 # 3.3333333333333335
10//3 # 3
Unicode
#py2.7
print('strings are now utf-8 \u03BCnico\u0394é!')
# strings are now utf-8 \u03BCnico\u0394é!
#py3.5
print('strings are now utf-8 \u03BCnico\u0394é!')
# strings are now utf-8 μnicoΔé!
xrange
py3.5 已经没有xrange, 而且range添加了一些新功能
#py2.7
range # <built-in function range>
xrange(1) # xrange(1)
#py3.5
range # <class 'range'>
xrange(1) # NameError: name 'xrange' is not defined
Exceptions 语法
#py2.7
raise IOError, "file error"
#####
try:
let_us_cause_a_NameError
except NameError, err:
print err, '--> our error message'
#py 3.5
raise IOError("file error")
#####
try:
let_us_cause_a_NameError
except NameError as err:
print(err, '--> our error message')
next
#py2.7
my_generator = (letter for letter in 'abcdefg')
next(my_generator)
my_generator.next()
#py3.5
my_generator = (letter for letter in 'abcdefg')
next(my_generator)
my_generator.next() # 报错
For 循环变量和全局命名空间泄漏
在 Python 3.x 中 for 循环变量不会再导致命名空间泄漏
#py2.7
i = 1
print 'before: i =', i
print 'comprehension: ', [i for i in range(5)]
print 'after: i =', i
#before: i = 1
#comprehension: [0, 1, 2, 3, 4]
#after: i = 4
#py3.5
i = 1
print('before: i =', i)
print('comprehension:', [i for i in range(5)])
print('after: i =', i)
#before: i = 1
#comprehension: [0, 1, 2, 3, 4]
#after: i = 1
返回可迭代对象,而不是列表
#py2.7
print range(3)
print type(range(3))
# [0, 1, 2]
# <type 'list'>
#py3.5
print(range(3))
print(type(range(3)))
print(list(range(3)))
# range(0, 3)
# <class 'range'>
# [0, 1, 2]
在 Python 3 中一些经常使用到的不再返回列表的函数和方法:
zip()
map()
filter()
dictionary's .keys() method
dictionary's .values() method
dictionary's .items() method
参考: