模块定义:包含一些数据、函数、类的文件,通常以.py结尾
1.1 模块导入第一种
import 模块名
print('模块1')
def f1():
print("模块1的f1")
import module01 module01.f1() 模块1 模块1的f1
作用:将某模块整体导入到当前模块中
使用:模块名.成员
本质:使用变量名关联模块地址
第二种
from 模块名 import 成员
print('模块1')
def f1():
print("模块1的f1")
from module01 import f1 f1() 模块1 模块1的f1
本质:将指定的成员导入到当前模块作用域中
第三种
from 模块名 import * # * 全部的意思
print('模块1')
def f1():
print("模块1的f1")
from module01 import * f1() 模块1 模块1的f1
本质:将指定模块的所有成员导入到当前模块作用域中
注意:导入进来的成员不要与当前模块成员名称相同
如果相同了--》就近原则
as:取别名
1.2 隐藏成员from module01 import f1 as module01_f1
模块中以下划线(_)开头的属性,不会被导入,通常称这些成员为隐藏成员。
隐藏成员 不能通过
from 模块 import *
注意:隐藏成员可以对其他形式调用。
1.3 模块变量__file__ : 模块对应的文件路径名 ,返回绝对路径。
__name__ : 模块自身的名字,可以判断是否为主模块。
在家是程序,在外是模块
python的__main__的作用:
1.__main__ 如果是作为模块来运行,__name__的值是模块名
2.把一些非必要的代码,放到main函数里面
main的标准语法:
if __name__ == '__main__':
print(’我是作为程序执行的)
快速写法:
pycharm中输入main,然后按tab 或者 回车
模块可以分为四大类
1.内置模块:在解析器的内部可以直接使用
2.标准库模块:安装Python时已安装且可以直接使用
time,random..re,os
直接import
3.第三方模块,通常是开源的,需要自己安装
reqeusts 爬虫模块
pymysql 连接数据库
pandas
.....
pip install 模块名
下载第三方模块可以配置国内源
pip国内源
1)清化大学
PIP源地址:https://pypi.tuna.tsinghua.edu.cn/simple
2)阿里云
PIP源地址:http://mirrors.aliyun.com/pypi/simple/
3)豆瓣
PIP源地址:http://pypi.douban.com/simple/
4)中国科学技术大学
PIP源地址:http://pypi.mirrors.ustc.edu.cn/simple/
5)华中科技大学
PIP源地址:http://pypi.hustunique.com/pip install 模块名 -i 源地址
4.用户自己编写模块(可以作为别人的第三方模块)
2.包(package)包的定义:将模块以文件夹的形式进行分组管理
包的作用:让一些相关的模块组织在一起,使得逻辑更加清晰
方法一
from 包.模块 import 成员
方法二
from 包 import 模块
方法三
from 包.包.....模块 import 成员
__init__文件是包内必须存放的文件,会在包加载时被自动调用。
总结包的核心作用:
把一些相同,类似功能的模块放到同一个包里面,进行统一管理
在导入这个包里面的模块时,__init__.py的代码会自动执行
利用这个机制,在__init__代码里面写上关于包内模块的使用说明
Python标准库
3.1 syssys(system) :里面主要提供了一些变量和函数,使得我们获取到Python解释器的信息。
sys.module:获取当前程序中引入的所有模块(字典{模块的名字,模块对象})
pprint.pprint() # 该方法可以对我们打印的数据做简单的格式化
sys.path:返回一个列表,列表中保存的是模块的搜索路径
sys.platform:表示的是返回一个平台
sys.exit():用来退出程序,可以附加消息
......
3.2 osos:系统交互模块
os模块可以让我们对操作系统进行访问。
3.3 timeos.system() # 可以用来执行操作系统的命令
os.getcwd() # 获得当前python工作目录
os.mkdir() # 里面放的就文件名,创建文件夹
os.rmdir() # 里面放的就文件名,删除文件夹 只能删除空文件夹
os.remove('test.py') # 删除文件
os.rename('原文件名','新文件名') # 重命名
os.chdir() # 切换程序执行的位置os.listdir() # 获取指定目录下所有文件和目录名
os还有专门函数功能可以帮忙判断是否是文件夹
os.path.exists(path):判断文件或者文件夹是否存在
os.path.isfile(path):判断是否为文件
os.path.isdir(path):判断是否为目录(文件夹)
time.time() # 返回一个浮点数函数,UTC时间:从1970年开始到现在所经过的秒数
time.localtime()
time.sleep()
time.strftime('格式',要转换的时间) # 格式化时间再输出
%Y 年
%m 月 小写
%d 日 小写
%H 时
%M 分
%S 妙
import time
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) #time.localtime()也可以不用写
2022-05-01 16:19:14
3.4 random
random:随机函数
random.random() # 生成一个 大于0 小于1的随机数
random.randint(start,end) # 生成start-end之间的随机整数
random.choice(list) # 指定的列表中随机抽取
random.uniform(start,end) # 生成start-end之间的随机小数
random.shuffle(seq) # 打乱序列类型的顺序
a = random.random() print(a) b = random.randint(1, 100) print(b) list1 = ['石头', '剪刀', '布'] c = random.choice(list1) print(c) d = random.uniform(0, 1) print(d) list2 = ['石头', '剪刀', '布'] e = random.shuffle(list2) print(list2) 0.00810919793613496 84 剪刀 0.7731057556692558 ['剪刀', '布', '石头']
# 制作一个验证码a-z,A-Z
def yzm():
yzm = ''
for i in range(4):
yzm += chr(random.randint(65, 122))
print(yzm)
yzm()
UKAz
3.5 json
json:json是一种文件的存储格式。
json是一种兼容性很强的文件格式。网络上大部分数据是以json形式传递让每个语言都可以访问。
序列化和反序列化:
序列数据:机器码(底层0和1)。
反序列数据:程序员看的代码。
json.dumps() # 序列化数据 转为json
json.loads() # json数据-》python数据
li1 = [1, 2, '爬虫'] s1 = json.dumps(li1) print(s1) print(type(s1)) s2 = json.loads(s1) print(s2) print(type(s2)) [1, 2, "u722cu866b"]3.6 re[1, 2, '爬虫']
正则表达式:普通字符和元字符构成字符串,描述一类字符串规则。
match: 匹配了就返回结果,如果匹配不上就会None
s1 = 'abcd' pattern = 'ab' res = re.match(pattern, s1) #print(res) print(res.group()) ab
findall : 所有能匹配的都放到列表中 。
s1 = 'abcdabababab' pattern = 'ab' res = re.findall(pattern, s1) print(res) ['ab', 'ab', 'ab', 'ab', 'ab']3.6.1 元字符
. 表示任意一个字符,但是除了n
d 表示0-9之间任意一个数字
D 表示非数字
s 表示空白字符串
S 非空白
w 英文字母、数字、下划线、汉字
W 非w
print(re.match('.', 'abc'))
print(re.match('.', 'nabc'))
print(re.match('d', '123'))
print(re.match('D', 'abc'))
print(re.match('s', ' '))
print(re.match('S', 'abc'))
print(re.match('w', '_abc'))
print(re.match('W', 'abc'))
None
None
字符集:用中括号来表示,表示一个字符范围。
print(re.match('[abcd]', 'zbc'))
print(re.match('[abcdz]', 'zbc'))
[a-d] 表示一个范围,a-d之间字母
print(re.findall('[a-d]', 'zabc'))
print(re.findall('[a-z]', 'zabc'))
print(re.findall('[a-zA-Z]', 'Zabcc'))
[0-9] 表示0-9数字
print(re.match('[0-9]', '3A'))
print(re.findall('[a-d]', 'zabc'))
print(re.findall('[a-z]', 'zabc'))
print(re.findall('[a-zA-Z]', 'Zabcc'))
print(re.match('[0-9]', '3A'))
['a', 'b', 'c']
['z', 'a', 'b', 'c']
['Z', 'a', 'b', 'c', 'c']
^ 取反 #是在字符集中表示取反意思
print(re.findall('[^a-d]', 'zabc'))
['z']
多字符匹配:
3.6.2 数量规则print(re.match('[Ss][Ss][Ss][Ss][Ss][Ss]', 'c乃荣46@'))
* 匹配前一个字符的任意次数,包括0次。
+ 匹配前一个字符重复匹配1次以上。
? 匹配前一个字符出现0次或者1次。
{m},{m,},{m,n}
print(re.match('d*', 'a123456789'))
print(re.match('d+', 'a123456789'))
print(re.match('d?', '12345a6789'))
print(re.match('d{3}', '123456789'))
print(re.match('d{3,}', '123456789'))
print(re.match('d{3,6}', '123456789'))
None
3.6.3 边界处理
^ 开始
$ 结束
print(re.match('1[358][5-9]d{8}',"13645678912"))
print(re.match('1[358][5-9]d{8}',"1364567891211111"))
print(re.match('^1[358][5-9]d{8}$',"1364567891211111"))
None
3.6.4 分组匹配
括号进行分组
分组:用圆括号起到分组的作用
group(n) n表示你的第几个分组,默认是1开始
groups() 返回一个元组,所有的分组都输出。
t = '2022-01-15'
print(re.match('(d{4})-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])', t))
res=re.match('(d{4})-(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-9]|3[0-1])', t)
print(res.group(0))
print(res.group(1))
print(res.group(2))
print(res.group(3))
print(res.groups())
2022-01-15
2022
01
15
('2022', '01', '15')
1的方式
正则表达式的字符串前面最好加上r
r:原始字符串转义失效,取消转义 。
1 就是代表第一个分组的内容。
n就是代表第n个分组的内容。
tag = '3.6.5 方法详解百度一下,你就知道 ' res = re.match(r'<(w+)>([wW]*)(1)>', tag) print(res.group(2)) 百度一下,你就知道
compile(pattern) 编辑的意思,用于同一个正则表达式被调用多次。
match()
group(n) n表示你的第几个分组,默认是1开始
groups() 返回一个元组,所有的分组都输出。
tag = '百度一下,你就知道 ' res = re.compile(r'<(w+)>([wW]*)(1)>') print(res.match(tag))
findall() 返回的是一个列表,查找数据里面所有能匹配的正则表达式的结果。
print(re.findall('d', '123值zxc234'))
print(''.join(re.findall('d', '123值zxc234')))
['1', '2', '3', '2', '3', '4']
123234
split() 切割
t = '2022-05-03'
print(re.split('-', t))
['2022', '05', '03']
sub() 替换
t = '2022a-05a-03a'
print(re.sub('a','b',t,count=1))
print(re.sub('a','b',t,count=3))
2022b-05a-03a
2022b-05b-03b
4.制作一个简易的猜拳小程序
import sys
import time
import re
import random
cz = ['剪刀', '石头', '布']
show_time = time.strftime('%Y-%m-%d %H:%M:%S')
print(show_time)
print(f'欢迎来到猜拳游戏当前时间是:{show_time}')
password = input('请输入登录密码:')
res = re.match(r'^1[3458]d{4}(d)1{4}$', password)
if res == None:
print('登录失败,您的密码错误。')
else:
print('登录成功')
while True:
print('-' * 50)
user = input('请进行猜拳(输入0退出游戏):')
ai = random.choice(cz)
if user in cz:
if (user == '剪刀' and ai == '布') or (user == '石头' and ai == '剪刀') or (user == '布' and ai == '石头'):
print(f'n你赢了,你出的是{user},电脑出的是{ai}n')
elif user == ai:
print(f'n平局,你出的是{user},电脑出的是{ai}n')
else:
print(f'n你输了,你出的是{user},电脑出的是{ai}n')
elif user == '0':
sys.exit('成功退出游戏~~~~~~')
else:
print('出招错误')



