python3和python2的细节差异


类别:python基础   

发布时间:2019/07/03 15:05:57   更新时间:2020/07/31 19:51:12


python3和python2是有很多细节差异的!

这里进行个长期积累。——这篇文章,后续会不断补充。

 

* long类型,python2有,python3没有了。

 

* python3的keys()返回dict_keys,还要用list才能称为list。

 

* items()和iteritems()区别:

字典的items方法作用:是将字典中的所有项,以列表方式返回。

字典的iteritems方法作用:与items大致相同,只是它的返回值不是列表,而是一个迭代器。

在Python2.x中,iteritems() 用于返回本身字典列表操作后的迭代器,不占用额外的内存。

在Python 3.x 里面,iteritems()方法已经废除了。在3.x里用 items()替换iteritems() ,可以用于 for 来循环遍历。

 

* 对于一些字符,python2和python3的md5加密出来是不一样的.

# python2.7

pwd = "xxx" + chr(163) + "fj"

checkcode = hashlib.md5(pwd).hexdigest()

print checkcode # ea25a328180680aab82b2ef8c456b4ce

# python3.6

pwd = "xxx" + chr(163) + "fj"

checkcode = hashlib.md5(pwd.encode("utf-8")).hexdigest()

print(checkcode) # b517e074034d1913b706829a1b9d1b67

按代码差异来将,就是在python3中需要对字符串进行 encode 操作,如果没有则会报错

checkcode = hashlib.md5(pwd).hexdigest()

TypeError: Unicode-objects must be encoded before hashing

这是因为加密时需要将字符串转化为 bytes 类型,3默认编码是 utf-8 .所以我用utf-8进行解码.

 

* http标准库中,HTTPSConnection和HTTPConnection的参数的个数有变化,需要参考新的代码

一般在/usr/lib/python3.x/http

 

* python3的urllib结构变了,

原来的 urllib.urlencode

要写成 urllib.parse.urlencode

 

* Python3 字典 has_key() 被移除使用 in代替

 

* 字符串类型:

python2和python3中,一共有str、bytes、unicode、basestring。

其中basestring是一个基类。行为类似bytes,只是是可变的。

python2中,str和bytes一样,unicode要加’u’。

python3中,str和unicode一样(不需要加’u’了)。

python2中,从str对象获取的是字节序列(utf8编码),从unicode对象获取的是unicode字符。

python3中,从str对象获取的是unicode字符。

 

* 关于django __str__ 与 __unicode__ 问题同上类似

 

* 关于map、zip等函数:

python2返回的直接是list。

python3返回的是迭代器。

python3中,list(map(xxx))是list。

 

 


本文网址:https://www.pyfield.com/blog/?id=14