周总结(4)
周总结(4)
异常处理
异常处理的语法结构
try:
被检测的代码
except Exception as e:
针对上述被检测的代码指定的方案
可以和else结合使用:
被检测代码运行正常没有报错后执行else子代码
可以和finally结合使用:
无论try子代码是否报错都会执行finally代码
---------------------------------------------------
补充关键字:
断言 assert
name = '我是字符串'
assert isintance(name, str)
主动抛异常:
raise
name == '我是好人'
if name == '我是好人'
raise Exception('我是好人')
else:
print('他不是好人')
异常处理之for 循环的底层代码
l1 = [1,2,3,4,5,6,7,8]
res = iter(l1)
while True:
try:
print(next(res))
except Exception as e:
break
生成器对象
含有iter和next方法的迭代器对象
函数体代码含有 yield 关键字
函数名加括号不会执行代码,会产生一个生成器对象。
生成器对象使用双下next才会运行代码,并且遇到 yield 会暂停,并把 yield 后的返回值返回 。 下次执行 接着上次 yield 后开始。
生成器语法
函数体代码中 含有 yield关键字
def foo():
try:
yield 返回值 # 也可以不填写返回值
res = foo()
print(res)
生成器写range方法
def my_range(start, end = None, step = 1):
if not end:
end = start
start = 0
while start < end:
yield start
start += step
for i in my_range(100):
print(i)
生成器表达式
res = (返回值 for i in 可迭代对象)
特点 :简化代码 节省空间
代码展示:
res = (i for i in 'zifuchuan')
print(next(res))
模块
什么是模块
模块就是内部含有一定功能(代码)的py文件。封装好的功能体
模块封装好之后可以直接使用。
好处:
极大提升开发效率
模块的表达形式:
1.使用python代码编写的文件
2.多个py文件组成的文件夹 也可称 包
3.已经被编译共享库或者dll的c 或c++扩展
4.使用c编写并链接到 python解释器的内置模块
模块的分类
1.内置模块
解释器自带的
2.自定义模块
程序员自己写的代码 封装好。
3.第三方模块
别人写好放在网上可以下载使用
导入模块的两种句式
1. import ...
eg:
import md
print(md.name)
一定要分清楚哪个是执行文件,哪个是被导入文件(模块)
使用模块名.的方式 可以调用被导入文件内的所有名称。
优点:
不会轻易的和被执行文件中相同的名字发生冲突。
底层:
执行文件会产生一个 执行文件的名称空间。
导入模块后 会产生一个模块的名称空间。
在执行文件空间内会产生一个 模块的名字并指向模块的名称空间。
通过模块名.的方式就可以使用模块名称空间内的所有名字
语法:
import time
time.time
--------------------------------------------------
2. from .. import ..
代码:
from md import name,age # import 后面写什么名字就只能用什么名字
print(name)
print(age)
优点:指名道姓的导入模块名称空间中的需要使用的名字。
缺点: 容易和执行文件中的名字起冲突
底层原理:
执行执行文件时 产生执行文件的名称空间
导入模块时 产生模块名称空间
当前执行文件直接通过 名字 就可以访问模块名称空间中指定的名字
句式补充:
1.起别名:
模块名特别长的时候我们可以 简写
import mokuaiminghaochang as hc
from mokuaiminghaochang import name as n
2.多个模块导入
import a,b,c
功能相似度高推荐使用, 相似度低还是单模块导入吧
3. 连续导入模块
解释器只会导入一次
循环导入问题
两个文件彼此导入彼此 并且相互使用 相同的名字时,极容易出现报错
解决方法:
编写代码中避免出现循环导入
确保名字在使用前已经准备完毕
无法避免循环导入解决方法:
把名字写在 导入模块句式 上面。
导入模块的句式写在函数体代码中。
使用多个文件 来彼此导入
判断文件类型
py文件分为两种:
1.执行文件
2.被导入文件
当我们在执行文件中使用__name__ 时,可以打印该值的结果,如果是 __main__ 那么就是执行文件。
如果返回的是模块名 那么则是被导入文件。
我们也可以使用__name__区分 被导入的代码和测试代码
if __name__ == '__main__':
print('如果我在被执行文件内(模块),这里的子代码就无法运行哦')
#如果 是在执行文件内,就会执行子代码,打印。如果是在被导入文件内,对应的值是模块名。则条件不成立。
简写 输入main + tab自动补全
-------------------------------------------------
补充:
from a import *
*默认将模块名称空间所有名字导入
使用__all__ = ['名字1','名字2']
只能使用 名字1 和名字2 其他名字均不可使用
模块的查找顺序
内存 — 内置模块 - sys.path
如果都找不到就直接报错
绝对导入与相对导入
在导入模块的时候一切查找模块的句式都是以执行文件为准。
无论导入的句式在执行文件中还是被导入文件中。
绝对导入:
from my1,my2,my3 import name # 精确到变量名
from my,my import my3 # 也可以精确到模块名
相对导入:
只能在模块文件中使用
from . import md
.表示当前目录
..表示上一层目录
../..表示上上一层目录
包
本质就是含有__init__.py 的文件夹
包的具体使用
虽然python3 中 不是必须要添加__init__.py 文件的,但是为了兼容性更好 一般还是手动给加上。
在导入包的时候 其实是和init 索要名字。
方法1:如果想要通过包的名字直接使用包里面所有的模块。那么就需要在 init.py 文件里提前导入模块。
上述方式的好处在于__init__可以提前帮你准备好可以使用的名字
方法2: 可以忽略 init 的存在,直接使用绝对导入
不需要考虑包的存在,直接当场普通文件
编程思想的演变
1. 面条版阶段
所有的代码都堆叠在一块
2. 函数版阶段
根据功能不同封装不同的函数
3. 模块板阶段
根据功能不同 拆分成不同的py文件
软件开发目录
bin 启动文件
start.py
conf 配置文件
setting.py
core 核心文件
src.py
inteface 接口文件
goods.py # 根据具体业务逻辑划分对应的文件
user.py
account.py
lib 公共功能
common.py
log 日志文件
log.log
db 存放用户数据
userinfo.py
db_handler.py
readme 说明书
erquitements.txt 存放模块及其版本
常用内置模块collections模块
具名元组: namedtuple
坐标用法:
from collections import namedtuple
point = namedtuple('坐标', ['x','y'])
p1 = point(3, 5)
print(p1)
坐标(x = 3, y = 5)
扑克牌用法:
card = namedtuple('扑克牌', ['num','color'])
c1 = card('A','黑♠')
c2 = card('A','红♥')
print(c1,num, c1, color) # A 黑♠
print(c2,num, c2,color) # A 红♥
统计: counter
for collertions import Counter
可以追踪数据值出现的次数并 以字典形式打印出对应次数
c = Counter('abcdeabcdabcaba')
print(c)
# Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
deque 队列
队列:先进先出 默认只有一端进一端出
堆栈:先进后出
可以使用 append 方法加上left 从左添加
from collections import deque
l1 = deque([1,2,3])
l1.append(35)
# 尾部添加35
l1.appendleft(1)
# 列表左边开始添加 1
也可以使用pop方法 弹出数据值
l1.pop()
# 弹出尾部数据
l1.popleft()
# 从左边弹出
--------------------------------------------------
import queue
a1 = queue.Queue(2) # 最多只能放2个数据
a1.put(111)
a1.put(222)
a1.put(333)
print(a1.get())
print(a1.get())
print(a1.get()) # 上面我们规定了最多只能放2个数据,如果超出则程序会原地等待
常用内置模块之time时间模块
三种时间表现形式:
1.时间戳
2.结构化时间 给电脑看的
3.格式化时间 给人看的
---------------------------------------------------
1 时间戳 就是用time.time() 得出来的结果
其意思是 距离1970年00点00时00分 到现在的秒数
2 结构化时间
time.localtime() 本地时区
time.gmtime() UTC时区
# 其结果是这种样式 time.struct_time(tm_year=2022, tm_mon=10, tm_mday=19, tm_hour=15, tm_min=48, tm_sec=25, tm_wday=2, tm_yday=292, tm_isdst=0)
3.格式化时间
"""%Y 年 %m 月 %d 日 %H 时 %M 分 %S 秒 %X 本地相应时间 """
res = time.strftime('%Y年%m月%d日%H时%M分%S秒') # 获取当前时间
res = time.strptime('1994年11月11日11时11分11秒','%Y年%m月%d日%H时%M分%S秒') # 可以把固定的时间转换成结构化时间
time.sleep() # 停下 睡眠
datetime 模块
datetime 模块
""" datetime 获取年月日时分秒
date 获取年月日
time 时分秒"""
from datetime import datetime
res = datetime.strptime('1994年11月11日11时11分11秒','%Y年%m月%d日%H时%M分%S秒') # 可以把结构化的时间转换成格式化时间
date.today() # 获取当前年月日
datetime.today() # 获取当前年月日时分秒
随机模块random
根据条件产生随机数
random.random() # 随机产生一个0到1之间的小数
random.uniform(1,3) # 随机产生一个1到3之间的小数
random.randint(1,3) # 随机产生一个整数,顾头顾伟
random.shuffle() # 打乱一个数据集
random.choice() # 随机抽取一个数据值
random.choices() # 随机抽取一个数据值 结果是个列表
random.sample(数据集, 次数) # 指定数量抽取
利用random 模块写 写验证码
import random
def my_code(n):
code = ''
for i in range(n):
upper1 = chr(random.randint(65,90))
lower1 = chr(random.randint(97,122))
int1 = str(random.randint(1,6))
temp = random.choice([upper1,lower1,int1])
code += temp
return code
res = my_code(5)
print(res)
OS模块
和操作系统打交道
import os
创建目录:
os.mkdir(r'文件名') #创建单级目录
os.makedir(r'文件名/文件名2') # 创建多级目录 ,也可以创建单级目录
删除目录: 只能删空的
os.rmdir(r'文件名') # 删除单级目录
os.removedir(r'文件名/文件名2') # 删除多级目录 只能删空的
列举路径下内容名称
os.listdir() # 列举当前执行文件 目录下的名称
os.listdir(r'd:\\') # 指定路径 目录下的名称
删除\重命名
os.rename(r'文件名1','文件名2') # 重命名
os.remove(r'文件名') # 删除文件
获取/切换当前工作目录
os.getcwd() # 获取当前目录
os.chdir() # 切换目录 使用. .. ../.. 方式
动态获取项目根路径 ******
os.path.abspath(__file__) # 获取执行文件绝对路径
os.path.dirname(__file__) # 获取执行文件目录
(os.path.dirname(os.path.dirname(__file__)))
可以嵌套 获取上一层目录
判断路径是否存在文件
# 判断文件路径是否存在
os.path.exists(r'文件名') # 根据文件名判断
# 判断路径是否是文件
os.path.isfile(r'文件名') # 根据文件名 判断
# 判断是否是目录
os.path.isdir(r'文件名')
路径拼接 ******
os.path.join(路径, 文件名)
# 可以兼容各个系统的分隔符。
获取文件大写 字节为单位
os.path.getsize(r'文件名')
sys模块
主要用于跟python解释器打交道
import sys
获取执行文件的sys.path
sys.path
添加路径:
sys.path.append(r'文件路径')
获取python解释器最大递归深度
sys.getrecursionlimit()
修改递归深度
sys.setrecursionlimit(2000)
获取解释器版本
sys.version
获取平台信息
sys.platform
json模块
json 格式数据是不同编程语言之间的翻译官。
"""作用:数据基于网络传输是使用二进制传输,在python中bytes类型就是二进制数据,但是python中只有字符串可以转成bytes类型"""
针对数据:
json.dumps 数据转成json格式
json.loads json格式转换成 python可以识别的数据
针对文件:
json.dump 可以把数据以json格式写入文件
json.load 可以把文件中的json格式数据 以字典形式读出