模块:
模块就是一段程序,模块名即保存的python类型文件名
程序保存的位置必须是解释器寻找模块默认路径
可以在idle中使用查看sys.path查看默认路径包含哪些
>>> import sys
>>> sys.path
['', 'F:\\python3\\Lib\\idlelib', 'F:\\python3\\python36.zip', 'F:\\python3\\DLLs', 'F:\\python3\\lib',
'F:\\python3', 'F:\\python3\\lib\\site-packages']
如果模块不在默认路径中,可以使用sys.path.append('路径')
编写如下模块:
print('hellow python')
保存在c:/python27目录下
将该目录添加到默认路径中
>>> sys.path.append('c:/python27')
>>> import hellow
hellow python
第一次导入模块后程序执行
第二次不会执行
导入模块多次和导入一次的效果一样
模块的测试:
def hello():
print('hellow world')
def test():
hello()
if __name__=='_main_':
test()
在主程序中__name__的值是'__main__',而在导入的模块中__name__的值设定为模块的名字
以包的形式组织模块:
以包的形式组织模块,包名就是模块所再目录,为了让python将之当做包对待,它必须包含一个命名为_init_.py的文件,如果将这个
__init__作为普通模块导入,文件内容就是包的内容:
建立一个名为test的包,包含名为mokuai1的模块和mokuai2的模块,以及一个__init__.py文件
>>> import test
>>> import test.mokuai1
>>> import test.mokuai2
>>> import test.1
SyntaxError: invalid syntax
如何探究模块:
首先包含该模块
然后使用dir函数(以下划线开始ide名字约定俗成不是为模块外部准备而使用的)
>>> import copy
>>> [n for n in dir(copy) if not n.startswith('_')]
['Error', 'copy', 'deepcopy', 'dispatch_table', 'error']
可以使用__all__属性
>>> copy.__all__
['Error', 'copy', 'deepcopy']
__all__属性定义了模块的公有接口,他会过滤其他程序不想要的变量,函数,和类
help()函数会从函数的文档字符串中取出信息
获取模块源码:
使用__life__属性获得路径,使用编辑器打开
python标准库:
sys:
sys.argv包括传递到python解释器的参数,包括脚本名称
sys.exit可以退出当前程序(如果在try/catch/finally块中调用,finally子句的内容仍然会被执行
sys.path是一个字符串列表,每一个字符串都是一个迷路,在import语句执行时,解释器会从这些目录中查找模块
sys.stdin.sys.stdout和sys.stderr模块变量时类文件流对象,表示标准输入,标准输出,标准错误
os:
os.environ映射包含环境变量
os.system(command)函数用于运行外部程序
os.sep用于路径中的分隔符:
在windows系统下:
>>> os.sep
'\\'
os.linesep用于文本文件的字符串分隔符
在window系统下:
>>> os.linesep
'\r\n'
random:
random.random返回0-1的伪随机数n
random.getrandbits以长整型形式返回给定的位数
random.uniform提供两个数值参数a和b,会返回在a~b之间的随机数
random.randrange(),可以在一个范围内获取随机数:
>>> random.randrange(1,10,2)
5
>>> random.randrange(2,10,2)
4
random.choice从给定序列中选择随机元素
random.shuffle将给定的序列的元素进行随机移位,每种排列可能性近似相等
random.sample从给定的序列中选择给定数目的元素,确保元素互不相同
shelve:
用于在文件中存储数据,使用open函数,貌似只能操作.dat文件
类似于字典
>>> a = shelve.open('f:\\text.dat')
>>> a['x'] = ['a','b','c']
>>> a['x']
['a', 'b', 'c']
对上面a['x']使用append函数,不会马上存储.需要使用副本
temp = s['x']
temp.append('d')
s['x'] = temp
这样数据会被存储
例子:一个简易数据库,储存个人信息
import sys,shelve
def store_person(db):
"""
用于存储数据的函数
"""
pid = input('请输入唯一的编号')
person = {}
person['名字'] = input('请输入姓名')
person['年龄'] = input('请输入年龄')
person['电话'] = input('请输入电话号码')
db[pid] = person
def look_up(db):
"""
根据id查询人
"""
pid = input('输入id')
field = input('你想知道什么信息?(名字,年龄,电话号码)')
field = field.strip().lower() #去掉空格,将字符变为小写
print (field+':'+ db[pid][field]) #首字母大写
def print_help():
print('store:储存个人信息')
print('lookup:以id查询个人信息')
print('quit:退出')
print('?:查看帮助')
def enter_command():
cmd = input('输入一个命令(?获取帮助)')
cmd = cmd.strip().lower()
return cmd
def main():
database = shelve.open('f:\\database.dat')
try:
while True:
cmd = enter_command()
if(cmd == 'store'):
store_person(database)
elif(cmd == 'lookup'):
look_up(database)
elif(cmd == 'quit'):
return;
elif(cmd == '?'):
print_help()
finally:
database.close()
if __name__ == '__main__':
main()
re(包含对正则表达式的支持):
用圆括号括起来的部分称为子模式,例如需要匹配python和perl
可以直接用'python|per',也可以用子模式'p(ython|erl)
'^'可以标记开始'$'可以标记结尾
re.compile将正则表达式转换为模式对象
re.search在给定的字符串中寻找第一个匹配给定正则表达式的子字符串,一旦找到,返回MatchObject(值为True)否则返回None,值为False
re.match会在给定的字符串的开头匹配正则表达式,re.match('p','python')值为True,re.match('p','www.python.org')值为False
re.split会根据匹配项来分割字符串
例子:
>>> import re
>>> text = 'alpha.beta,,,gamma delta...hellow'
>>> re.split('\\.+|,+',text)
['alpha', 'beta', 'gamma delta', 'hellow']
re.findall以列表的形式返回给定模式的所有匹配项
re.sub使用给定的替换内容将匹配模式的字符串替换掉
re.escape可以对字符串中所有可能被解释为正则运算符的字符进行转移的应用函数
匹配对象和组:
re模块中的那些对字符串进行模式匹配的函数,当找到匹配项时,都会返回MatchObject对象,这些对象包括匹配模式的子字符串中的信息
他们还包含了那个模式匹配了子字符串中的那部分的信息,这些部分叫做'组'
简而言之,组就是防止在圆括号内的子模式,组的序号取决于它左侧的括号数,组1就是整个模式例如:
'There (was a (wee)(cooper)) who (lived in Fyfe)'
包含下面这些组:
0 There was a wee cooper who lived in Fyfe
1 was a wee cooper
2 wee
3 cooper
4 lived in Fyfe
在下面的模式中,组1包含位于'www.'和'.com'之间的内容,这样可以在匹配的对象中取出我们所感兴趣的字符串
'www\\.(.+)\\.com'
例子:
>>> m = re.match('www\\.(.+)\\.com','www.python.com')
>>> m.group[1]
>>> m.group(1)
'python'
group([group],...)获取给定子模式的匹配项
start([group])返回给定组的匹配项的开始位置
end([group])返回给定组的匹配项的结束位置
span([group])返回一个组的开始和结束位置
贪婪和非贪婪模式的匹配:
之前写java程序正则表达式提取html页面信息经常会出现这个问题
使用'+'会尽可能多的匹配需要的字符串,比如'*.+*'匹配"aaa*bbb*ccc*ddd*会匹配成bbb*ccc*ddd,这就是贪婪模式
而使用'+?'会尽可能少的匹配需要的字符串比如上面的例子匹配出的结果是'bbb','ccc','ddd'
其他标准库模块:
functools:
可以通过部分参数来使用某个函数,稍后再为剩下的参数提供数值
difflib:
计算两个序列的相似程度,还可以从一些序列中找出和提供的袁术序列最像的那个,可以用于创建简单的搜索程序
python学习笔记4-python模块和标准库
最新推荐文章于 2022-12-21 13:21:06 发布