Python笔记day19(模块)|collections、time、random、os、sys模块

1,内容回顾

# 正则表达式
# 字符组 [字符]
# 元字符
    # \w \d \s
    # \W \D \S
    # . 除了换行符以外的任意字符
    # \n \t
    # \b
    # ^ $ 匹配字符串的开始和结束
    # () 分组  是对多个字符组整体量词约束的时候用的
                #re模块:分组是有优先的
                    # findall
                    # split
    # | 从左到右匹配,只要匹配上就不继续匹配了。所以应该把长的放前面
    # [^] 除了字符组内的其他都匹配
# 量词
    # *   0~
    # +   1~
    # ?  0~1
    # {n} n
    # {n,} n~
    # {n,m} n~m
# 转义的问题
# import re
# re.findall(r'\\s',r'\s')

# 惰性匹配
# 量词后面加问号
    # .*?abc 一直取遇到abc就停

# re模块
# import re
# re.findall('\d','awir17948jsdc',re.S)
# 返回值:列表 列表中是所有匹配到的项

# ret = search('\d(\w)+','awir17948jsdc'# ret = search('\d(?P<name>\w)+','awir17948jsdc'# 找整个字符串,遇到匹配上的就返回,遇不到就None
# 如果有返回值ret.group()就可以取到值
# 取分组中的内容 : ret.group(1)   /  ret.group('name')

# match
# 从头开始匹配,匹配上了就返回,匹配不上就是None
# 如果匹配上了 .group取值

# 分割 split
# 替换 sub 和 subn
# finditer 返回迭代器
# compile 编译 :正则表达式很长且要多次使用

import re

# ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
# #还可以在分组中利用?<name>的形式给分组起名字
# #获取的匹配结果可以直接用group('名字')拿到对应的值
# print(ret.group('tag_name'))   #结果 :h1
# print(ret.group())             #结果 :<h1>hello</h1>

# ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
# #如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
# #获取的匹配结果可以直接用group(序号)拿到对应的值
# print(ret.group(1))
# print(ret.group())  #结果 :<h1>hello</h1>

import re

# ret=re.findall(r"\d+\.\d+|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
# print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
# ret.remove('')
# print(ret)
# ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")
# print(ret) #['1', '-2', '60', '', '5', '-4', '3']
# ret.remove("")
# print(ret) #['1', '-2', '60', '5', '-4', '3']

2,collections模块

这个模块对上面的数据结构做了封装,增加了一些很酷的数据结构,比如:

1)Counter: 计数器,用于统计元素的数量

2)OrderDict:有序字典

3)defaultdict:值带有默认类型的字典

4)namedtuple:可命名元组,通过名字来访问元组元素

5)deque :双向队列,队列头尾都可以放,也都可以取(与单向队列对比,单向队列只能一头放,另一头取)

# from collections import namedtuple
# Point = namedtuple('point',['x','y','z'])
# p1 = Point(1,2,3)
# p2 = Point(3,2,1)
# print(p1.x)
# print(p1.y)
# print(p1,p2)

#花色和数字
# Card = namedtuple('card',['suits','number'])
# c1 = Card('红桃',2)
# print(c1)
# print(c1.number)
# print(c1.suits)

#队列
# import queue
# q = queue.Queue()
# q.put([1,2,3])
# q.put(5)
# q.put(6)
# print(q)
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())   # 阻塞
# print(q.qsize())

# from collections import deque
# dq = deque([1,2])
# dq.append('a')   # 从后面放数据  [1,2,'a']
# dq.appendleft('b') # 从前面放数据 ['b',1,2,'a']
# dq.insert(2,3)    #['b',1,3,2,'a']
# print(dq.pop())      # 从后面取数据
# print(dq.pop())      # 从后面取数据
# print(dq.popleft())  # 从前面取数据
# print(dq)

#有序字典
# from collections import  OrderedDict
# od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
# print(od) # OrderedDict的Key是有序的
# print(od['a'])
# for k in od:
#     print(k)

# from collections import defaultdict
# d = defaultdict(lambda : 5)
# print(d['k'])

3,time模块

格式化时间 —— 字符串: 给人看的
时间戳时间 —— float时间 : 计算机看的
结构化时间 —— 元祖 :计算用的

时间,日期,时间戳之间转换
1.将字符串的时间转换为时间戳
方法:
a = “2013-10-10 23:40:00”
将其转换为时间数组
import time
timeArray = time.strptime(a, “%Y-%m-%d %H:%M:%S”)
转换为时间戳:
timeStamp = int(time.mktime(timeArray))
timeStamp == 1381419600

2.字符串格式更改
如a = “2013-10-10 23:40:00”,想改为 a = “2013/10/10 23:40:00”
方法:先转换为时间数组,然后转换为其他格式
timeArray = time.strptime(a, “%Y-%m-%d %H:%M:%S”)
otherStyleTime = time.strftime(“%Y/%m/%d %H:%M:%S”, timeArray)

3.时间戳转换为指定格式日期:
方法一:
利用localtime()转换为时间数组,然后格式化为需要的格式,如
timeStamp = 1381419600
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime(“%Y-%m-%d %H:%M:%S”, timeArray)
otherStyletime == “2013-10-10 23:40:00”

方法二:
import datetime
timeStamp = 1381419600
dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
otherStyleTime = dateArray.strftime(“%Y-%m-%d %H:%M:%S”)
otherStyletime == “2013-10-10 23:40:00”

4.获取当前时间并转换为指定日期格式
方法一:
import time
获得当前时间时间戳
now = int(time.time()) ->这是时间戳
转换为其他日期格式,如:”%Y-%m-%d %H:%M:%S”
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime(“%Y-%m-%d %H:%M:%S”, timeArray)

方法二:
import datetime
获得当前时间
now = datetime.datetime.now() ->这是时间数组格式
转换为指定的格式:
otherStyleTime = now.strftime(“%Y-%m-%d %H:%M:%S”)

5.获得三天前的时间
方法:
import time
import datetime
先获得时间数组格式的日期
threeDayAgo = (datetime.datetime.now() - datetime.timedelta(days = 3))
转换为时间戳:
timeStamp = int(time.mktime(threeDayAgo.timetuple()))
转换为其他字符串格式:
otherStyleTime = threeDayAgo.strftime(“%Y-%m-%d %H:%M:%S”)
注:timedelta()的参数有:days,hours,seconds,microseconds

6.给定时间戳,计算该时间的几天前时间:
timeStamp = 1381419600
先转换为datetime
import datetime
import time
dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
threeDayAgo = dateArray - datetime.timedelta(days = 3)
参考5,可以转换为其他的任意格式了

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 当前时区的名称
%% %号本身

# print(time.strftime("%Y-%m-%d %a %H:%M:%S"))  #year month day HOUR MINUTE SECOND
# print(time.strftime("%Y/%m/%d %H:%M:%S"))  #year month day HOUR MINUTE SECOND
# print(time.strftime("%m-%d %H:%M:%S"))  #year month day HOUR MINUTE SECOND
# print(time.strftime("%H:%M:%S"))  #year month day HOUR MINUTE SECOND
# print(time.strftime("%H:%M"))  #year month day HOUR MINUTE SECOND


# struct_time = time.localtime()
# print(struct_time)
# print(struct_time.tm_year)

import time
# 时间戳和结构化时间
# t = time.time()
# print(t)
# print(time.localtime(3000000000))
# print(time.gmtime(t))

# print(time.mktime(time.localtime()))

# print(time.strptime('2000-12.31','%Y-%m.%d'))
# print(time.strftime('%m/%d/%Y %H:%M:%S',time.localtime(3000000000)))

# print(time.asctime())

4,random模块

最常用的函数有如下:
random.randint
random.randint(1,10)
语句的含义是产生1至10(包含1与10)的一个随机数(整数int型)。(参数为整数不可为浮点数否则会报错)
random.randint(20, 10) #该语句是错误的。下限必须小于或等于上限。
random.random
random.random()
生成一个0到1之间的随机浮点数,包括0但不包括1,也就是[0.0, 1.0)。
random.uniform
random.uniform(a, b)
生成a、b之间的随机浮点数。不过与randint不同的是,a、b可以不是整数,也不用考虑大小。

random.uniform(3.65,10.56)#可以这样
random.uniform(10.56, 3.65)#也可以这样
random.choice
random.choice(seq)
从序列中随机选取一个元素。seq需要是一个序列,比如list、元组、字符串。
random.choice([1, 2, 3, 5, 8, 13]) #list
random.choice(‘hello’) #字符串
random.choice([‘hello’, ‘world’]) #字符串组成的list
random.choice((1, 2, 3)) #元组
都是可行的用法。
random.randrange
random.randrange(start, stop, step)
生成一个从start到stop(不包括stop),间隔为step的一个随机整数。start、stop、step都要为整数,且start 小于stop。
random.sample
random.sample(p, k)
从p序列中,随机获取k个元素,生成一个新序列。sample不改变原来序列。
这个模块很 666,还支持三角、β分布、指数分布、伽马分布、高斯分布等等非常专业的随机算法。
random.shuffle
random.shuffle(x)
把序列x中的元素顺序打乱。shuffle直接改变原有的序列。如:

import random
a=[1,2,3,4,5,6]
random.shuffle(a)
print(a)

结果如下:
[5, 1, 3, 6, 4, 2]
新手在使用此函数时可能会出现一些错误,如下:

import random
a=[1,2,3,4,5,6]
print(random.shuffle(a))

使用此方法会出现None结果,原因是random.shuffle() 是用来打乱列表元素的,没有返回值,所以不能用print(random.shuffle(a))来输出打印打乱


5,os模块

os模块的作用:

  os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/删除某个文件/获取文件大小……

  另外,os模块不受平台限制,也就是说:当我们要在linux中显示当前路径时就要用到pwd命令,而Windows中cmd命令行下就要用到这个,额…我擦,我还真不知道,(甭管怎么着,肯定不是pwd),这时候我们使用python中os模块的os.path.abspath(name)功能,甭管是linux或者Windows都可以获取当前的绝对路径。

os模块的常用功能:

1 os.name #显示当前使用的平台

2 os.getcwd() #显示当前python脚本工作路径

3 os.listdir(‘dirname’) #返回指定目录下的所有文件和目录名

4 os.remove(‘filename’) #删除一个文件

5 os.makedirs(‘dirname/dirname’) #可生成多层递规目录

6 os.rmdir(‘dirname’) #删除单级目录

7 os.rename(“oldname”,”newname”) #重命名文件

8 os.system() #运行shell命令,注意:这里是打开一个新的shell,运行命令,当命令结束后,关闭shell

9 os.sep #显示当前平台下路径分隔符

10 os.linesep #给出当前平台使用的行终止符

11 os.environ #获取系统环境变量

12 os.path.abspath(path) #显示当前绝对路径

13 os.path.dirname(path) #返回该路径的父目录

14 os.path.basename(path) #返回该路径的最后一个目录或者文件,如果path以/或\结尾,那么就会返回空值。

15 os.path.isfile(path) #如果path是一个文件,则返回True

16 os.path.isdir(path) #如果path是一个目录,则返回True

17 os.stat() #获取文件或者目录信息

18 os.path.split(path) #将path分割成路径名和文件名。(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)

19 os.path.join(path,name) #连接目录与文件名或目录 结果为path/name

import  os
# print(os.getcwd())
# os.chdir(r'C:\Users\Administrator\PycharmProjects')
# print(os.getcwd())

# os.chdir('..')
# print(os.getcwd())
# os.makedirs('dirname1/dirname2')
# os.removedirs('dirname1/dirname2')

# os.mkdir('dirname1/dirname')

# print(os.listdir(r'C:/Users/Administrator/PycharmProjects/s9'))

# print(os.stat('1.复习.py'))

# print(os.sep)  # python代码跨平台 :linux windows
# /user/bin/

# os.system("dir")
# ret = os.popen("dir").read()
# print(ret)

# print(os.environ)

# print(os.getcwd())
# print(os.path.split(os.getcwd()))

# print(os.path.join(r'C:\Users\Administrator','user','local'))
# print(os.getcwd())
# print(os.path.getsize(os.path.join(os.getcwd(),'1.复习.py')))

6,sys模块

sys模块的常见函数列表
sys.argv: 实现从程序外部向程序传递参数。

sys.exit([arg]): 程序中间的退出,arg=0为正常退出。

sys.getdefaultencoding(): 获取系统当前编码,一般默认为ascii。

sys.setdefaultencoding(): 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding(‘utf8’),此时将系统默认编码设置为utf8。(见设置系统默认编码 )

sys.getfilesystemencoding(): 获取文件系统使用编码方式,Windows下返回’mbcs’,mac下返回’utf-8’.

sys.path: 获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到。

sys.platform: 获取当前系统平台。

sys.stdin,sys.stdout,sys.stderr: stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

import sys
# print(sys.platform)
# print(sys.version)


# print(sys.path.clear())


ret = sys.argv
name = ret[1]
pwd = ret[2]
if name == 'alex' and pwd == 'alex3714':
    print('登陆成功')
else:
    print("错误的用户名和密码")
    sys.exit()
print('你可以使用计算器了')

猜你喜欢

转载自blog.csdn.net/qq_34755081/article/details/81807775