一、chardet模块:检查编码格式(外)
python2和python3的切换难免会碰到一些问题,有些方法比如re模块的findall()要求传入的是字符串格式的参数,urllib.request.urlope
n(url).read()返回的是bytes类型(这个是python3中才有的类型,所以很多python2中的方法都相应更改了)的,这样传参就会报以上错误。
python3中Unicode字符串是默认格式(就是str类型),ASCII编码的字符串(就是bytes类型,bytes类型是包含字节值,其实不算是字符串)
一劳永逸的解决方法就是根据你传进来的参数自动辨别编码格式,然后进行相应的解码:
import chardet #需要导入这个模块,检测编码格式
encode_type = chardet.detect(html)
html = html.decode(encode_type['encoding']) #进行相应解码,赋给原标识符(变量)
从str到bytes:调用方法encode().
编码是把Unicode字符串以各种方式编码成为机器能读懂的ASCII字符串
从bytes到str:调用方法decode().
1.凡是可作用于for循环的对象都是Iterable类型(迭代对象)
(1)一类是generator,包括生成器和带yield的generator的function均是
(2)一类是集合数据类型:list 、tuple 、dict 、set 、 str等
2.凡是可作用于next()函数,通过调用其不断返回下一个值的对象都是Iterator类型(迭代器):
(1)一类generator,包括生成器和带yield的generator的function均是
(2)一类是把list 、tuple 、dict 、set 、 str等Iterable使用iter()函数变成Iterator对象
注:生成器
(1)generator中保存的不是具体的元素,而是一种算法,一种无限大的数据流,通过next可以不断调用输出下面的值,直到输出StopIteration的错误
(2)生成器的创建方法有二:1是直接在列表生成式外边将[ ]改成();2.是在函数定义中包含yield关键字
>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance((x for x in range(10)),Iterable)
True
>>> isinstance(100,Iterable)
False
三、enumerate函数:可以将一个list变成索引-元素对,从而可以在for循环中同时迭代索引和元素本身(内)
>>> for i,value in enumerate(['A','B','C']):
print(i,value)
0 A
1 B
2 C
暂时更新这么多,日后有用到需更 。