python程序结构和异常处理
(一)程序结构和异常处理
(二)迭代和生成器
(三)函数式编程
本篇文章学习的内容是第一篇,目录如下:
01 程序结构
1.1 模块Module
1)定义
python中的模块指的是 包含一系列数据、函数和类的文件,通常以.py结尾。
python程序结构示意图
2)作用
让一些相关的数据、函数和类更有逻辑地组织在一起,使逻辑结构更加清晰。
3)导入
python模块导入 | ||
---|---|---|
import | from import | |
语法 |
1) import 路径.模 块 2) import 路径.模块 as 别名 |
1)from 路径.模块 import 成员名 2)from 路径.模块 import 成员名 as 别名 3)from 路径.模块 import * |
作用 | 将模块整体导入到当前模块中 | 将模块内的成员导入到当前模块作用域中 |
使用 | 模块名.成员名 | 直接使用成员名 |
(1)python模块import & from import 导入示例:
(2)不同成员(函数、实例方法、类方法)导入实例:
4)模块变量
__doc__变量:文档字符串
__name__变量: 模块自身名字,可以判断是否为主模块
5)加载过程
模块导入时,所有的语句都会执行,如果一个模块已经执行,再次导入时不会重新执行该模块的语句。
(1) __doc__ 变量 实例:
a.数据、函数和类的三引号注释 都可以在 python 集成开发环境 IDE(integrated development environment) pycharm中通过 __doc__ 查看
b. 也 可以查看 python的标准库文档说明
注:python的标准库 文档说明 (下面有提到)还可以 通过终端查看
如random是python的标准库之一
(2) __name__变量实例 :
A. __name__有两种输出方式
a. 在其他模块中输入print(__name__) ,并 在当前文件中导 入其模块名 , 打印结果是其他模块的真实模块名 ,如下图:
b.在当前文件中输入 print(__name__) ,直接打印的结果是__main__, 表示当前文件为主模块。
B.__name__的使用场景
在项目正式交付之前程序员会进行功能测试,如下图是学生管理信息系统的bbl( 业务逻辑层 )测试用例,用于测试当前模块代码是否有问题。但当项目交付给客户之后,客户会在main(入口)运行项目,这部分测试用例就不应该执行了。为了实现这个目的,需要在main模块加上 if __name__ == "__main__": , 表示在main模块中运行代码时才执行程序,如果当前模块不是主模块,则无需执行。 快捷键:main+回车
程序在main模块中运行时,上面的测试用例不执行:
注: 可以把模块分为两类,一个是主模块,另一个是被导入模块, 被导入模块才能生成pyc文件 (main是主模块,没有生成pyc文件), pyc可以让程序的运行速度更快。 所以程序从main运行会节省程序的运行速度,而不建议从另外三个功能模块运行程序。
python是解释型语言,但为了提高运行速度,使用了一种编译的方法。编译之后得到 pyc文件 ,存储了字节码(特定于Python的表现形式,不是机器码)。
6)分类
(1)内置模块(builtins),在解析器内部可以直接使用;
注:python的内置模块和 标准库模块可以在pycharm中使用 快捷键 ctrl+鼠标左键查看文档说明
如下python的标准库模块之一random的文档说明:
如下是python的内置模块之一print的文档说明:
(2)标准库模块,安装python时已安装且可直接使用;
time模块-datetime模块-random模块-pathlib模块-os模块-shutil模块-CSV模块-argparse模块-sys模块-json&pickle&shelve&xml模块-re模块-logging模块-hashlib模块
a. time模块知识:
import time
# 人类时间:2021年12月31日 17:10:49
#时间元组:(年、月、日、时、分、秒、星期、年的第几天、与夏令时的偏移量)
tuple_time = time.localtime()
print(tuple_time[6])#星期
print(tuple_time[-3])#星期
print(tuple_time[:3])#年月日
print(tuple_time[3:6])#时分秒
print(tuple_time)
#想要记录某个时刻优先使用时间戳 机器时间:从1970年元旦到现在经过的秒数
print(time.time())#1640942021.335922
#时间戳-->时间元组
#语法:时间元组 = time.localtime(时间戳)
print(time.localtime(1640942021.335922))
#时间元组-->时间戳
#语法:时间戳 = time.mktime(时间元组)
print(time.mktime(tuple_time))#1640942354.0
# 时间元组 <--> 字符串
#语法:字符串=time.strftime(时间格式,时间元组)
#21/12/31 17:31:04
print(time.strftime("%y/%m/%d %H:%M:%S",tuple_time))
#2021/12/31 17:31:04
print(time.strftime("%Y/%m/%d %H:%M:%S",tuple_time))
# 语法:时间元组 = time.strptime(字符串,时间格式)
print(time.strptime("2021/12/31 17:31:04","%Y/%m/%d %H:%M:%S"))
print(time.strptime("年份是:2021,月份是:09","年份是:%Y,月份是:%m"))
打印结果:
b. time模块实例:
"""
定义函数,根据年月日获取星期
输入:2022 1 3
输出:星期一
"""
import time
def get_week(year,month,day):
str_time = "%s/%s/%s"%(year,month,day)
print(str_time)
tuple_time =time.strptime(str_time,"%Y/%m/%d")
tuple_week = ("星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日")
week_index=tuple_time[6]
return tuple_week[week_index]
# return tuple_time[6]
print(get_week(2022,1,3))
(3)第三方模块(通常为开源),需要自己安装;
(4)用户自己编写的模块(可以作为其他人的第三方模块)。
1.2 包 Package
1)定义
将模块以 文件夹的形式 进行分组管理。
(1) 以pycharm举例,主界面左侧的project最上面一层为项目的根目录,如果想要把作用域的范围缩小, 可以通过给主模块所在的文件夹 设置Mark Directory as -->Sources Root 来声明作用域。如下图:
通过为此类别分配文件夹,可以告诉IDE编译器此文件夹及其子文件夹包含应作为构建过程的一部分进行编译的源代码。
White-Legend
( 2)直接创建包 (包含__init__文件):
也可以先创建文件,然后在文件中新建 __init__文件
注:带init的是包(也是文件夹),不带init的只是文件夹,包的作用是可以通过init对整个包里的所有代码进行封装,当包里的文件很多时,可以提供部分常用文件的调用,更加方便。
2)作用
把一些相关的模块组织在一起,使逻辑结构更清晰。
3)导入
(1)主流做法(本篇文章开头的导入部分为主流做法)
1.在被导入模块写入成员(函数、实例方法、类)
2.在主模块进行导入
(2) 非主流做法
1.在被导入模块写入成员(函数、实例方法、类)
2.在被导入模块所在的包的__init__文件里进行配置(和主流做法的第2步相同)
3.在主模块进行导入(import或from 后面的内容只导入到包)
注:
非主流做法的适用于代码量、文件量比较庞大的时候,更常用的是主流做法。
非主流做法实例:
第一步:
第二步:(import 和from import 二选一)
第三步: (import 和from import 二选一)
2.1 异常
1)异常
(1) 定义
运行时检测到的错误。 错误通常分类两种 : 一类是 语法错误 ,这个是程序员自己需要调整的,必须在程序执行之前就改正,比如def dog后不加冒号;还有 一类是 逻辑错误 ,通常是由于数据超过有效范围引发的错误。
python解释器检测到错误, 触发异常 (也允许程序员自己触发异常)
程序员编写特定的代码,专门用来 捕捉 这个 异常 (这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃, 保证程序的健壮性与容错性 ,这就是 异常处理 。
战争热诚
(2) 常见语法错误
NameError名称异常:变量未定义;
TypeError类型异常:不同类型数据进行运算;
IndexError索引异常:超出索引范围;
AttributeError属性异常:对象没有对应名称的属性;
KeyError键异常:没有对应名称的键
Exception异常基类
......
NameError 实例:
2)异常处理
(1) 定义
将程序由异常状态转为正常流程。
(2)语法
try:
可能触发异常的语句
except 错误类型1 [as 变量1]:
处理语句1
except 错误类型2 [as 变量2]:
处理语句2
except Exception [as 变量3]:
不是以上错误类型的处理语句
else:
未发生异常的语句
finally:
无论是否发生异常的语句
"""
as子句用于绑定错误对象的变量,可以省略
except子句可以有一个或者多个,用来捕捉某种类型的错误
else子句最多只能有一个
finally子句最多只能有一个,如果没有except子句,必须存在
如果异常没有被捕捉到,会向上层(调用出)继续传递,直到程序终止运行
"""
异常处理实例(逻辑错误):
"""
异常处理:
适用性:不处理语法错误,而是针对逻辑错误
现象:程序遇到错误就会不断向上返回
价值:保障程序能够按照既定的流程执行
本质:错误的快速传递通道
"""
# 逻辑错误通常是由于数据超过有效范围引发的错误
# 处理方式1.包治百病(推荐使用)
def div_apple(apple_count):
try:
person_count = int(input('请输入人数:'))
result = apple_count/person_count
print('每人分%s个苹果'%result)
# except Exception:
except:
print('程序出错了')
div_apple(10)
print('后续逻辑')
# 处理方式2.对症下药(官方建议)
def div_apple(apple_count):
try:
person_count = int(input('请输入人数:'))
result = apple_count/person_count
print('每人分%s个苹果'%result)
except ValueError:
print('错误,输入的不是整数')
except ZeroDivisionError:
print('错误,输入的是零')
div_apple(10)
print('后续逻辑')
# 处理方式3.无论是否发生异常,一定执行某些逻辑
def div_apple(apple_count):
try:
person_count = int(input('请输入人数:'))
result = apple_count/person_count
print('每人分%s个苹果'%result)
#打开文件
#操作文件
finally:
print('分苹果结束啦')
#关闭文件
div_apple(10)
print('后续逻辑')
# 处理方式4.没有错误时才执行的逻辑
def div_apple(apple_count):
try:
person_count = int(input('请输入人数:'))
result = apple_count/person_count
print('每人分%s个苹果'%result)
except Exception:
print('程序出错啦')
else:
print('分苹果成功啦')
div_apple(10)
print('后续逻辑')
3)raise语句
(1)定义
抛出一个错误,让程序进入异常状态。
(2)作用
在程序调用比较深时,由主调函数传递错误信息要层层return比较麻烦,认为抛出异常,可以直接传递错误信息。
(3)语法
raise [Exception [, args [, traceback]]]
"""
语句中Exception是异常的类型(例如,NameError)
参数是一个异常参数值,该参数是可选的,如果不提供,异常的参数是"None"。
最后一个参数是可选的(在实践中很少使用)。
"""
(4)raise实例
"""
主动创造错误
raise try
发送 接收
"""
def input_password():
# 1.提示用户输入密码
pwd = input('请输入密码:')
# 2.判断密码长度,如果长度>=6,返回用户输入的密码
if len(pwd) >= 6:
return pwd
# 3.密码长度不够,抛出异常
raise Exception('密码长度不够')
while True:
try:
user_pwd = input_password()
print(user_pwd)
break
except Exception as e:
print(e.args)
参考资料:
[1] Python——模块(Module)和包(Package)
https://blog.csdn.net/qiqicos/article/details/79208039
[2] 常用的python标准库模块
https://www.cnblogs.com/xixi18/p/8406301.html
[3] Python内置模块与标准库
https://www.cnblogs.com/pluse/p/8667864.html
[4] Pycharm 中 Mark Directory As 里的 Sources Root 的作用
https://blog.csdn.net/u011318077/article/details/105507485
[5] Python异常及处理方法总结
https://blog.csdn.net/sinat_38682860/article/details/90705790
[6] python 一篇搞定所有的异常处理
https://www.cnblogs.com/wj-1314/p/8707804.html
python程序结构和异常处理相关推荐
- python高级(一)程序结构和异常处理
前言: python高级将用三篇文章来进行梳理: (一)程序结构和异常处理 (二)迭代和生成器 (三)函数式编程 本篇文章学习的内容是第一篇,目录如下: 01 程序结构 1.1 模块Module 1 ...
- 商业数据分析从入门到入职(6)Python程序结构和函数
文章目录 一.Python程序结构 1.if条件 2.循环 while循环 for循环 3.案例-王者荣耀纯文本分析 二.函数的介绍和基本使用 三.函数进阶 1.可变位置参数 2.可变关键字参数 3. ...
- 简述python程序结构_Python程序结构
Python中有三种程序结构:顺序结构.选择结构.循环结构 顺序结构:python是一门解释型语言,它的执行过程一般是解释一行,执行一行. 选择结构:python中只有一种选择结构:if-else选择 ...
- python编程语法-Python学习笔记(Ⅰ)——Python程序结构与基础语法
作为微软的粉丝,最后终于向Python低头了,拖了两三个月终于下定决心学习Python了.不过由于之前受到C/C#等语言影响的思维定式,前期有些东西理解起来还是很费了些功夫的. 零.先抄书: 1.Py ...
- 关于python中程序流程结构-Python程序结构
2018年6月27日笔记 python流程控制 1.python流程控制语句结构 4种流程控制语句结构: if if -- else if -- elif --else if多条件 2.程序结构 3种 ...
- Python学习笔记(Ⅰ)——Python程序结构与基础语法
作为微软的粉丝,最后终于向Python低头了,拖了两三个月终于下定决心学习Python了.不过由于之前受到C/C#等语言影响的思维定式,前期有些东西理解起来还是很费了些功夫的. 零.先抄书: 1.Py ...
- python程序基本结构有哪些_【Python基础】Python程序结构有哪些
从上面我们可以大概看出,一个完整的py程序结构大概如下: 我们知道,对于C/C++/C#等编程语言来说,程序的入口一定是main()函数,但是如果沿用这种思路来理解python的话就很容易踩坑. Py ...
- Python 程序结构及代码规范
每一个可执行的 python 程序中都会有各种各样的文件类型.文件中也有基本的代码结构和代码规范 1.文件类型 在 python 中,常用的文件类型有 3 种:分别是源代码文件.字节代码文件和优化代码 ...
- 简述python程序结构_python架构的概念讲解
Python就是这样一门受到全世界各地开源社区支持的语言,Python可以用来开发各种小工具软件.web应用.科学计算.数据分析等等. 本篇文章是关于Python构架的讲解,希望对于正在学习Pytho ...
最新文章
- 【2017级面向对象程序设计】第2次成绩排行
- android将字符串转化为json,将字符串转换为JSON数组
- 前端开发JS的学习之AngularJS库
- 机器学习速成课程 | 练习 | Google Development——编程练习:神经网络简介
- 查看Python函数含义的快速,准确方法unique
- 计算机算法设计与分析 单峰序列
- sql学生选课管理系统
- 适应科技发展观的Steam教学实践
- Matlab 显示图像太慢
- win10添加组策略命令
- Java字符串相关的类详解
- Elasticsearch 特定场景下使用
- 作业 - 加密解密和CA
- 【Windows7】win7启动 报错 AutoIt错误,不能打开脚本文件
- Pipeline支撑运维自动化:sftp原子模块
- Android版股票K线图实现方案
- 视频教程-2019 react入门至高阶实战,含react hooks-ReactJS
- html+css制作盾牌飞入效果
- Erro和Exception区别Throw和Throws的区别
- 20180402-E · US Tuition Costs · ggplot2, 地图 热力图 gganimate 动图 · R 语言数据可视化 案例 源码
热门文章
- 直线拟合c语言程序,ax+by+c=0 型直线拟合算法
- kvm静态迁移error: Cannot access storage file
- https域名安全证书怎么配置
- matlab GUI制作拼图小游戏
- 联想g400从u盘启动计算机,联想g400笔记本设置U盘启动的图文步骤
- JS完成注册页面的省市联动(JS内置对象全局函数,select标签操作)
- html403禁止访问怎么解决,http403禁止访问错误产生的原因以及解决办法
- mysql报错1593_主从复制报1593错误的处理
- 基于局部均方差的人脸磨皮matlab程序
- Python万年历(含农历、节气等)