05-python
python模块的定义;
Python 模块(Module),是一个Python文件,以.py 结尾,包含了Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的Python代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
python中的模块:
1.包和目录的区别,包和模块可以被其他模块导入,但是目录不能被导入
2.新建一个包里面有一个默认__init__.py模块,这个模块是用来初始化当前这个包下的所有内容
3.有__init__.py模块才能称之为包
4.python里面分为自带的模块和自己创建的模块
第一种导入模块的方法,直接导入整个模块
time模块中常见的方法: time() #1970到现在经过的秒数 import time print(time.time()) #1678843708.3597147,就是通过模块名.函数名来进行调用 print(time.ctime()) #固定格式的当前时间 Wed Mar 15 09:29:56 2023 time.sleep(3) #休眠等待3秒 强制等待 print(time.ctime()) asctime() 转化为asc码格式显示 print(time.asctime()) # Wed Mar 15 09:33:57 2023 strftime() 时间格式化 print(time.strftime('%Y-%m-%d-%H-%M-%S')) #2023-03-15-09-36-59 localtime() 当地时间 print(time.localtime()) #显示当地时间
第二种导入模块方法,导入模块中具体的函数
from time import time #从time的模块中导入time函数 print(time()) from time import ctime #从time的模块中导入ctime函数 print(ctime()) from time import sleep #从time的模块中导入sleep函数 sleep(3)
第三种导入模块方法
from time import * print(time()) print(ctime()) sleep(3)
第四种导入模块的方法。导入具体函数并取别名,不管是函数还是变量、类、常量、对象都可以导入
from time import ctime as a #给函数取别名为a print(a()) # Wed Mar 15 09:46:18 2023 import os,time,json,sys #同时导入多个模块用逗号隔开
第五种导入模块方法,不同层级的模块找上级用.表示
from duoceshi31.test1 import * #通过包名.模块导入的所有内容(函数),在duoceshi31包建立一个test1.py文件
python中的random模块
生成随机浮点数、整数、字符串、甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等
random模块中的常见用法:
random.random() #该方法是生成0-1之间的浮点数,但是能取到0,取不到1 import random print(random.random()) random.randint(x,y) #该方法生成指定范围内的整数,包括开始和结束值 print(random.randint(1,5)) random.randrange(x,y,step) #生成指定范围内的奇数,不包括结束值 print(random.randrange(1,10,2)) #random.randrange与普通range的使用规则一样,只不过增加随机效果 random.sample(seq,n) #从序列seq中选择n个随机且独立的元素 list1=['test','dcs31',11,77,55] print(random.sample(list1,2)) # 已知的列表中随机选取2个元素组成一个新的列表 random.choice(test) #生成随机字符 name='!@#$#%%$$%^&&**D123' print(random.choice(name)) #随机选择一个字符 random.shuffle(list) #洗牌(随机数列) list1=['test','dcs31',11,77,55] random.shuffle(list1) print(list1) # 多次执行,随机取结果 hashlib.md5() #MD5加密 import hashlib #导入hashlib模块 ===》不可逆加密 md5=hashlib.md5() #通过hashlib模块中的md5函数创建一个对象 md5.update('123456'.encode('utf-8')) #通过md5对象调用的update函数对字符串123456进行加密 print(md5.hexdigest()) #调用hexdigest()生成一个16进制的且为32位的字符串e10adc3949ba59abbe56e057f20f883e 生成一个密文 import string num1=string.digits #利用string模块中digits函数拿到0-9的数字(字符串类型) num2=string.ascii_letters #生成52个英文字母 print(num1) print(num2)
面试题:
10万的表数据存放在一个数据库里面然后进行同步到其他数据库,同步完成后你怎么保证两个数据库数据是一致的
第一种方法:可以通过对各自用md5加密之后的密文进行比较
第二种方法:用beyond对比工具
1.使用random模块随机生成手机号码、自定义手机号开头前三位
import random,string def get_phone(): list1=['153'] #定义一个153开头的列表,手机号码前三位 num=string.digits #0-9随机取 for i in range(8): list1.append(random.choice(num)) #append添加,循环八次,每一次随机选择一个放入列表list1中 print(list1) print(''.join(list1)) #打印最后一次 如果是数字进行拼接需要转化否则报错 get_phone()
2、用random模块随机生成6位数验证码
import random,string def verify(): num=string.digits+string.ascii_letters # print(random.sample(num,6)) return (''.join(random.sample(num,6))) verify()
3、通过md5加密算法把随机生成的6位数验证码进行加密返回16进制的字符串
import hashlib def code(): values=verify() #调用verify函数的返回值 md5=hashlib.md5() md5.update(values.encode('utf-8')) print(md5.hexdigest()) if __name__ == '__main__': code()
python中的os模块
os模块提供了多数操作系统的功能接口函数
当os模块被导入后,它会自适
应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编
程时,经常和文件、目录打交道,所以离不了os模块
os模块中常见的方法:
import os os.getcwd() #获取当前执行命令所在目录 print(os.getcwd()) os.path.isfile() #判断是否是文件 print(os.path.isfile(r'D:\python\dcs31\duoceshi31')) #返回是False os.path.isdir() print(os.path.isdir(r'D:\python\dcs31\duoceshi31')) #返回是True os.path.exists() #判断文件或者目录是否存在 print(os.path.exists('D:\python\dcs31\lesson1.py')) #返回True os.listdir(dirname) #列出指定目录下的目录或者文件 print(os.listdir('D:\python\dcs31\duoceshi31')) #返回 ['test1.py', '__init__.py', '__pycache__'] os.path.split(name) #分割文件与目录 print(os.path.split('D:\python\dcs31\lesson1.py')) #返回结果:('D:\\python\\dcs31', 'lesson1.py') os.path.join(path,name) #拼接目录与文件名或者目录名 print(os.path.join('D:\python\dcs31\duoceshi31','test001.txt')) #结果:D:\python\dcs31\duoceshi31\test001.txt os.mkdir(dir) #创建一个目录 print(os.mkdir('D:\python\dcs31\duoceshi')) #创建一个目录叫duoceshi os.rename(old,new) #更改目录或者文件名称 print(os.rename('D:\python\dcs31\duoceshi','D:\python\dcs31\dcs')) #把duoceshi更改为dcs print(os.rename(r'D:\python\dcs31\duoceshi31\test1.py','D:\python\dcs31\duoceshi31\dcs31.py')) #把test1.py文件改成dcs31.py文件
python中的re正则模块,实现一个编译查找
一般在日志处理或者文件处理时用的比较多,正则表达式主要用于模式匹配和替换工作
预定义字符集匹配:
\d:数字0-9
\D:非数字
\s:空白字符
\n:换行符
\r:回车符
re模块数量词匹配:
符号^:表示的匹配字符以什么开头
符号$:表示的匹配字符以什么结尾
符号*:匹配*前面的字符0次或n次
eg:ab* 能匹配a 匹配ab 匹配abb
符号+:匹配+前面的字符1次或n次
符号?:匹配?前面的字符0次或1次
符号{m}:匹配前一个字符m次
符号{m,n}:匹配前一个字符m到n次(包括n次),m或n可以省略,mn都是正整数
1.match函数
从第一个字符开始匹配,如果第一个字符不是要匹配的类型、则匹配失败并报错
注意:如果规则带了'+',则匹配1次或者多次,无'+'只匹配一次
import re str1=re.match('\d','239jnkjhhfds343253565467kjhkj') #d是匹配0-9,第一个字符符合0-9之间,打印结果2,无+号只匹配一次 str1=re.match('\d','d239jnkjhhfds343253565467kjhkj') #报错,没有这个属性 str1=re.match('\d*','239jnkjhhfds343253565467kjhkj') #239 匹配到j自动停止 str1=re.match('\d+','239jnkjhhfds343253565467kjhkj') #239 匹配到j自动停止 str1=re.match('\d?','239jnkjhhfds343253565467kjhkj') #2 str1=re.match('\d?','w239jnkjhhfds343253565467kjhkj') # 为空 0次开始 str1=re.match('\d+','w239jnkjhhfds343253565467kjhkj') #报错 从1次开始找 str1=re.match('\d*','w239jnkjhhfds343253565467kjhkj') #为空 从0开始开始找 str1=re.match('\d{2}','239jnkjhhfds343253565467kjhkj') #23 str1=re.match('\d{4}','239jnkjhhfds343253565467kjhkj') #报错,因为匹配不到就报错 str1=re.match('\d{2,6}','239jnkjhhfds343253565467kjhkj') #239 匹配不到就终止 str1=re.match('\d{2,3}','2d39jnkjhhfds343253565467kjhkj') #报错,匹配不到两次就报错 str1=re.match('\d{2,3}','239jnkjhhfds343253565467kjhkj') #239 str1=re.match('^2\d','239jnkjhhfds343253565467kjhkj') #23 因为\d是匹配一次,如果不是2开头就报错 str1=re.match('^2\d{2}','239jnkjhhfds343253565467kjhkj') #239 str1=re.match('^2\d{3,16}','239jnkjhhfds343253565467kjhkj') #报错 str1=re.match('^2\D','239jnkjhhfds343253565467kjhkj') #报错 \D代表匹配非字符 str1=re.match('^2\D','2¥9jnkjhhfds343253565467kjhkj') #2¥ str1=re.match('^2\D{2,8}','2njjnkjhhfds343253565467kjhkj') #2njjnkjhh str1=re.match('^2\D{1,3}$','2njjnkjhhfds@') #报错 ,以2开头并且包括1-3个非数字字符结尾 str1=re.match('^2\D{1,3}$','2njjnkjhhf2s@') #报错 str1=re.match('^2\D{1,3}$','2njj') #结果:2njj str1=re.match('^2\D{1,3}$','2nj') # 2nj str1=re.match('^1[1358][2469]\d{8}$','15488889999') #匹配以1开头,第二位是【1358】里面随机一位,第三位是【2469】里面的随机一位,以8位结尾数字结果 str1=re.match('^1[0-9][0-9]\d{8}$','12345678909') #匹配以1开头,第二位是【0-9】里面随机一位,第三位是【0-9】里面的随机一位,以8位结尾数字结果 str1=re.match('^1[a-z][A-Z]\d{8}$','1aA88888888') #匹配以1开头,第二位是【a-z】里面随机一位,第三位是【A-Z】里面的随机一位,以8位结尾数字结果 print(str1.group()) # 通过group函数把结果显示出来
2.search
从第一个字符开始查找、一找到就返回第一个字符串,找到就不往下找,找不到则报错
import re str1=re.search('\d','239jnkjhhfds343253565467kjhkj') #2 str1=re.search('\d+','239jnkjhhfds343253565467kjhkj') #239 str1=re.search('\d*','239jnkjhhfds343253565467kjhkj') #239 str1=re.search('\d+','a239jnkjhhfds343253565467kjhkj') #239 从第一次开始找的情况下可以穿透一次 ,直到第二次匹配不到 str1=re.search('\d*','a239jnkjhhfds343253565467kjhkj') #为空 str1=re.search('\d*','a23n9jnkjhhfds343253565467kjhkj') #为空 print(str1.group())
3.findall
从第一个字符开始查找,找到全部相关匹配为止,找不到返回一个列表[]
import re str1=re.findall('\d','239jnkjhhfds343253565467kjhkj') #['2', '3', '9', '3', '4', '3', '2', '5', '3', '5', '6', '5', '4', '6', '7'] str1=re.findall('\d+','a239jnkjhhfds343253565467kjhkj') #['239', '343253565467'] str1=re.findall('\D+','a239jnkjhhfds343253565467kjhkj') #['a', 'jnkjhhfds', 'kjhkj'] str1=re.findall('error','a239jerrorhfdserror3565errorhkjerror') #['error', 'error', 'error', 'error'] 通过error匹配,打印出列表的error个数,以列表的形式输出 str1=re.findall('error','a239jnkjhhfds343253565467kjhkjerro') #[] str1=re.findall('dcs()dcs','dcs39jnkjhhfds343253565467kjhkjdcs') #dcs()dcs中的空括号不会匹配前后内容,只会匹配括号里面的内容返回结果:【】注意:碰到小括号只会匹配小括号里面的内容 str1=re.findall('dcs(.+)dcs','dcs39jnkjhhfds343253565467kjhkjdcs') #['39jnkjhhfds343253565467kjhkj'] 匹配任意字符.+是0次或者n次匹配dcs之间输出的内容 str1=re.findall('"values":"(.+)"','"values":"abc12345","values":"asd54321"') #['abc12345","values":"asd54321'] 匹配取对应键后面所有元素 print(str1) #这里不需要group函数 只有match和search函数需要group
4.compile
编译模式生成对象,找到全部相关匹配为止,找不到返回一个列表[]
import re str1=re.compile('error') str2=str1.findall('a239jerrorhfdserror3565errorhkjerror') print(str2) #['error', 'error', 'error', 'error']