Python常用内建模块——学习笔记
- 格式:docx
- 大小:30.45 KB
- 文档页数:8
1、简单的创建文件夹 在Python的os模块中存在两个函数:mkdir()和makedirs(),其中mkdir()只能在已经存在的目录中创建文件夹;makedirs()可以在不存在的目录中创建文件夹。 例如: import os os.mkdir("E:\\python \\tt") #若E:\\python存在,则tt创建成功,反之失败 又如: import os os.makedirs("E:\\tt\\tt1") #若tt文件夹不存在,则先创建tt文件夹,再创建tt1文件夹,系统不会报错。 这是批量创建文件夹: import os base='E:\\' i=1 for j in range(3): file_name=base+str(j) os.mkdir(file_name)
import os base='E:\\' a=['a','b','c','d','e'] for i in a: file_name=base+str(i) os.mkdir(file_name)
2、创建多页的链接 #方法3,输出来直接是字符串 start_urls = ['http://www.ximalaya.com/dq/all/{}'.format(num) for num in range(1, 5)] for start_url in start_urls: print(type(start_url))
#方法1,使用这种,方法2生成的为列表,一般是需要字符串 for n in range(1, 3): base_url = 'https://www.doutula.com/article/list/?page={}' # 页面总数为2页,需要自己先从网页判断,也可以从页面抓取,后续可以完善 url = base_url.format(n) #方法2 url2 = 'https://www.doutula.com/article/list/?page=' links = [] for n in range(1, 41): # 页面总数为40页,需要自己先从网页判断,也可以从页面抓取,后续可以完善 link = url2 + str(n) links.append(link) enumerate() 如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写: list1 = ["这", "是", "一个", "测试"] for i in range (len(list1)): print(i ,list1[i]) 上述方法有些累赘,利用enumerate()会更加直接和优美: list1 = ["这", "是", "一个", "测试"] for index, item in enumerate(list1): print(index, item) 0 这 1 是 2 一个 3 测试 enumerate还可以接收第二个参数,用于指定索引起始值,如: list1 = ["这", "是", "一个", "测试"] for index, item in enumerate(list1, 1): print(index, item) 1 这 2 是 3 一个 4 测试
python常用模块详解
Python是一种高级编程语言,它提供了大量的标准库和第三方库,可以让我们轻松地完成各种任务。
在Python中,模块是一种可重用的代码段,它可以提供一些有用的功能、类或变量。
Python中有很多常用的模块,本文将详细介绍其中几个常用模块:
1. datetime模块:用于处理日期和时间,它提供了各种函数和类来操作日期和时间。
例如,可以使用datetime类来表示日期和时间,使用timedelta类来表示时间差等。
2. math模块:提供了数学计算相关的函数和常量。
例如,可以使用math.pi来获取圆周率,使用math.sqrt()来计算平方根等。
3. random模块:用于生成随机数。
例如,可以使用random()函数来生成一个0到1之间的随机数,使用randrange()函数来生成一个指定范围内的随机整数等。
4. os模块:提供了与操作系统交互的函数。
例如,可以使用os.listdir()函数来列出一个目录中的所有文件和子目录,使用os.path.join()函数来连接路径等。
5. re模块:提供了正则表达式相关的函数。
例如,可以使用pile()函数来编译正则表达式,使用re.match()函数来匹配字符串等。
以上是Python中常用的几个模块,当然还有很多其他的模块,可以根据具体需求进行选择。
使用这些模块可以让我们更加高效地完成各种任务,提高编程效率。
Python学习-之ABC模块abc模块是AbsructBaseClass的缩写概念:可以把抽象基类当作java⾥⾯的接⼝,在java⾥⽆法实现多继承,但是可以实现多接⼝,接⼝是不能⽤来实例化的,Python⾥⾯的抽象基类也是不能实例化的,python中变量只是⼀个符号,可以指向任意⼀个类型的对象,从语⾔层⾯来讲python就是⼀个可以多态的语⾔# 抽象基类有啥⽤呢?# 1 我们在某些情况下希望判定某个对象的类型# 2 我们需要强制某个⼦类必须实现某些⽅法,例如:hasattr 判断某⼀个类是否有某种属性isinstance 判断某⼀个类是否有实际使⽤抽象基类的情况很少,更多的是使⽤多继承的⽅式#这样实现⼀个抽象基类不会在初始化的时候检查⼦类会不会实现它的⽅法class CacheBase():def get(self, key):raise NotImplementedErrordef set(self, kye, value):raise NotImplementedErrorclass RedisCache(CacheBase): #如果不实现基类的⽅法的话在 ’运⾏时‘ 会默认抛出异常pass#可以import abc ’初始化时‘ 会抛出异常,强制⼦类来实现它的⽅法import abcclass CacheBase(metaclass=abc.ABCMeta):@abc.abstractmethoddef get(self, key):raise NotImplementedError@abc.abstractmethoddef set(self, kye, value):raise NotImplementedErrorclass RedisCache(CacheBase): #如果不实现基类的⽅法的话 ’初始化时‘ 会默认抛出异常pass。
1、模块和包a.定义:模块用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py 结尾的python文件。
(例如:文件名:test.py,对应的模块名:test)包:用来从逻辑上组织模块的,本质就是一个目录(必须带有一个__init__.py的文件)b.导入方法import module_nameimport module_1的本质:是将module_1解释了一遍也就是将module_1中的所有代码复制给了module_1from module_name1 import name本质是将module_name1中的name变量放到当前程序中运行一遍所以调用的时候直接print(name)就可以打印出name变量的值代码例子:自己写的模块,其他程序调用,如下所示:模块module_1.py代码:复制代码1 name = "dean"2 def say_hello():3 print("hello %s" %name)调用模块的python程序main代码如下:(切记调用模块的时候只需要import模块名不需要加.py)import module_1#调用变量print(module_)#调用模块中的方法module_1.say_hello()复制代码这样运行main程序后的结果如下:1 D:\python35\python.exe D:/python培训/s14/day5/module_test/main.py2 dean3 hello dean45 Process finished with exit code 0import module_name1,module_name2from module_name import *(这种方法不建议使用)from module_name import logger as log(别名的方法)c.导入模块的本质就是把python文件解释一遍import module_name---->module_name.py---->module_name.py的路径---->sys.path导入包的本质就是执行该包下面的__init__.py关于导入包的一个代码例子:新建一个package_test包,并在该包下面建立一个test1.py的python程序,在package包的同级目录建立一个p_test.py的程序test1的代码如下:1 def test():2 print("int the test1")package_test包下的__init__.py的代码如下:1 #import test1 (理论上这样就可以但是在pycharm下测试必须用下面from .import test1)2 from . import test13 print("in the init")p_test的代码如下:1 import package_test #执行__init__.py2 package_test.test1.test()这样运行p_test的结果:1 D:\python35\python.exe D:/python培训/s14/day5/p_test.py2 in the init3 int the test145 Process finished with exit code 0从上述的例子中也可以看出:导入包的时候其实是执行包下的__init__.py程序,所以如果想要调用包下面的python程序需要在包下的__init__.py导入包下面的程序2、模块的分类a.标准库b.开源模块c.自动以模块3、时间模块time与datetimepython中常见的时间表示方法:a. 时间戳时间戳:从1970年1月1日00:00:00到现在为止一共的时间数(单位为秒)>>> time.time()1472016249.393169>>>b. 格式化的时间字符串c. struct_time(元组)相互之间的转换关系如下:1)time.localtime()将时间戳转换为当前时间的元组>>> time.localtime()time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=27, tm_sec=55, tm_wday=2, tm_yday=237, tm_isdst=0)>>>2)time.gmtime()将时间戳转换为当前时间utc时间的元组>>> time.gmtime()time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=5, tm_min=35, tm_sec=43, tm_wday=2, tm_yday=237, tm_isdst=0)>>>3)time.mktime()可以将struct_time转换成时间戳>>> x = time.localtime()>>> xtime.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=39, tm_sec=42, tm_wday=2, tm_yday=237, tm_isdst=0)>>> time.mktime(x)1472017182.0>>>4)将struct_time装换成格式化的时间字符串>>> xtime.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=39, tm_sec=42,tm_wday=2, tm_yday=237, tm_isdst=0)>>> time.strftime("%Y-%m-%d %H:%M:%S",x)'2016-08-24 13:39:42'>>>5)可以将格式化的时间字符串转换为struct_time>>> time.strptime("2016-08-24 14:05:32","%Y-%m-%d %H:%M:%S")time.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=14, tm_min=5, tm_sec=32, tm_wday=2, tm_yday=237, tm_isdst=-1)>>>6)将struct_time转换成Wed Aug 24 14:22:47 2016这种格式>>> xtime.struct_time(tm_year=2016, tm_mon=8, tm_mday=24, tm_hour=14, tm_min=22, tm_sec=47, tm_wday=2, tm_yday=237, tm_isdst=0)>>> time.asctime(x)'Wed Aug 24 14:22:47 2016'>>>7)将时间戳装换成Wed Aug 24 14:22:47 2016格式>>> x = time.time()>>> x1472019984.958831>>> time.ctime(x)'Wed Aug 24 14:26:24 2016'>>>复制代码1 %a 本地(locale)简化星期名称2 %A 本地完整星期名称3 %b 本地简化月份名称4 %B 本地完整月份名称5 %c 本地相应的日期和时间表示6 %d 一个月中的第几天(01 - 31)7 %H 一天中的第几个小时(24小时制,00 - 23)8 %I 第几个小时(12小时制,01 - 12)9 %j 一年中的第几天(001 - 366)10 %m 月份(01 - 12)11 %M 分钟数(00 - 59)12 %p 本地am或者pm的相应符13 %S 秒(01 - 61)14 %U 一年中的星期数。
第一章. Python基本用法 (3)1.数据类型 (3)1.1.Python数据类型:[一切皆对象] (3)1.2 数据结构 (3)1.2.1 列表 (3)1.2.2 元组 (4)1.2.3 集合 (4)1.2.4 字典 (4)1.3 控制语句 (5)1.3.1 条件语句 (5)1.3.2循环语句 (5)1.3.3 其他语句 (6)1.3.4 异常处理 (6)1.4 python数据分析基础 (6)1.4.1 函数 (6)1.4.2 json文件解析 (7)1.4.3 字符串处理 (7)1.4.3.1字符串格式化 (7)1.4.3.2 字符串方法 (8)1.5 高级函数 (8)mbda函数(匿名函数) (8)1.5.2 Map函数 (9)1.5.3 reduce函数(python3 需要引入第三方库) (9)1.5.4 filter函数 (10)第二章. 数据分析常用库 (10)2.1 Numpy (10)2.1.1 数组的创建 (10)2.1.2 索引和切片 (11)2.1.3 数组形状改变 (12)2.1.4 数组的ufunc广播机制 (13)2.1.5 搜索与排序 (14)2.1.6 Numpy文件读写 (14)2.1.6.1 文件的读取 (14)2.1.6.2 文件存储 (15)2.1.7 字符串操作(char模块) (15)2.1.8 Numpy统计计算 (15)2.1.8.1 Numpy随机数生成 (16)2.1.8.2 Numpy统计相关函数 (16)2.1.8.3 Numpy线性代数 (17)2.2 Pandas (18)2.2.1 Pandas基础操作 (18)2.2.1.1 Pandas常用数据结构 (18)2.2.1.2 数据获取和保存 (19)2.2.1.3 数据筛选 (20)2.2.2 Pandas高级操作 (20)2.2.2.1 数据库数据读取和保存 (20)2.2.2.2 数据整合 (21)2.2.2.3 层次化索引 (21)2.2.3 分组聚合和透视图 (22)2.2.3.1 数据排序 (22)2.2.3.2 分组聚合 (22)2.2.3.3 透视图和交叉表 (23)第一章.Python基本用法1.数据类型1.1.Python数据类型:[一切皆对象]整数[ int ]、浮点型[ float ]、复数、常量、布尔值、字符串[不可更改]、数据类型转换A = 3; type(A) 结果为:int type()可以查看变量的数据类型12 // 5 = 2;→整除‘a’is ‘a’ → truenot 相当于java中的非s = ‘我是python’;s[3:5] → pytNone(空值) inf(无穷) nan(非数值)1.2 数据结构列表:是一种不同数据类型元素的有序集合【类似于java中的ArrayList】元组:元组是一种有序列表,但元组中的变量不能改变集合:集合是一系列无序的、不重复的组合体字典:存放无序的键/值(key/value)映射类型数据的容器1.2.1 列表列表的创建:A = [1,2,3,4,5];A = list(‘asdfg’); 相当于A = [’a’,’s’,’d’,’f’,’g’];del a[1] 或del a1.2.2 元组元组的创建:a_tuple = (1,2,3,4);b_tuple = tuple([1,2,3,4]);元组中的数据不允许修改元组相加跟列表是一样的,都是就将数据进行拼接【相乘也类似】1.2.3 集合集合是无序的集合的创建:a_set = {1,2,3,4,4,5}; out:{1,2,3,4,5}b_set = {1,5,6,7,7,8}; out:{1,5,6,7,8}集合的交并差:【下面a_set 和b_set均为集合】a_set – b_set 结果为a_set和b_set的差集a_set | b_set 结果为a_set和b_set的并集a_set & b_set 结果为a_set和b_set的交集a_set < b_set 判断a_set是否是b_set的子集,是返回true,否返回false a_set ^ b_set 返回没有出现在a_set和b_set公共部分的集合1.2.4 字典字典的创建:dict_1 = {‘name’:’xiaoming’, ‘age’ : ‘35’};dict_2 = dict(name=’xiaoming’, age = ‘35’);添加键值对:dict_1[‘city’] = ‘hunan’;删除键值对:del dict_1[‘city’];遍历字典:for key in dict_1.keys():print(dict_1[key]);1.3 控制语句1.3.1 条件语句语法结构:if 条件表达式1:执行语句1elif 条件表达式2:执行语句2elif 条件表达式3:执行语句3else:条件语句41.3.2循环语句for循环示例:for letter in ‘Python’ :print(letter);while循环示例:count = 0;while count < 10 :count += 1; python中没有自增运算print(count);1.3.3 其他语句在python循环语句中,复杂的条件可能会嵌套break,continue或者passbreak用于终止整个循环语句continue用于跳出当前循环,并且执行下一次循环pass语句用于占位,不做任何操作,保持结构的完整性(啥也不干,感觉更不写是一样的,无意义)列表推导式用于构建新的数据序列 a = [ x ** 2 for x in range(5)] out:a [0,1,4,9,16]1.3.4 异常处理示例:a = [6, 7, 9, -6, 5, 4, ‘one’];total = 0;for i in a:try:total += I;except:pass;输出total:251.4 python数据分析基础1.4.1 函数定义:将一些语句集合在一起,使其能够反复在程序中运行意义:提高编程效率,避免大量重复工作自定义函数:def function(par1, par2, …) :suite函数主体return expression;函数参数的赋值情况:情况1:[位置参数]def fun1(a , b, c):return (b**2, c**2, a**2);fun1(1,2,3);out: (4, 9, 1)情况2:[关键字参数]print(fun1(c = 1, b = 2, a = 1));out: (4, 1, 9)默认参数的使用:def fun2(a, b = 1):return a+b;fun2(10) out: 11fun2(10, 2) out: 121.4.2 json文件解析解析json文件:import json;#将文件打开并存入f中with open('E:\code\Jupyter_Notebook\data/test.json',encoding = 'utf-8', mode = 'r') as f :#将f文件中的内容读取出来f_read = f.read();#print(f_read);#将字符串转为json数据格式(list或dict)data = json.loads(f_read);#读取json数据中的特定数据json_data = data[0]['productTypeDtos']将json格式数据存入文件:#新建一个可以写入的文件记为twith open('E:\code\Jupyter_Notebook\data/a.json','w') as t:#将json_data写入文件t中json.dump(json_data, t, indent = 0);t.close();1.4.3 字符串处理1.4.3.1字符串格式化对字符串占位:p rint(‘我今年%s岁’ % 40);out:我今年40岁占位并保留小数:print(‘报销款:%.2f’ % 124.12458); out:报销款:124.12 科学计数法:print(‘报销款:%.2e’ % 124.12458); out: 报销款:1.24e+02 多个字符串占位:print("我今年%s岁,目前薪水%s" %(22,'无'));out: 我今年22岁,目前薪水无另一种方式:print("我今年{:.2f}岁,目前薪水{}".format(30,’2万’));out: 我今年30.00岁,目前薪水2万1.4.3.2 字符串方法1.5 高级函数mbda函数(匿名函数)lambda 参数。
一:range()与xrange()的比较: 在 Python 中,range 和 xrange 均可以用来做迭代的范围,不过 range 返回的是 list,而 xrange 则返回一个 xrange object. 如下: >〉〉 type(range(10)) >〉〉 type(xrange(10)) 〈type ’xrange’〉 〉>> xrange()比range()效率更高:因为range返回的是一个list对象,然后再对list对象进行遍历,而xrange返回的是xrange对象,每次迭代才返回本次迭代的结果。
比如: for x in range(10000): will generate a list of ten thousand elements, and will then loop through each of them in turn for x in xrange(10000): will genarate ten thousand integers one by one, passing each to the variable x in turn.
二:内置函数:ord()与chr() 可以实现一个字符与ascii之间的转换,比如: >〉〉 ord(’a') 97 〉〉〉 chr(97) ’a’ 〉>〉
例如将英文字母放入列表中: 〉〉〉 list = [] >〉> for i in xrange(ord('a'),ord(’z')+1,1): 。。。 list。extend(chr(i)) ... >〉〉
注意:chr()与str()的区别:例如以下代码: >〉> chr(97) ’a’ 〉〉〉 str(97) '97'
将一个字符串转换为对应的ascii码值,map比如: >〉> map(ord,"abcde") [97, 98, 99, 100, 101] 反过来,比如: 〉>> map(chr,range(97,101)) [’a', 'b’, 'c', 'd'] 在将列表中的字符连接起来: >>〉 ”".join(map(chr,range(97,101))) 'abcd’ 〉〉〉
Python是一种高级的、动态类型的编程语言,它被广泛用于各种领域,包括Web开发、数据科学、人工智能、机器学习、网络爬虫、系统自动化、游戏开发等。
Python有许多内置的模块和库,这些模块和库为Python提供了各种功能。
以下是Python的一些常见模块和库,以及它们的详细解释:1. **NumPy**:NumPy是Python的一个数值计算扩展程序,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
2. **Pandas**:Pandas是一个提供快速,灵活和富有表现力的数据结构,设计目的是使“关系型”或“标记型”数据的使用既简单又直观。
3. **Matplotlib**:Matplotlib是Python的一个绘图库,可以生成各种硬拷贝格式和跨平台的交互式环境下的发布质量数据。
4. **Scikit-learn**:Scikit-learn是一个用于Python编程语言的开源机器学习库。
这个库包含了大量的简单而有效的工具,用于数据挖掘和数据分析,它包括分类、回归、聚类、降维等。
5. **TensorFlow**:TensorFlow是一个开源深度学习框架,由Google Brain开发并维护。
它使用数据流图进行计算,节点表示操作,边表示多维数据数组(张量)。
6. **Keras**:Keras是一个用户友好、模块化、可扩展的Python 库,用于构建和训练深度学习模型。
它可以运行在TensorFlow, CNTK, 或者Theano之上。
7. **Django** 和**Flask**:这两个都是Web开发框架。
Django 使用一种自上而下的方式,提供了大量的内置功能,而Flask则更加灵活,允许你根据自己的需求选择工具。
8. **Requests**:Requests是一个用于发送HTTP请求的Python 库,它比内置的urllib库更易用,更人性化。
9. **BeautifulSoup** 和**Scrapy**:这两个库通常一起使用进行网页抓取和解析。
1、datetime:Python处理日期和时间的标准库 引入方法: from datetime import datetime。 第一个datetime是模块,第二个datetime是类。如果仅导入import datetime,则必须引用全名datetime.datetime。 获取当前日期和时间:datetime.now() 加减当前时间:now + timedelta(days=2, hours=12) datetime->timestamp:
>>> from datetime import datetime >>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime >>> dt.timestamp() # 把timestamp转换为datetime1429417200.0 # Python的timestamp是一个浮点数。如果有小数位,小数位表示毫秒数。某些编程语言(如Java和JavaScript)的timestamp使用整数表示毫秒数,这种情况下只需要把timestamp除以1000就得到Python的浮点表示方法。
datetime->str datetime->UTC时间 时区转化 存储datetime,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。
2、collections: Python内建的一个集合模块,提供了许多有用的集合类。 namedtuple:创建一个自定义的tuple对象
>>> from collections import namedtuple >>> Point = namedtuple('Point', ['x', 'y']) >>> p = Point(1, 2) >>> p.x 1
deque:为了高效实现插入和删除操作的双向列表,适合用于队列和栈 >>> from collections import deque >>> q = deque(['a', 'b', 'c']) >>> q.append('x') >>> q.appendleft('y') >>> q deque(['y', 'a', 'b', 'c', 'x']) >>> q.pop() >>> q deque(['y', 'a', 'b', 'c']) >>> q. popleft() >>> q deque([ 'a', 'b', 'c'])
defaultdict: 使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict
>>> from collections import defaultdict >>> dd = defaultdict(lambda: 'N/A') >>> dd['key1'] = 'abc' >>> dd['key1'] # key1存在'abc' >>> dd['key2'] # key2不存在,返回默认值'N/A'
OrderedDict: 保持Key的顺序,可以用OrderedDict(按插入序)。 OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key
>>> from collections import OrderedDict >>> d = dict([('a', 1), ('b', 2), ('c', 3)]) >>> d # dict的Key是无序的 {'a': 1, 'c': 3, 'b': 2} >>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)]) >>> od # OrderedDict的Key是有序的 OrderedDict([('a', 1), ('b', 2), ('c', 3)])
Counter:计数器,也是dict的子类,如统计字母出现的次数,类似于Wordcount >>> from collections import Counter >>> c=Counter >>> c('Programming') Counter({'r': 2, 'm': 2, 'g': 2, 'P': 1, 'a': 1, 'o': 1, 'i': 1, 'n': 1})
3、base64 : 用64个字符来表示任意二进制数据. Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。 4、struct:解决bytes和其他二进制数据类型的转换。 Windows的位图文件(.bmp)是一种非常简单的文件格式,可以用struct分析出其文件头结构。 两个字节:'BM'表示Windows位图,'BA'表示OS/2位图; 一个4字节整数:表示位图大小; 一个4字节整数:保留位,始终为0; 一个4字节整数:实际图像的偏移量; 一个4字节整数:Header的字节数; 一个4字节整数:图像宽度; 一个4字节整数:图像高度; 一个2字节整数:始终为1; 一个2字节整数:颜色数。 通过分析位图文件的文件头结构,可以检查任意文件是否是位图文件
>>> struct.unpack('(b'B', b'M', 691256, 0, 54, 40, 640, 360, 1, 24)
5、hashlib:提供常见的摘要算法,MD5,SHA1,SHA256,SHA512等 摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 目的是为了发现原始数据是否被人篡改过。摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。也可以看成加密算法。
import hashlib
md5 = hashlib.md5() md5.update('how to use md5 in '.encode('utf-8')) md5.update('python hashlib?'.encode('utf-8')) print(md5.hexdigest())
注意:在pycharm上测试运行时,新建的.py文件名称不要取hashlib,因为代码中需要import hashlib,如果文件名也是hashlib就会引入当前文件(模块),从导致出现错误。 6、itertools: 提供用于操作迭代对象的函数 count()会创建一个无限的迭代器,count(1)从1开始的迭代器
for n in itertools.count(1): print(n) if n==10: break
cycle()会把传入的一个序列无限重复下去 for c in itertools.cycle('abc'): print(c) i+=1 if i==10: break
repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数
for n in itertools.repeat('a',3): print(n)
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器:
for c in itertools.chain('ABC', 'XYZ'): print(c) # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
groupby()把迭代器中相邻的重复元素挑出来放在一起: >>> for key, group in itertools.groupby('AAABBBCCAAA'): ... print(key, list(group)) ... A ['A', 'A', 'A'] B ['B', 'B', 'B'] C ['C', 'C'] A ['A', 'A', 'A
小结: itertools模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是Iterator,只有用for循环迭代的时候才真正计算。 7、XML:Python解析XML
(DOM和SAX) DOM会把整个XML读入内存,解析为树,因此占用内存大,解析慢,优点是可以任意遍历树的节点。SAX是流模式,边读边解析,占用内存小,解析快,缺点是我们需要自己处理事件。正常情况下,优先考虑SAX,因为DOM实在太占内存。 Python利用SAX解析XML(关心的事件:start_element,end_element和char_data): from xml.parsers.expat import ParserCreate
class DefaultSaxHandler(object): def start_element(self, name, attrs): print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))
def end_element(self, name): print('sax:end_element: %s' % name)
def char_data(self, text): print('sax:char_data: %s' % text)
xml = r'''
handler = DefaultSaxHandler() parser = ParserCreate() parser.StartElementHandler = handler.start_element parser.EndElementHandler = handler.end_element parser.CharacterDataHandler = handler.char_data parser.Parse(xml)
生成XML:拼接字符串、JSON L = [] #list L.append(r'') L.append(r'') L.append(encode('some & data')) L.append(r'') return 'www.mntuku.cn'.join(L) #str