Python零基础从小白打怪升级中~~~~~~~模块+异常+Pycharm的debug调试

第十节:模块+异常+Debug

一、Python模块

Python 模块(Module),是一个 Python 文件,以 .py 结尾,模块能定义函数,类和变量,模块里也能包含可执行的代码。

1、导入模块

导入模块的5中方式

  1. import 模块名
  2. from 模块名 import 函数名
  3. from 模块名 import *
  4. import 模块名 as 别名
  5. from 模块名 import 函数名 as 别名

2、自定义模块

在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。

所以:自定义模块名必须要符合标识符命名规则。

2.1 定义模块

新建一个Python文件,命名为 my_module1.py,并定义 test1函数。

python 复制代码
def test1(a, b):
    print(a + b)
2.2 测试模块

在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息.,例如,在 my_module1.py文件中添加测试代码。

python 复制代码
def test1(a, b):
    print(a + b)


test1(10, 10)

此时,无论是当前文件,还是其他已经导入了该模块的文件,在运行的时候都会自动执行 testA函数的调用。

解决办法如下:

python 复制代码
def test1(a, b):
    print(a + b)

# 只在当前文件中调用该函数才会执行,其他导入的文件内不符合该条件,则不执行test1函数调用
if __name__ == '__main__':
    test1(10, 10)
2.3 __all__

如果一个模块文件中有 __all__变量,当使用 from xxx import *导入时,只能导入这个列表中的指定的元素。

__all__ = ['test1']

二、Python的包

Python包体现了模块的结构化管理思想,包由模块文件构成,将众多具有相关功能的模块文件结构化组合形成包。

注意:新建包后,包内部会自动创建 __init__.py文件,这个文件控制着包的导入行为。

__init__.py文件中添加 __all__ = [模块1, 模块2],控制允许导入的模块列表。

三、安装第三方的Python库

安装命令:

pip install 库名字 # 最新版本

pip install 库名字==1.0.4 # 指定版本

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/

注意:-i 指定pip镜像源,这样下载速度快 ,默认采用Python官方的镜像源,由于是国外服务器,所以下载慢

其他国内镜像源:

四、异常

执行时检测到的错误称为 :异常 ,异常不一定导致严重的后果;大多数异常不会被程序处理,而是显示下列错误信息:

python 复制代码
>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

1、处理异常

捕获异常

复制代码
try:
    可能发生错误的代码
except 异常类型1:
    如果捕获到该异常类型1执行的代码
except 异常类型2:
    如果捕获到该异常类型2执行的代码
......

try 语句的工作原理如下:

  • 首先,执行 try 子句 (try 和 except 关键字之间的(多行)语句)。
  • 如果没有触发异常,则跳过 except 子句,try 语句执行完毕。
  • 如果在执行 try 子句时发生了异常,则跳过该子句中剩下的部分。 如果异常的类型与 except 关键字后指定的异常相匹配,则会执行 except 子句,然后跳到 try/except 代码块之后继续执行。
  • 如果发生的异常与 except 子句 中指定的异常不匹配,则它会被传递到外部的 try 语句中;如果没有找到处理程序,则它是一个 未处理异常 且执行将终止。
python 复制代码
import sys
try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error:", err)
except ValueError:
    print("Could not convert data to an integer.")
except Exception as err:
    print(f"Unexpected {err=}, {type(err)=}")
    raise

2、强制抛出异常

raise 语句支持强制触发指定的异常。比如:如果只想判断是否触发了异常,但并不打算处理该异常,则可以使用更简单的 raise 语句重新触发异常

复制代码
>>> try:
...     raise NameError('HiThere')
... except NameError:
...     print('An exception flew by!')

3、Finally语句

finally表示的是无论是否异常都要执行的代码,例如关闭文件。一般都是做一些清理工作。

python 复制代码
try:
    f = open('test.txt', 'r')
except Exception as result:
    f = open('test.txt', 'w')
else:
    print('没有异常,真开心')
finally:
    f.close()

4、自定义异常类

程序可以通过创建新的异常类命名自己的异常。不论是以直接还是间接的方式,异常都应从 Exception 类派生。

异常类可以被定义成能做其他类所能做的任何事,但通常应当保持简单,它往往只提供一些属性,允许相应的异常处理程序提取有关错误的信息。

大多数异常命名都以 "Error" 结尾,类似标准异常的命名。

python 复制代码
# 自定义异常类,继承Exception
class TooShortInputError(Exception):
    def __init__(self, length, min_len):
        self.length = length
        self.min_len = min_len

    # 设置抛出异常的描述信息
    def __str__(self):
        return f'你输入的长度是{self.length}, 不能少于{self.min_len}个字符'


def main():
    try:
        con = input('请输入密码:')
        if len(con) < 3:
            raise TooShortInputError(len(con), 3)
    except Exception as result:
        print(result)
    else:
        print('密码已经输入完成')

五、with语句

with语句是Python中的一个上下文管理器,它可以帮助我们管理资源,确保在使用完毕后,资源被正确地释放。在Python中,with语句通常用于打开文件、数据库连接、处理事务等需要手动关闭的资源。

Python中使用 with语句的优势主要有以下几点:

  1. 代码简洁:使用 with语句可以让代码更加简洁,不需要手动打开和关闭文件、数据库连接等资源,而是让Python自动处理这些细节。
  2. 可读性强:使用 with语句可以让代码更加可读,因为它清晰地表达了代码块的开始和结束,使代码更加易于理解。
  3. 安全性高:使用 with语句可以确保资源在使用完毕后被正确关闭,从而避免了资源泄露和其他潜在的问题。
  4. 异常处理:使用 with语句可以更好地处理异常,如果在 with语句块中发生异常,Python会自动关闭资源,从而避免了资源泄露和其他潜在的问题。
python 复制代码
with open('file.txt', 'r') as f:
    # do something with f

六、Debug调试

1、打断点

一个断点标记了一个代码行,当Pycharm运行到该行代码时会将程序暂时挂起。断点会将对应的代码行标记为红色,取消断点的操作也很简单,在同样位置再次单击即可。一定要debug运行才生效

注意:断点一般打在有报错嫌疑的代码前面

2、Debug操作

接下来会Pycharm会执行以下操作:

(1)PyCharm开始运行,并在断点处暂停

(2)断点所在代码行变蓝,意味着Pycharm程序进程已经到达断点处,但尚未执行断点所标记的代码。

(3)Debug tool window窗口出现,显示当前重要调试信息,并允许用户对调试进程进行更改。

1.show execution point (F10) 显示当前所有断点

2.step over(F8) 单步调试。

若函数A内存在子函数a时,不会进入子函数a内执行单步调试,而是把子函数a当作一个整体,一步执行

3.step into(F7) 单步调试。

若函数A内存在子函数a时,会进入子函数a内执行单步调试。

4.step into my code(Alt + Shift +F7) 执行下一行但忽略libraries(导入库的语句)

5.force step into(Alt + Shift +F7) 执行下一行忽略lib和构造对象等

6.step out(Shift+F8)当目前执行在子函数a中时,选择该调试操作可以直接跳出子函数a,而不用继续执行子函数a中的剩余代码。并返回上一层函数。

7.run to cursor(Alt +F9) 直接跳到下一个断点

相关推荐
databook29 分钟前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar2 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780512 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_2 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机9 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机10 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机10 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机10 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i10 小时前
drf初步梳理
python·django
每日AI新事件10 小时前
python的异步函数
python