第十一章 常用模块

一、re模块
引入:
import re
注:永远不要起一个py文件的名字:这个名字和你已知的模块同名。
1、查找
findall:匹配所有,每一项都是列表中的一个元素
ret = re.findall('\d+', 'abc123efg456')
ret = re.findall("\d", "abc123def456")
search:只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的group方法获取结果。
如果没有匹配到,会返回None,使用group会报错
ret = re.findall('\d+', 'abc123efg456')
print(ret) # 内存地址,这是一个正则匹配的结果
print(ret.group()) # 通过ret.group()获取真正的结果
# if ret : # 内存地址,这是一个正则匹配的结果
# print(ret.group()) # 通过ret.group()获取真正的结果
match:从头开始匹配,相当于search中的正则表达式加上^(从首位开始)
2、替换、切割
split:切割
set = re.split('\d+', 'abc123efg456') #正则表达式切割字符串
print(set)
sub:替换 替换正则 新的 原字符串 (替换次数)
s = 'abc123efg456'
ret = re.sub('\d+', 'H', s, 1)
print(ret)
==>abcHefg456
subn:替换后返回一个元组,第二个元素为替换的次数
s = 'abc123efg456'
ret = re.subn('\d+', 'H', s) 
print(ret)
==>('abcHefgH', 2)
3、re模块的时间复杂度和空间复杂度的处理
compile:节省使用正则表达式解决问题的时间
先将正则表达式进行编译,成为字节码保存,后面随时调用,不用多次编译。
ret = re.compile('\d+') # 完成编译了
res = ret.findall('abc123efg456')
print(res)
res = ret.search('abc123efg456hig789', 8, 10) # 定义了索引范围
print(res.group())
finditer:节省使用正则表达式解决问题的空间复杂度
返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值
ret = re.finditer('\d+', 'abc123efg456')
print(ret) # 一个迭代器
for i in ret:
  print(i.group())
二、random模块
引入:
import random
- 取随机整数:彩票 抽奖
random.randint(n, m):取范围内的整数(顾头也顾尾),没有步长
random.randrang(n, m, k):取范围内整数(顾头不顾尾),k为步长
 print(random.randrange(1, 10, 2)) # 1-10之间的随机奇数 
- 取随机小数
random.random(): 取0-1之间的小数
random.uniform(n,m): 取范围n-m内的小数
 print(random.uniform(1, 3)) 
- 从一个列表中随机抽取值:抽奖
random.choice(list):抽取一次,多次执行可能会抽取同样的值
random.sample(list, n):从列表中随机抽取n个值,这些值不会重复
l = ['a', 'b', (1, 2), 123]
print(random.choice(l))        # 取值会重复
print(random.choice(l))
print(random.choice(l))
print(random.choice(l))
print(random.sample(l, 4))    # 第二个参数超过了列表长度就会报错
==>123
123
b
b
[123, 'b', (1, 2), 'a']
- 打乱一个列表的顺序:洗牌
random.shuffle(list):改变原列表的顺序(可以节省空间)
l = ['a', 'b', (1, 2), 123]
random.shuffle(l)    # 在源列表上进行操作
print(l)
四位数验证码:
s = ""
for i in range(4):
    num = random.randint(0, 9)
    s += str(num)
print(s)
六位数验证码:
def code(n=6):    # 默认为六位
    s = ""
    for i in range(n):
        num = random.randint(0, 9)
        s += str(num)
    return s
print(code())
数字加字符串验证码:
# 循环版
s = ""
for i in range(4):
    # print(chr(65))    # 大写字母A
    num = str(random.randint(0, 9))
    # 生成随机字母
    alpha_upp = chr(random.randint(65, 90))
    alpha_low = chr(random.randint(97, 122))
    res = random.choice([num, alpha_low, alpha_upp])    # 随机抽取可重复列表元素
    s += res
print(s)
# 函数版
def code(n=6):
    s = ""
    for i in range(n):
        num = str(random.randint(0, 9))
        alpha_upp = chr(random.randint(65, 90))
        alpha_low = chr(random.randint(97, 122))
        res = random.choice([num, alpha_low, alpha_upp])
        s += res
    return s

print(code(4))
print(code())
# 进阶版   能够选择是否需要字母  默认6位
def code(n=6, alpha=True):
    s = ''
    for i in range(n):
        num = str(random.randint(0, 9))
        if alpha:
            alpha_upp = chr(random.randint(65, 90))
            alpha_low = chr(random.randint(97, 122))
            num = random.choice([num, alpha_low, alpha_upp])
        s += num
    return s
print(code(4, False))
print(code())
三、time模块
主要用来和时间打交道
引入:
import time
- 常用方法
time.sleep(secs)
(线程)推迟指定的时间运行,单位为秒。
表示时间的三种方式:
字符串数据类型:2018-8-20 格式化时间 —— 给人看的
结构化时间(元组):用来操作的的时间
浮点型数据类型:1534732946.449629 以s为单位 时间戳时间 —— 给计算机看的
1. 时间戳(timestamp)
时间戳表示的是从1970年1月1日00:00:00开始计算按秒计算的偏移量。
print(time.time()) # 获取当前时间戳1534765615.9471586
print(time.strftime('%Y-%m-%d %H:%M:%S'))    # 2018-08-20 19:48:23
2.格式化时间
- strftime()
print(time.strftime('%Y-%m-%d %H:%M:%S'))   # 2018-08-20 19:43:17
print(time.strftime('%c'))  # Mon Aug 20 19:43:17 2018 (国外了解)
python中时间日期格式化符号:
%y 两位数的年份表示(00-99%Y 四位数的年份表示(000-9999%m 月份(01-12%d 月内中的一天(0-31%H 24小时制小时数(0-23%I 12小时制小时数(01-12%M 分钟数(00=59%S 秒(00-59%a 本地简化星期名称 %A 本地完整星期名称 %b 本地简化的月份名称 %B 本地完整的月份名称 %c 本地相应的日期表示和时间表示 %j 年内的一天(001-366%p 本地A.M.或P.M.的等价符 %U 一年中的星期数(00-53)星期天为星期的开始 %w 星期(0-6),星期天为星期的开始 %W 一年中的星期数(00-53)星期一为星期的开始 %x 本地相应的日期表示 %X 本地相应的时间表示 %Z 当前时区的名称 %% %号本身
3.结构化时间
- localtimetime()
print(time.localtime()) # 北京时间
==>time.struct_time(tm_year=2018, tm_mon=8, tm_mday=20, tm_hour=19, tm_min=51, tm_sec=5, tm_wday=0, tm_yday=232, tm_isdst=0)
struct_time元组:
共有九个元素:(年,月,日,时,分,秒,一年中的第几周,一年中的第几天等)
索引(Index)属性(Attribute)值(Values)
0 tm_year(年) 比如2011
1 tm_mon(月) 1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 60
6 tm_wday(weekday) 0 - 6(0表示周一)
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为0
4.时间格式互换
# time时间格式互换

# 格式化时间==>时间戳
fs = time.strftime('%Y-%m-%d %H:%M:%S')
st = time.strptime(fs, '%Y-%m-%d %H:%M:%S')
ts = time.mktime(st)
print(ts)
print(time.time())

# 时间戳==>格式化时间
ts = time.time()
st = time.localtime(ts)
fs = time.strftime('%Y-%m-%d %H:%M:%S', st)
print(fs)
print(time.strftime('%Y-%m-%d %H:%M:%S'))

# 计算时间差
def func(str_time1, str_time2):
    struct_t1 = time.strptime(str_time1, '%Y-%m-%d %H:%M:%S')   # 转化为结构化时间
    struct_t2 = time.strptime(str_time2, '%Y-%m-%d %H:%M:%S')
    timestamp1 = time.mktime(struct_t1) #转换为时间戳
    timestamp2 = time.mktime(struct_t2)
    sub_time = timestamp2 - timestamp1  # 时间戳做减法
    gm_time = time.gmtime(sub_time) # 将时间戳转换为结构化时间

    return print('过去了%d年%d月%d天%d小时%d分钟%d秒' %(gm_time.tm_year-1970, gm_time.tm_mon-1, gm_time.tm_mday-1, 
                                gm_time.tm_hour, gm_time.tm_min, gm_time.tm_sec)) # 减去时间戳元年得到结果 str_time1 = '2018-8-19 12:00:00' str_time2 = time.strftime('%Y-%m-%d %H:%M:%S') # 获取当格式化时间 func(str_time1, str_time2)
三、sys模块:sys模块是和Python解释器打交道的
1 argv
sys.argv
posted @ 2018-08-20 08:36  久末丶  阅读(155)  评论(0编辑  收藏  举报