5.10 包

5.10.1 包的概念

【官网解释】
Packages are a way of structuring Python’s module namespace by using “dotted module names”
包是一种通过使用‘.模块名’来组织python模块名称空间的方式。

具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来

【强调】:

  1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
  2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

【创建包时发生的三件事】:

  1. 将该包内 __init__py文件加载到内存.
  2. 创建一个以该包 命名的名称空间.
  3. 通过 包名. 的方式引用__init__里的所有的名字.

5.10.2 import导入

这种方法不常用,但要了解

1 import glance.db.models
2 glance.db.models.register_models('mysql') 

示例练习:

import aaa
# 1. 在执行文件写入 import aaa
# 2. aaa的 __init__ 里面 写 from aaa import m1
# 3. 然后在执行文件  aaa.m1.a
# print(aaa.m1.a)

5.10.3 from ... import ...导入

from a.b.c import d

【注意】from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法

from与import 之间的a.b.c 中的b必须是包

# from ... import ...练习
# 通过这种方式不用设置__init__文件
# from aaa import m1
# m1.func()# from aaa.bbb.m2 import func1  #aaa外包,bbb内包
# func1()
# from aaa.bbb import m2
# m2.func1()# from a.b.c import d
# c的. 的前面一定是包
# import 的后面一定是名字,并且不能 再有点

【包里嵌包】:如果要把内层包里的模块加到外层__init__里,需要用

from wrapper import inner  # wrappe外包名,inner内包名
# 举例
# 如何在当前文件中,引用 aaa包的bbb包.
# 1. 在执行文件写入 import aaa
# 2. aaa的 __init__ 里面 写 from aaa import bbb
# 3. 然后在执行文件  aaa.bbb
# print(aaa.bbb)
# 如何在当前文件中,引用 aaa包的bbb包 的 变量 name.
# 1. 在执行文件写入 import aaa
# 2. aaa的 __init__ 里面 写 from aaa import bbb
# 3. 然后在执行文件  aaa.bbb
# print(aaa.bbb)
# 如何在当前文件中,引用 aaa包的bbb包 的 mb文件的函数func.
# 1. 在执行文件写入 import aaa
# 2. 在aaa包的__init__ 写上 from aaa import bbb  (这样写 bbb包的__init__里面所有的名字都能引用)
# print(aaa.bbb.name)
# 3. 在bbb包的__init__ 写上 from aaa.bbb import mb
# aaa.bbb.mb.func3()

5.10.4 绝对导入和相对导入

​ 最顶级包glance是写给别人用的,然后在glance包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:

绝对导入:以glance作为起始

相对导入:用 . 或者 .. 的方式最为起始(只能在一个包中使用,不能用于不同目录内)

例如:我们在glance/api/version.py中想要导入glance/cmd/manage.py

【总结】

绝对导入与相对导入# 绝对导入: 以执行文件的sys.path为起始点开始导入,称之为绝对导入
#     优点: 执行文件与被导入的模块中都可以使用
#     缺点: 所有导入都是以sys.path为起始点,导入麻烦# 相对导入: 参照当前所在文件的文件夹为起始开始查找,称之为相对导入
#     符号: .代表当前所在文件的文件加,..代表上一级文件夹,...代表上一级的上一级文件夹
#     优点: 导入更加简单
#     缺点: 只能在导入包中的模块时才能使用
#注意:1. 相对导入只能用于包内部模块之间的相互导入,导入者与被导入者都必须存在于一个包内2. attempted relative import beyond top-level package # 试图在顶级包之外使用相对导入是错误的,言外之意,必须在顶级包内使用相对导入,每增加一个.代表跳到上一级文件夹,而上一级不应该超出顶级包

【注意】当对包的命名进行了更新,但是很多项目已经沿用了老的名称,可以使用import 新名称 as 老名称在项目中起别名,就可以解决

5.11 collection模块

在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

1.namedtuple: 生成可以使用名字来访问元素内容的tuple

2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

3.Counter: 计数器,主要用来计数

4.OrderedDict: 有序字典

5.defaultdict: 带有默认值的字典

# namedtuple 带名称的元组
from collections import namedtuple
point = namedtuple('point',['x','y'])
p = point(1,2)
print(p)
print(p.x)
# deque双端列表
from collections import deque
q = deque([1,2,3,4,5])
q.appendleft('d')
print(q)
q.popleft()
print(q)
# OrderDict 有序字典
from collections import OrderedDict
d = OrderedDict([('1','a'),('2','b'),('3','c')])
print(d)
#counter计数器
from collections import Counter
c = Counter('asdsadgasdasdasfsgfasgf')
print(c)  #生成一个字典,里边存放的是每个字母已经弃数量
# defaultdict
# 有如下值集合 [11,22,33,44,55,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中,即: {'k1': 大于66 , 'k2': 小于66}
#普通版
li = [11,22,33,44,55,77,88,99,90]
result = {}
for row in li:if row > 66:if 'key1' not in result:result['key1'] = []result['key1'].append(row)else:if 'key2' not in result:result['key2'] = []result['key2'].append(row)
print(result)#defaultdict版
from collections import defaultdictvalues = [11, 22, 33,44,55,77,88,99,90]my_dict = defaultdict(list)for value in  values:if value>66:my_dict['k1'].append(value)else:my_dict['k2'].append(value)
print(my_dict)

5.12 re模块

​ 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

5.12.1 元字符

元字符 匹配内容
\w 匹配字母(包含中文)或数字或下划线
\W 匹配非字母(包含中文)或数字或下划线
\s 匹配任意的空白符
\S 匹配任意非空白符
\d 匹配数字
\D p匹配非数字
\A 从字符串开头匹配
\z 匹配字符串的结束,如果是换行,只匹配到换行前的结果
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 匹配字符组中的字符
[^...] 匹配除了字符组中的字符的所有字符
* 匹配0个或者多个左边的字符。
+ 匹配一个或者多个左边的字符。
匹配0个或者1个左边的字符,非贪婪方式。
{n} 精准匹配n个前面的表达式。
{n,m} 匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b 匹配a或者b。
() 匹配括号内的表达式,也表示一个组

5.12.2 匹配模式

import re
#单个字符匹配
print(re.findall('\d\d','12a34567890 alex *(_'))
print(re.findall('\w','太白jx 12*() _'))
print(re.findall('\d','1234567890 alex *(_'))
print(re.findall('\Ahel','hello 太白金星 -_- 666'))
print(re.findall('\n','hello \n 太白金星 \t*-_-*\t \n666'))
print(re.findall('.','da\nsdasda\nsdf231\t2314!#!@#!@'))
print(re.findall('hh$','dajqwdadnhhldsdoashhdosasdhh'))
# 元字符匹配
# . 匹配任意一个字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
print(re.findall('a.b','ab aacb a*b a2b a牛ab a\nb')) #以a开头,以b结尾中间必须有一个字符
print(re.findall('a..b','ab aacb a*b a2b a牛ab a\nb',re.DOTALL)) #以a开头,以b结尾中间必须有两个字符
# ?匹配0个或1个由左边字符定义的片段
print(re.findall('a?b', 'ab aab abb aaaab a牛b aba**b')) #要么有一个a要么没有a
# * 匹配0个或多个左边字符表达式,满足贪婪算法
print(re.findall('a*b','ab aab aaab abbbbb'))  #以b结尾,前边有多少个a都无所谓
print(re.findall('ab*','ab cacacb aaab abbbbb')) #比较前后两个字符,必须要以a开头,结尾可以是1个或者0个b
print(re.findall('b*','ab aab aaab abbbbb')) #一个字符一个字符的比较,是b输出,不是b跳过
# + 匹配1个或者多个左边字符的表达式,满足贪婪算法
print(re.findall('a+b',' b ab aab acaab aaab abbb')) #以b结尾,前边可以有一个甚至多个a
print(re.findall('ca+b',' cb ab aab acaab aaab cabbb')) #以b结尾,前边可以有一个甚至多个ca组合
print(re.findall('a+bc',' cbc abc aabc acaab aaab cabbbc')) #以bc结尾,前边可以有一个甚至多个a组
# {n,m}匹配n个至m个左边字符表达式,满足贪婪算法
print(re.findall('a{2,4}b','ab aab aaab aaaaabb'))
# .* 组合,贪婪匹配,从头到尾
print(re.findall('a.*b','ab aab a*()b aasbdsdsdsb'))  #以a开头,以b结尾,中间可以有任意字符,ab中间如果还有ab以最外层的ab为准
# .*? 此时的?不是对左边的字符进行0次或者1次的匹配,
# 而只是针对.*这种贪婪匹配的模式进行一种限定:告知他要遵从非贪婪匹配 推荐使用!
print(re.findall('a.*?b','ab aab a*()b aasbdsadsdsb'))
# 练习,寻找_zs结尾的元素
s = '皇子_zs 赵信_zs 盖伦_zs 凯特琳_adc 慎_rz'
print(re.findall('\w*_zs',s))
print(re.findall('\w+_zs',s))#输出时间
s1 = '''
时间就是1995-04-27,2005-04-27
1999-04-27 德玛西亚
赵信 1980-04-27:1980-04-27
2018-12-08
'''
print(re.findall('\d{4}-\d{2}-\d{2}',s1))# 匹配一个qq账号 10000开始 第一个元素规定就是非零数字,后面的是随意的数字长度大于5位.
print(re.findall('[1-9][0-9]{4,}','12335345 3453453453 45345123123 0432040320 4324'))

5.12.3 重要语法

re 的匹配语法
  • re.match 从头开始匹配
  • re.search 匹配包含
  • re.findall 把所有匹配到的字符放到以列表中,返回列表
  • re.split 以匹配到的字符当作列表分隔符
  • re.sub 匹配字符以替换
  • re.fullmatch 全部匹配
re.match (pattern,string,flages = 0)

​ 从起始位置开始根据模型去字符串中匹配指定的内容,匹配单个

  • pattern 正则表达式
  • string 要匹配的字符串
  • flags 标志位,用于控制正则表达式的匹配了方式
falgs标志位
  • re.I(re.IGNORECASE)忽略大小写(括号内是完整写法,下同)
  • M(MULTILINE):多行模式,改变'^'和'$'的行为
  • S(DOALL):改变 . 的行为,make the '.' special character match any character at all ,including a newline ;without this flag, '.' will match anthing except a newline.
  • x(re.VERBOSE) 给表达式写注释,使其更可读
re.search(pattern,string,flags = 0)

​ 根据模型去字符串中匹配指定的内容,匹配单个

re.findall(pattern,string,flags=0)

​ 匹配字符串中所有符合条件的元素

re.sub( pattern, repl, string, counts=0, flags=0)

​ 用于替换匹配的字符串,相比于str.replace功能更强大

re.split( pattern, string, maxsplit=0, flags=0)

​ 支持多字符切割,而str.split只支持单字符切割且不感知空格的数量

re.fullmatch(pattern,string,flags=0)

​ 整个字符串匹配成功就返回re object ,否则返回None

5.12.3 重要语法

re 的匹配语法
  • re.match 从头开始匹配
  • re.search 匹配包含
  • re.findall 把所有匹配到的字符放到以列表中,返回列表
  • re.split 以匹配到的字符当作列表分隔符
  • re.sub 匹配字符以替换
  • re.fullmatch 全部匹配
re.match (pattern,string,flages = 0)

​ 从起始位置开始根据模型去字符串中匹配指定的内容,匹配单个

  • pattern 正则表达式
  • string 要匹配的字符串
  • flags 标志位,用于控制正则表达式的匹配了方式
falgs标志位
  • re.I(re.IGNORECASE)忽略大小写(括号内是完整写法,下同)
  • M(MULTILINE):多行模式,改变'^'和'$'的行为
  • S(DOALL):改变 . 的行为,make the '.' special character match any character at all ,including a newline ;without this flag, '.' will match anthing except a newline.
  • x(re.VERBOSE) 给表达式写注释,使其更可读
re.search(pattern,string,flags = 0)

​ 根据模型去字符串中匹配指定的内容,匹配单个

re.findall(pattern,string,flags=0)

​ 匹配字符串中所有符合条件的元素

re.sub( pattern, repl, string, counts=0, flags=0)

​ 用于替换匹配的字符串,相比于str.replace功能更强大

re.split( pattern, string, maxsplit=0, flags=0)

​ 支持多字符切割,而str.split只支持单字符切割且不感知空格的数量

re.fullmatch(pattern,string,flags=0)

​ 整个字符串匹配成功就返回re object ,否则返回None

转载于:https://www.cnblogs.com/jjzz1234/p/11122948.html

python学习之模块--模块(五)相关推荐

  1. Python学习笔记:第三方模块2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  2. python学习总结----时间模块 and 虚拟环境(了解)

    python学习总结----时间模块 and 虚拟环境(了解) time- sleep:休眠指定的秒数(可以是小数) - time:获取时间戳# 获取时间戳(从1970-01-01 00:00:00到 ...

  3. Python学习笔记13_模块

    Python学习笔记13_模块 文章目录 Python学习笔记13_模块 1.导入模块和的方法及使用 2.分层的文件系统中常用的包结构 3.OS 模块 4.sys 模块 5.math 模块 6.ran ...

  4. python学习的第二十五天:对PDF文件的读写操作

    文章目录 python学习的第二十五天:对PDF文件的读写操作 对Excel操作的补充 python的实用方法 获取指定文件下的所有内容 shutil模块(封装了高级的文件操作函数) PDF的相关操作 ...

  5. Python学习笔记:模块

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. Python学习笔记011_模块_标准库_第三方库的安装

    容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...

  7. Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数

    一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...

  8. python学习,pip 模块-数据库(mysql)-excel操作-写日志-邮件-md5加密

    #模块 # 标准模块 # python自带的 # 第三方模块 # pymysql # 自己写的python文件 # 导入模块的实质 # import my_model # 把导入的模块运行了一遍 # ...

  9. Python学习 Day 025 -模块相关

    主要内容: 1. 模块 2. import 3. from xxx import xxx 1.模块    (1)模块的概述 模块就是一个包含了python定义和声明的文件, 文件名就是模块的名字加上. ...

  10. python学习--类、模块、包

    目录 面向对象编程思想 类的特点 类的定义 类的变量 类的方法 类中的方法 类方法 静态方法 实例方法 类的继承 子类的定义 覆写父类的方法 私有化 下划线相关变量命名 模块 包 面向对象编程思想 类 ...

最新文章

  1. 受用一生的高效 PyCharm 使用技巧(一)
  2. 一文图解卡尔曼滤波(Kalman Filter)
  3. php 中memcache的应用场景,php当中的memcache应用
  4. 计算机原理基础知识pdf,计算机原理第一章.pdf
  5. Python的第二种数据类型——String(字符串)
  6. SAP Netweaver和阿里云的战略合作关系
  7. 这家中国企业和星巴克对着干 年亏16亿却成为全球最快上市公司
  8. 完美商业计划书全攻略
  9. 解决Android弹出Dialog小米手机需要打开“后台弹出界面”的权限问题
  10. 华硕飞行堡垒 新机子安装双系统 linux
  11. Matplotlib的一些常规操作
  12. 数据运营时代,如何基于AnalyticDB构建企业实时数仓?
  13. vim光标跳转行首/行尾
  14. window docker 找不到原先所有镜像和容器
  15. python绘图篮球_用Python把NBA球员投篮数据可视化
  16. 基于kettle实现数据采集
  17. 二叉树-求第一条最长路径长度并输出路径
  18. STA series --- 8.Timing Verification (PARTII)
  19. KDD CUP 99数据集分析
  20. 计算机网络技术面试题(未完结)

热门文章

  1. Spark 报错 DROP TABLE IF EXISTS should not show AnalysisException
  2. 微软为何选择在 Github 上开源 .NET 核心?
  3. 由于已明确禁止所请求的页类型,无法对该类型的页提供服务。扩展名“.asp”可能不正确 asp网页在vs中的调试
  4. Div+CSS布局入门教程(三) 页面顶部制作之一
  5. 《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN
  6. 深度学习《残差网络简单学习》
  7. Pytorch —— 模型保存与加载
  8. 面试题 08.09. 括号
  9. 双稀疏主题模型(Dual-Sparse Topic Model)编程实现中的细节 Java
  10. 【004】vim 和 他的辅助工具们