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

猜你喜欢

转载自blog.csdn.net/Dooonald/article/details/80890780