周总结(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格式数据 以字典形式读出
posted @ 2022-10-23 18:47  李阿鸡  阅读(14)  评论(0编辑  收藏  举报
Title