Python-包与常用模块(2)
包
当项目越来越大,模块文件里功能越来越多,这时候把功能全部写在一个模块里就不是很好维护了,于是就有了包的概念,将功能分不同的文件和放在不同的包中,每个包里面存在一个__init__
文件,用于导入本层包内所有模块
包是模块一的一种形式,本质上就是一个含有.py的文件夹
导入包 发生了三件事情
- 创建一个包的名称空间
- 指向包下面的py文件,将执行产生的名字放于包名称空间中,即包名称空间中存放的名字都是来自于py文件中
- 在当前执行文件中拿到一个包名 指向包的名称空间
# 导入包就相当于导入包内的__init__文件,执行的时候以执行文件路径为搜索路径
# 对于用户来说 导入包不能改变调用方式
import aaa
aaa.m2()
aaa.m3()
导入包内包
导入包内包的话 要在第一层包__init__
文件里面导入第二层包的模块和方法,这样最外面执行文件可以不用改变调用方式
相对导入和绝对导入
# 绝对导入
from aaa.m1 import m1
from aaa.m2 import m2
from aaa.bbb import m3
from aaa.bbb import m4
# 相对导入
from .m1 import m1
from .m2 import m2
from .bbb import m3
from .bbb import m4
# .代表当前被导入文件所在的文件夹
# ..代表当前被导入文件所在的文件夹的上一级
# ...代表当前被导入文件所在的文件夹的上一级的上一级
# 相对导入
# 导入包内包的话 也要在第一层包__init__文件里面导入第二层包的方法,这样,最外面执行文件可以不用改变调用方式导入
from ..bbb.m3 import m3
from ..bbb.m4 import m4
注意事项
- 包内的所有文件都是被导入使用,而不是被直接运行的。
- 包内部模块之间的导入可以使用绝对导入与相对导入,使用相对导入更好一点。
- 只有在文件被当做模块导入时才能使用相对导入的方法
- 凡是在导入时是相对导入时,
.
的左边必须是一个包
time模块
time模块 主要提欧共了三种不同类型的时间,三种不同类型可以相互转换
方法 | 描述 |
---|---|
time.time() | 时间戳形式 |
time.strftime('%Y-%m-%d %X') 最常用 | 格式化为 2019-09-27 22:53:19 |
time.localtime() | 结构化时间 |
import time
# 时间戳形式
print(time.time())
# 格式化时间
print(time.strftime('%Y-%m-%d %X'))
# 结构化时间
print(time.localtime())
# 结构化时间 --》 格式化时间
struct_time = time.localtime(3600*24*365)
print(time.strftime('%Y-%m-%d %X',struct_time))
# 格式化时间 --》 结构化时间
format_time = time.strftime('%Y-%m-%d %X')
print(time.strptime(format_time,'%Y-%m-%d %X'))
# 结构化时间 --》 时间戳
struct_time = time.localtime(3600*24*365)
print(time.mktime(struct_time))
# 时间戳 --》 结构化时间
time_stamp = time.time()
print(time.localtime(time_stamp))
datetime模块
datetime模块:时间上可以加减
import datetime
now = datetime.datetime.now()
print(now)
# 2019-09-28 19:53:31.924508
# 默认3天
print(now + datetime.timedelta(3))
# 加3周
print(now + datetime.timedelta(weeks=3))
# 加3小时
print(now + datetime.timedelta(hours=3))
# 减3小时
print(now - datetime.timedelta(hours=3))
print(now + datetime.timedelta(hours=-3))
print(now.replace(year=1949, month=10, day=1, hour=10, minute=1, second=0, microsecond=0))
# 1949-10-01 10:01:00
random模块
random 主要用于生成随机数
方法 | 描述 |
---|---|
random.random() | 生成 0-1 的随机数 |
random.randint(1,10) | 生成指定序列的随机数 |
random.randrange(1,3) | 生成指定序列的随机数 |
random.shuffle([1,2,45,6,8]) | 随机打乱顺序 |
import random
# 打印 0-1 的随机数,并不是真正的随机
print(random.random())
# 0.6629366744271181
# 打印随机数(1-10)
print(random.randint(1,10))
# 6
# 大于等于1且小于3的整数
print(random.randrange(1,3))
# 1
# 大于1小于3的小数
print(random.uniform(1,3))
# 2.0132434909012336
# 随机,打乱顺序
lis = [1,4,5,7,]
random.shuffle(lis)
print(lis)
print(random.choice(lis))
# 4
argparse 模块
argparse
这个模块可以帮助我们解析一些命令行传过来的参数并做一些处理
就像这样
python run.py --agt 6 --usr 1 --max_turn 40 --episodes 150 --movie_kb_path .\deep_dialog\data\movie_kb.1k.p --run_mode 2
def add_parser(parser):
# 添加一些可选参数
parser.add_argument("-dog", dest="dog", default="输入一只狗的名字", type=str, help="输入一只狗的名字/命令")
parser.add_argument("-u", "--ssh_user", dest="ssh_user", required=False, help="shh的用户名, 比如: root")
parser.add_argument("-tn", "--thread_num", dest="thread_num", required=False, help="并发线程数, 比如: 10")
def init_base():
# 声明一个参数解析对象
parser = argparse.ArgumentParser(prog="bible", description="统一自动化工具")
subparser = parser.add_subparsers(title="统一自动化工具", description="可用功能", help="功能具体使用", dest="action")
# 功能模板
template_parser = subparser.add_parser("template",help="功能")
add_parser(template_parser)
# #解析参数
args = parser.parse_args()
init_base()
--dog - 代表一个可选参数 也可以写成一个- -dog
dest - 保存到ArgumentParser对象时的 参数名,
default - 默认值,如果不输入参数默认显示到终端的名字
type - 将输入的字符串转化成改数据类型
help - 输入--help 时获得的帮助
required - 该命令行选项是否可以省略(只针对可选参数)。
action - 在命令行遇到该参数时采取的基本动作类型。
[root@localhost]# python test.py -h
usage: bible [-h] {template} ...
统一自动化工具
optional arguments:
-h, --help show this help message and exit
统一自动化工具:
可用功能
{template} 功能具体使用
template 功能
[root@localhost]# python test.py template -h
usage: bible template [-h] [-dog DOG] [-u SSH_USER] [-tn THREAD_NUM]
optional arguments:
-h, --help show this help message and exit
-dog DOG 输入一只狗的名字/命令
-u SSH_USER, --ssh_user SSH_USER
shh的用户名, 比如: root
-tn THREAD_NUM, --thread_num THREAD_NUM
并发线程数, 比如: 10
configparser模块
configparser 模块主要用于 读取配置文件内容
有如下配置文件
# test.cfg
# 注释1
; 注释2
[section1]
k1 = v1
k2:v2
user=egon
age=18
is_admin=true
salary=31
[section2]
k1 = v1
import configparser
# 定义对象 并读取cfg 配置文件
config = configparser.ConfigParser()
config.read("test.cfg")
# 查看所有的标题
res = config.sections()
print(res)
# ['section1', 'section2']
# 查看标题 下所有key
opt = config.options("section1")
print(opt)
# ['k1', 'k2', 'user', 'age', 'is_admin', 'salary']
# 查看标题 下所有key的值
items_list = config.items("section1")
print(items_list)
# [('k1', 'v1'), ('k2', 'v2'), ('user', 'egon'), ('age', '18'), ('is_admin', 'true'), ('salary', '31')]
# 查看标题下 指定key 的值
val = config.get("section1","user")
print(val)
# egon
# 查看标题下 指定key 是数字的 的值
val_int = config.getint("section1","age")
print(val_int)
# 18
val = config.getint("section1","age")
print(val)
# 18
hashlib模块和hmac模块
hashlib 模块主要对字符串加密
hmac 模块不仅对字符加密,还加上了密钥,更加安全
import hashlib
import hmac
# hashlib
m = hashlib.md5()
m.update(b"qinyj123")
res = m.hexdigest()
print(res)
# a18973e94364927b08e7509dd3dbfde2 对于不同的字符而言,用不重复的密码
# hmac
m = hmac.new(b"qin1yj123123") # 加了一层密码
m.update(b"qinyj123")
res = m.hexdigest()
print(res)
# df1a1fcfaa4ec033406fe608b08ba45a
typing模块
typing 函数主要与函数一起连用,控制函数参数的数据类型用的,提供了基础数据类型之外的数据类型
lt = [1,2,3,4]
print(type(lt) is list)
# True
from typing import Iterable,Generator
def func(x:int, lt:Iterable) -> list:
return lt
res = func(10,lt)
print(res)
# [1, 2, 3, 4]
re模块
正则表达式,去字符串找符合某种特点的字符串
元字符 | 描述 |
---|---|
^ | 匹配规则:以什么什么开头 |
$ | 匹配规则:以什么什么结尾 |
. | 匹配任意字符 |
\d | 匹配 数字的 |
\D | 匹配 非数字的 |
\w | 匹配 非空 |
\W | 匹配 空的 |
\s | 匹配 空 |
\S | 匹配 非空 |
+ | 匹配 + 号前面的一个字符至少匹配1个 |
? | 匹配 ? 号前面的一个字符至少匹配0-1个 |
* | 匹配 * 号前面的一个字符至少匹配0个 |
[] | 匹配 [] 内的字符 |
[^] | [^] 内的字符都不匹配 |
| | 匹配 规则xx 或 规则xx |
{n} | 匹配 输入的n个字符,依次找出来几个符合的字符比如手机号13位 |
{1,2} | 匹配 前面字符2个 |
贪婪模式 | 非贪婪模式 |
---|---|
.* 一直匹配,直到匹配完毕 | .*?进入非贪婪模式,匹配特定的 |
最常用的就是以下修饰符了
修饰符 | 描述 |
---|---|
re.l | 让匹配部分大小写 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
import re
# bug,应该都会打印出来
# s = "dhjsfsnfsnk"
# res = re.findall("",s)
# print(res)
# 以下全部是元字符
# 1. ^ 以什么什么开头
s = "sndkjbsfkbs"
print(re.findall("^sn",s))
# ['sn']
print(re.findall("^fkb",s))
# []
# 2. $ 以什么什么结尾
s = "sndkjbsfkbs"
print(re.findall("bs$",s))
# ['bs']
print(re.findall("dmskdhs$",s))
# []
# 3. . 匹配任意字符
s = "abc红abc"
print(re.findall(".",s))
# ['a', 'b', 'c', '红', 'a', 'b', 'c']
print(re.findall(".add",s))
# []
# 4. \d 匹配数字
s = "sndkjbsfkbs13275242sadbhajsv"
print(re.findall("\d",s))
# ['1', '3', '2', '7', '5', '2', '4', '2']
# 5. \w 匹配非空即不打印空,包括数字字母下划线
s = "abc"
print(re.findall("\w",s))
# ['a', 'b', 'c']
s = "a b c,dsds"
print(re.findall("\w",s))
# ['a', 'b', 'c']
# 6.\s 匹配空
s = "abc"
print(re.findall("\s",s))
s = "a b c,dsds"
print(re.findall("\s",s))
# [' ', ' ']
# 7. \D 匹配非数字
s = "abc123"
print(re.findall("\D",s))
# ['a', 'b', 'c']
# 8. \W 匹配空的
s = "a b c"
print(re.findall("\W",s))
# [' ', ' ']
# 9. \S 匹配非空的
s = "a b c"
print(re.findall("\S",s))
# ['a', 'b', 'c']
# 10. + 匹配 + 号前面的那一个字符 加上其他字符至少有一个就打印
s = "12345"
print(re.findall("23+",s))
# ['23']
# 11. ? 前面的一个字符0-1 个即可
s = "dafxsehtrnt"
print(re.findall("dat?",s))
# ['f', 'fl']
# 12. * 前面的一个字符至少0个
s = "dafxsehtrnt"
print(re.findall("@*",s))
# ['', '', '', '', '', '', '', '', '', '', '', '']
# 13. [] 只匹配中括号内的
s = "dmksff"
print(re.findall("[dmks]",s))
# ['d', 'm', 'k', 's']
# 14. [^] 中括号内的不匹配
s = "dfa"
print(re.findall("[^a]",s))
# ['d', 'f']
# 15. | 或
s = "dsajbfasfbia"
print(re.findall("dsa|bia",s))
# ['dsa', 'bia']
# 16. {2} 匹配前面的2个字符
s = "fsdsfs"
print(re.findall("fs{1,2}",s))
# ['fs', 'fs']
# 贪婪模式
# .*
s = "saaasaaas" # 找到最后
print(re.findall("s.*s",s))
# ['saaasaaas']
# 非贪婪模式 .*?
s = "saaasaaas" # 找到第一个不找了
print(re.findall("s.*?s",s))
# ['saaas']
# 匹配邮箱
# s = '#@#@#@nickchen121@163.com$$$$////nick@qq.com$$#$#$[]]2287273393@162.com@$2423423lksdlfj#'
s = "{|}{}|PP~#&(*$(^1342542daj@162.com/,/<>>]]}{}nicsh_snn@qq.comdsff1232//1213#$%^^asnjkgsa123@gmail.comdwanua"
print(re.findall("\w+@\w+.com",s))
# ['1342542daj@162.com', 'nicsh_snn@qq.com', 'asnjkgsa123@gmail.com']
# compile
s = '3728427482097jkcbdscvdb}:{}:{'
email_pattern = re.compile("\w+@\w+.com")
phone_pattern = re.compile("\d{13}")
print(re.findall(phone_pattern,s))
# ['3728427482097']
# match 从开头找一个,找到不找了报错
# s = 'ab abcddd abc'
# res = re.match('ab*', s)
# print(res.group())
# search 从字符串找一个就不找了
s = 'ab abcddd abc'
res = re.search("abcd*",s)
print(res.group())
# split 不匹配数字,以数字为分隔符
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.split("\d+",s))
# ['ab', 'abcddd', 'abcasdfjlasjdk', 'l', 'lk', 'j', 'kl', 'kl', 'k', 'j', 'kl', 'j', 'lkj']
# sub == replace
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.sub("\d+","",s))
# ababcdddabcasdfjlasjdkllkjklklkjkljlkj
# subn 替换了多少次
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.subn("\d+","",s))
# ('ababcdddabcasdfjlasjdkllkjklklkjkljlkj', 12)
# 修饰符 re.S 会让.匹配换行符
s = '''abc
abcabc*abc
'''
print(re.findall("abc.abc",s))
# ['abc*abc']
print(re.findall("abc.abc",s,re.S))
# ['abc\nabc', 'abc*abc']
# 无名分组 只要括号里的
s = 'abc abcd abcdd'
print(re.findall("a(.)c(d)",s))
# [('b', 'd'), ('b', 'd')]
# 有名分组
s = 'abc abcd abcdd'
print(re.search("a(?P<name1>.)c(?P<name2>d)",s).groupdict())
# {'name1': 'b', 'name2': 'd'}
# 超高级用法
s = 'abc123abc123'
print(re.sub("c(\d+)a"," ",s))
# ab bc123
print(re.sub("c(?P<name1>\d+)a"," \g<name1> " ,s))
# ab 123 bc123
Python-包与常用模块(2)的更多相关文章
- python基础31[常用模块介绍]
python基础31[常用模块介绍] python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...
- python笔记之常用模块用法分析
python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- Python【第五篇】模块、包、常用模块
一.模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
- python模块部分----模块、包、常用模块
0.来源:https://www.cnblogs.com/jin-xin/articles/9987155.html 1.导入模块 1.1模块就是一个python文件,模块名是文件名 1.2导入模块的 ...
- Python基础之--常用模块
Python 模块 为了实现对程序特定功能的调用和存储,人们将代码封装起来,可以供其他程序调用,可以称之为模块. 如:os 是系统相关的模块:file是文件操作相关的模块:sys是访问python解释 ...
- Python学习笔记-常用模块
1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...
- Python全栈开发之路 【第六篇】:Python基础之常用模块
本节内容 模块分类: 好处: 标准库: help("modules") 查看所有python自带模块列表 第三方开源模块: 自定义模块: 模块调用: import module f ...
- 模块、包及常用模块(time/random/os/sys/shutil)
一.模块 模块的本质就是一个.py 文件. 导入和调用模块: import module from module import xx from module.xx.xx import xx as re ...
- Day06:迭代器,生成器,生成表达式,面向过程编程,包及常用模块
今日内容:1.迭代器(****)2.生成器(***)3.生成器表达式(*****)4.面向过程编程(*****)5.包的使用(***)6.常用模块 logging (*****) re ( ...
随机推荐
- tensorflow 训练的时候loss=nan
出现loss为nan 可能是使用了relu激活函数,导致的.因为在负半轴上输出都是0
- 【CF516D】Drazil and Morning Exercise
题目 首先我们知道,在树上距离一个点最远的点一定是直径的两个端点之一 首先两遍\(\rm dfs\)把直径求出来,定义\(d(u)\)表示点\(u\)距离其最远点的距离,有了直径我们就能求出\(d\) ...
- std::unorder_set你插入元素的顺序不一定就是元素在里面的元素
去看了下cppreference,里面写了 根据哈希值排序了
- java 在数组{1,2,3,4,6,7,8,9,10}中插入一个数5,使其插入完成后仍然有序
1.需要实现的效果 2.代码实现 import java.util.Scanner; /* * 11.在数组{1,2,3,4,6,7,9,8,10}中插入一个数5, * 使其插入完成后仍然有序,运行结 ...
- jboss未授权Getshell
一.jboss未授权访问Getshell 1.jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.system:type=Server ...
- java 多项式
/****************************************************************************** * Compilation: javac ...
- MYSQL - database 以及 table 的增删改查
MYSQL - database 以及 table 的增删改查 MySQL的相关概念介绍 MySQL 为关系型数据库(Relational Database Management System), 这 ...
- Ubuntu-WPS无法输入中文
WPS无法输入中文 原因:环境变量未正确设置 $ vi /usr/bin/wps,添加以下内容: #!/bin/bash export XMODIFIERS="@im=fcitx" ...
- go网络库cellent实现socket聊天功能
一 .介绍 cellnet是一个组件化.高扩展性.高性能的开源服务器网络库 git地址:https://github.com/davyxu/cellnet 主要使用领域: 游戏服务器 方便定制私有协议 ...
- react 16更新
1.render新的返回类型 render方法支持两种新的返回类型:数组(由React元素组成)和字符串 2.错误处理 16之前,组件在运行期间如果执行出错,就会阻塞整个应用的渲染,这时候只能刷新页面 ...