python2 和 python3 區別集錦
阿新 • • 發佈:2019-01-06
python 遇到的坑:
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
-
1.
sorted(recommend_dict[u].items(), lambda x, y: cmp(x[1], y[1]), reverse=True) # python2
sorted(recommend_dict[u].items(), key = lambda x:x[1], reverse=True) # python3
-
2.
'dict_keys' object has no attribute 'sort'
d = {'a': 1}
d.keys() # dict_keys(['a'])
d.items() # dict_items([('a', 1)])
d.values() # dict_values([1])
k = d.keys(); k.sort() # AttributeError: 'dict_keys' object has no attribute 'sort'
dict的方法dict.keys(),dict.items(),dict.values()不會再返回列表,而是返回一個易讀的“views”。這樣一來,像這樣的語法將不再有用了:k = d.keys();k.sort(),你可以使用k = sorted(d)來代替。sorted(d)在Python2.5及以後的版本中也有用,但是Python3效率更高了。
map()和filter()將返回iterators。如果你真的想要得到列表,list(map(…))是一個快速的方法,但是更好的方法是使用列表推導(尤其是原始碼使用了lambda表示式的時候),或者重寫原來的程式碼,改為不需要使用列表。特別是map()會給函式帶來副作用,正確的方法是改為使用for迴圈,因為建立一個列表是非常浪費的事情。
3.
saver = tf.train.Saver(self.b.values() + self.W.values())
TypeError: unsupported operand type(s) for +: ‘dict_values’ and ‘dict_values’
修改如下:
saver = tf.train.Saver(list(self.b.values()) + list(self.W.values()))
4.
print >> fout, “Epoch : %d loss : %.3f” % (epochs, loss)
TypeError: unsupported operand type (s) for >>: ‘builtin_function_or_method’ and ‘_io.TextIOWrapper’
修改如下:
print("Epoch : %d loss : %.3f" % (epochs, loss), file=fout)
5.
import random
outcomes = {'heads':0, 'tails':0}
sides = outcomes.keys()
print(sides[0])
會產生錯誤:TypeError: ‘dict_keys’ object does not support indexing
這是由於python3改變了dict.keys,返回的是dict_keys物件,支援iterable
但不支援indexable,我們可以將其明確的轉化成list:
import random
outcomes = {'heads':0, 'tails':0}
sides = list(outcomes.keys())
print(sides[0]) # 輸出tails
6.
在Python2中map函式會返回一個list列表,如程式碼:
>>> def f(x, y): return (x, y)
>>> l1 = [ 0, 1, 2, 3, 4, 5, 6 ]
>>> l2 = [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ]
>>> map(f, l1, l2)
[(0, 'Sun'), (1, 'Mon'), (2, 'Tue'), (3, 'Wed'), (4, 'Thu'), (5, 'Fri'), (6, 'Sat')]
但是,在Python3中返回結果如下:
>>> map(f1, l1, l2)
<map object at 0x00000000021DA860>
如果想要得到Python2的那種結果,即返回list列表,那麼必須用list作用於map,如下:
>>> list(map(f1, l1, l2))
[(0, 'Sun'), (1, 'Mon'), (2, 'Tue'), (3, 'Wed'), (4, 'Thu'), (5, 'Fri'), (6, 'Sat')]