摘要
本文内容转自网络,个人学习记录使用,请勿传播
模块与包
模块
模块介绍
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。而这样的一个py
文件在Python中称为模块(Module)。
模块是组织代码的更高级形式,大大提高了代码的阅读性和可维护性。
模块一共四种:
- 解释器内建模块
- python标准库
- 第三方模块
- 应用程序自定义模块
另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。
模块导入
1 | ''' |
导入模块时会执行模块,多次导入只执行一次。
案例:
1 | cal.py |
1 | #cal.py |
1 | #logger.py |
1 | #main.py |
- 注意:执行源文件的名字一定不要和模块的名字同名
__name__
__name__
是python内置变量,存储的是当前模块名称。
对于很多编程语言来说,程序都必须要有一个入口。像C,C++都有一个main函数作为程序的入口,而Python作为解释性脚本语言,没有一个统一的入口,因为Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。
在刚才的案例中三个模块都打印一次__name__
1 | #cal.py |
结果为:
1 | 这是cal模块文件,__name__内置变量的值为: cal |
通过结果发现__name__
只有在执行模块中打印__main__
,在其他导入模块中打印各自模块的名称。
所以,__name__
可以有以下作用:
- 利用
__name__=="__main__"
声明程序入口。 - 可以对导入的模块进行功能测试
包
什么是包
当一个项目中模块越来越多,维护和开发不是那么高效的时候,我们可以引入一种比模块更高级语法:包。
包是对相关功能的模块py
文件的组织方式。
包可以理解为文件夹,更确切的说,是一个包含__init__
文件的文件夹。
导入包的语法
import 包名[.模块名 [as 别名]]
from 包名 import 模块名 [as 别名]
from 包名.模块名 import 成员名 [as 别名]
案例:将上面案例中的cal .py
文件放到utils
包中管理,logger.py
放到logger
包中管理。
1 | -- demo |
1 | from m_log import logger |
常见模块
time模块
1 | # <1> 时间戳 |
小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的
1 | import time |
random模块
1 | import random |
os模块
os模块是与操作系统交互的一个接口
1 | import os |
序列化模块:json(重点)
序列化: 将python中的字典,列表对象转换成指定形式字符串
反序列化:将指定格式的字符串转换成字典,列表对象
基本使用
1
2
3
4
5
6
7
8
9
10import json
dic = {
'hobby':['football','pingpang','smoke'],
'age':20,
'score':97.6,
'name':'zhangsan'
}
#序列化:将字典对象转换成了json格式的字符串
r = json.dumps(dic)
print(r)1
2
3
4
5
6import json
str = '{"hobby": ["football", "pingpang", "smoke"], "age": 20, "score": 97.6, "name": "zhangsan"}'
#反序列化:将字符串转换成了字典对象
dic = json.loads(str)
print(dic)1
2
3
4
5
6
7
8
9
10
11
12#持久化存储字典
import json
dic = {
'hobby':['football','pingpang','smoke'],
'age':20,
'score':97.6,
'name':'zhangsan'
}
fp = open('./dic.json','a')
#dump首先将dic字典进行序列化,然后将序列化后的结果写入到了fp表示的文件中
json.dump(dic,fp)
fp.close()1
2
3
4
5
6import json
fp = open('./dic.json','r')
#load将文件中的字符串数据进行读取,且将其转换成字典类型
dic = json.load(fp)
print(dic)
fp.close()
正则模块(重点)
什么是正则表达式?
- 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(例如,*,+,?等)。
- 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
常用的正则标识
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21单字符:
. : 除换行以外所有字符
[] :[aoe] [a-w] 匹配集合中任意一个字符
\d :数字 [0-9]
数量修饰:
* : 任意多次 >=0
+ : 至少1次 >=1
? : 可有可无 0次或者1次
{m} :固定m次 hello{3,}
{m,} :至少m次
{m,n} :m-n次
边界:
$ : 以某某结尾
^ : 以某某开头
分组:
(ab)
命名分组:
(?P<name>正则表达式),name是一个合法的标识符
贪婪模式: .*
非贪婪(惰性)模式: .*?正则在python中的使用
基于re模块进行正则匹配操作
主要使用re模块中的findall进行指定规则的匹配
- findall(str,rule)
- str表示即将进行匹配的原始字符串数据
- rule表示指定规则的正则表达式
- findall返回的是列表,列表中存储匹配到的指定内容
- findall(str,rule)
练习
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45import re
#提取170
string = '我喜欢身高为170的女孩'
ex = '\d+'
result = re.findall(ex,string)
print(result[0])
#####################################################################
#提取出http和https
key='http://www.baidu.com and https://boob.com'
ex = 'https?'
result = re.findall(ex,key)
print(result)
#####################################################################
import re
#提取出hello
key='lalala<hTml>hello</HtMl>hahah'
ex = '<hTml>(.*)</HtMl>'
result = re.findall(ex,key)
print(result)
#####################################################################
#提取出hit.
key='bobo@hit.edu.com'#想要匹配到hit.
# ex = 'h.*\.' #贪婪模式
ex = 'h.*?\.' #?将正则的贪婪模式调整为非贪婪模式。默认下为贪婪模式
result = re.findall(ex,key)
print(result)
#####################################################################
#匹配sas和saas
key='saas and sas and saaas'
ex = 'sa{1,2}s'
result = re.findall(ex,key)
print(result)
#####################################################################
key = '你好我的手机号是13222222222你记住了吗'
ex = '1[3,5,7,8,9]\d{9}'
result = re.findall(ex,key)
print(result)
#####################################################################
#提取ip和端口号
import re
s = "my computer ip is '230.192.168.78',and port is 8889 you got it?"
rep = re.search(r"ip is '(?P<ip>\d+\.\d+\.\d+\.\d+).* port is (?P<port>\d+)",s)
rep.group('ip'),rep.group('port')#通过命名分组引用分组