1. 程式人生 > >python2 和 python3 區別集錦

python2 和 python3 區別集錦

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')]