总结4

总结4

异常与异常捕获

异常

异常是指程序过程中的代码报错,俗称bug。

代码异常存在语法错误逻辑错误

我们要杜绝语法问题,尽量避免逻辑错误。

异常信息

python在遇到报错时,会给出报错的信息,包括异常位置、异常类型、异常详细三大信息。

异常捕获

语法:

try:
    试运行代码
except 异常类型1 as e:
    处理方案1
except 异常类型2 as e:
    处理方案2
except 异常类型3 as e:
    处理方案3
except Exception as e:
	捕获所有异常类型并统一都执行此方案
else:
    如果没有异常发生,则执行
finally:
	不管有没有异常都执行

语法补充:

  • 断言——assert

    assert 值
    # 这个值可以是普通变量,函数返回值等,当assert后的值为假属性时会报错。
    
    
  • 主动抛异常——raise

    # 当程序执行到某种地方的时候,我们让它主动报错
    raise 异常类型(异常信息)
    

生成器对象

生成器对象概念

生成器对象就是可以自定义的迭代器对象,我们可以通过函数体内塞yield关键字的形式,定义一个迭代器体,每遇到一个yield,就作为每次迭代的停止点。

我们还可以通过yield进行每次返回值和每次接收值。

生成器有__iter__方法和__next__方法,而激活并执行过一次next方法的生成器可以执行send点方法。

def my_iter():
    print('激活迭代器后的第一次next')
    for i in range(10):
        res = yield i
        print(f'外面send个{res}给了我')


active_iter = my_iter()  # 激活迭代器
print(active_iter.__next__())  # 激活迭代器后的第一次next  0
active_iter.send('嘿嘿')  # 外面send个嘿嘿给了我  1
print(active_iter.__next__())  # 外面send个None给了我  2

每次yield断点,如果后面跟了值,那么每次迭代就相当于返回了一个值,可以记忆为迭代值。

send方法是传值的next方法,即在运行迭代器时,会往上次断点的yield传值,并通过赋值等手段传给函数体内部,作为变量值参与下一次的迭代。

如在第二次next时,因为res没有接收到外面的值,所以得到了一个None。

生成器表达式

简化的生成器,通过(表达式 for 变量名 in 迭代器/可迭代)的方式可以定义并激活一个生成器

强调:生成器的定义过程和激活过程,都不会使其函数体的内容被调用和运行。

只有当执行.__next__方法和.send()方法的时候,才会使生成器体内的代码迭代执行。

模块理论

python模块是具有一系列功能的集合,其可以表现为py文件、包、编译好的共享库、DLL的c或c++扩展、C编写并链接到python解释器的内置模块。

模块可以分为自定义模块、内置模块、第三方模块,其中第三方模块的是巨人的肩膀,有很多的功能强大的功能模块,或被开源,或在售卖,可以导入它们以简单的实现复杂的功能。

导入模块的句式及原理

import 模块名from 上级目录\模块名 import 模块名\变量名

当执行文件的含import语句中遇到模块名时,会找到相应的模块先完整的执行一遍,然后执行完毕后,我们将在执行文件的名称空间中拿到import后的名字,如果是变量名则可以直接使用相关功能,如果是模块名则可以通过.变量的形式使用模块内部的名字。这个点的过程可以理解为.属性

注意:

  • 在重复遇到import语句中含同样的模块内容时,只有第一次导入模块时会执行模块文件,后续导入同模块的语句不执行。

  • 导入模块名或变量名时可以通过as来重命名

  • 我们可以通过from 模块 import *的方式得到模块中所有的名字

    而这种方式拿的名字也可以在模块中用__all__指定

  • 导入过程中应该避免循环导入的情况

判断当前文件是否是执行文件

  • 模块开发者,需要试运行功能,但不希望被导入时执行
  • 项目启动文件通常要判断

在以上两种情况时会需要判断自己是不是执行文件:

__name____main__的时候即为执行文件,否则为模块名时应该为被导入的模块。

可以用if __name__ == "__main__":来进行判断。

模块名的查找顺序

  • 先找内存:这一点是针对已经被导入的模块文件,它的所有名称都已经在内存中了,
  • 在找这些名字时,即使硬盘上的模块被删除,也不影响运行中的程序对这些已加载模块的调用- 再找内置模块:python解释器给我们提供的内置模块,有time、os等,这些模块名优先被查找
    最后找系统环境变量下的模块:系统环境变量可以通过sys.path的方法获取,它由一系列目录组成,是程序运行的环境目录,其第一条通常为执行文件所在的文件夹。
  • 我们最后就依次在系统环境变量的目录下查找有没有对应模块。
    在导入模块时,我们应注意将自定义模块的名字与内置模块作区分,避免自定义模块失效,
    所有的模块应该用英文命名,路径也尽量采取英文路径,不要包含空格等。

绝对路径导入和相对路径导入

from aaa.bbb.sub_b import name  # 绝对路径导入模块(可以看到的文件夹打头)
# 多级文件夹用多个点来描述层级
from .bbb import sub_b  # 相对路径导入模块(点或者点点打头,表示当前文件的某个相对位置)
# 需要说明
	.在路径中表示当前目录
 	..在路径中表示上一层目录
 	..\..在路径中表示上上一层目录

多个py文件的集合>>文件夹。

我们一般会规范每个集合为包的py模块文件夹中含__init__.py文件(Python2中要求必须有,Python3中不作要求)

软件目录开发规范

myproject  # 项目文件夹,可以自定义命名
	- bin  # 存放项目启动的文件 的文件夹
    	start.py  # 启动文件,也可以命名为软件的名字等
    - conf  # 配置文件夹,全程configuration--配置
    	setting.py  # 里面通常放一些大写的常量,作为软件起始需要的变量
    - core  # 核心文件夹,存放一些核心逻辑功能文件
    	src.py  # 存放一些核心的功能
    - interface # 接口文件,存放一些接口文件  # 接口可以理解为数据与用户的交互过渡层。
    	purchase.py
        user.py
        account.py  # 根据业务逻辑分类对应某类功能的接口
    - db # 数据及其处理文件夹  ---  可能被其他软件代替,如mysql
    	userdata.txt  # 用户数据等数据文件
        db_handler.py  # 数据处理的相关功能
    - log  # 主要存放项目日志文件
    	log.log  # 项目日志文件
    - lib  # 项目公共功能文件夹
    	common.py
    - README.md  # 项目说明书
    - requirements.txt  
    # 模块环境说明书!!!一个字母不能错,这个文件可以帮助项目参与者快捷的下载模块

模块之collections

是一个提供各式各样数据类型的模块

namedtuple deque OrderedDict defaultdict Counter
具名元组 双端队列 有序列表 默认列表 元素出现次数字典

模块之时间模块

主要功能是提供三大时间获取、转换、运算的模块。

三大时间

时间戳、结构化时间、字符串时间(格式化时间)

时间戳与结构化时间都可以用于计算,结构化时间的运算习惯更符合我们的日常生活,但是其阅读起来并不方便,所以结构化时间可以转换为字符串时间和时间戳。

time模块

语句 功能
time.sleep(1) 程序等待1s后执行
time.time() 获取当前时间戳
time.strftime("格式",结构化时间) 结构化时间--->格式化时间、获取格式化时间
time.localtime(时间戳) 获取结构化时间、时间戳-->结构化时间
time.mktime(结构化时间) 将结构化时间变为时间戳
time.strptime('时间字符串','字符串对应格式') 识别字符串时间,转换为结构化时间

datetime模块

datetime可以看作结构化时间的一种,可以和字符串时间相互转化

语句 功能
datetime.datetime.now() 获取当前本地时间
datetime.datetime(2008, 8, 8, 20, 0) 用指定日期获取格式化时间
datetime.datetime.strptime('时间字符串','对应格式') 字符串时间-->datetime
某个datetime时间.strftime('字符串时间格式') datetime-->字符串时间
datetime.timedelta(minutes=30) 得到一个时间间隔

模块之random

函数名 功能
random() 随机得到0到1之间的小数
uniform(a,b) 随机得到a到b之间的小数
randint(a,b) 随机得到a和b之间的整数(包含a和b)
randrange(a,b,step) 随机得到a和b间的整数,并设置步长
choice(迭代器) 随机获取迭代值,如列表的一个元素
choices(迭代器) 随机获取迭代值,如列表的一个元素,并组织为列表元素
sample(迭代器,n) 随机获取多个样本,并组织 成列表
shuffle(数据集) 随机打乱数据集

模块之os

os.mkdir()\os.makedirs 创建目录\多级目录
os.rmdir()\os.removedirs() 删除目录\多级目录(空目录)
os.listdir()\os.listdir('路径') 查看执行\指定文件夹下的内容名称
os.rename() 重命名
os.remove() 删除文件
os.getcwd() 获取当前工作目录
os.chdir() 切换工作目录
os.path.abspath() 获取文件的绝对路径
os.path.dirname() 获取文件所在的文件夹路径
os.path.exists()\isfile()\isdir() 判断文件路径\文件\文件夹是否存在
os.path.join() 路径拼接
os.path.getsize() 获取文件大小(字节为单位)

模块之sys

语句 功能
sys.path 获取系统环境变量
sys.getrecursionlimit() 获取解释器最大递归深度
sys.setrecursionlimit() 更改解释器最大递归深度
sys.version 获取解释器版本号
sys.platform 平台信息
sys.argv 从文件外部得到参数

模块之json

语句 功能
json.dumps(python数据) 序列化
json.dump(python数据,文件) 序列化并存入文件
json.loads(json格式数据) 反序列化
json.load(f) 读出文件并反序列化
posted @ 2022-10-23 20:05  leethon  阅读(26)  评论(0)    收藏  举报