20、高级Python编程与Sage进阶应用

高级Python编程与Sage进阶应用

1. 异常处理

在Python编程中,异常处理是一项重要的技术。当我们在同一个 try 块中调用 move 方法和 fire 方法时,使用两个 except 语句来捕获不同的异常类并进行不同的处理。自定义异常类是很有必要的,因为如果只抛出 ValueError 异常,我们很难知道异常的来源。例如,当 move 方法抛出异常时,解释器会直接跳转到 except 块,忽略 try 块中其余的语句。

以下是正确使用异常的一些建议:
- 避免在 try 块中放置过多代码,否则难以确定是哪条语句引发了异常。
- 不要使用没有指定异常类型的 except 语句,因为它会捕获包括 SystemExit KeyboardInterrupt 在内的所有异常,使程序难以终止。
- 捕获异常后要进行正确处理,否则可能会掩盖错误。

2. 单元测试

随着面向对象程序变得越来越大、越来越复杂,调试也变得更加困难。单元测试是验证和确认软件的一种范式,它通过对程序中最小可测试部分(如单个函数或方法)进行独立测试,确保其能正确响应。Python标准库中的 unittest 包可以帮助我们实现单元测试。

下面是一个为 Tank 类创建单元测试的示例代码:

import combatsim
import combatsim.exceptions as ex
import unittest

class TestTank(unittest.TestCase):
    """Tests for the combatsim package."""
    def setUp(self):
        """Called before EACH test is run."""
        # Define parameters for the tank
        armor_values = {'front' : 100, 'side' : 50, 'rear' : 25,
            'turret' : 75}
        main_gun_damage = 50
        initial_position = (0.0, 0.0)
        # Create a tank object
        self.tank = combatsim.tank.Tank(armor_values, main_gun_damage, 
initial_position)

    def test_get_position(self):
        """Test method get_position"""
        position = self.tank.get_position()
        self.assertEqual(position, (0.0, 0.0))

    def test_move(self):
        """Test method move"""
        self.tank.move(0, 1)
        position = self.tank.get_position()
        self.assertEqual(position, (1, 0))

    def test_move_arg1(self):
        """Test method move, arg 1 invalid"""
        self.assertRaises(ex.MoveError, self.tank.move, 360, 1)

    def test_move_arg2(self):
        """Test method move, arg 2 invalid"""
        self.assertRaises(ex.MoveError, self.tank.move, 159, -1)

    def test_fire(self):
        """Test method fire.  This test is designed to FAIL \
so you can see what a failed test looks like."""
        result = self.tank.fire(90,30)
        self.assertEqual(result, True)

suite = unittest.TestLoader().loadTestsFromTestCase(TestTank)
unittest.TextTestRunner(verbosity=2).run(suite)

运行上述脚本后,会输出测试结果。每个测试方法都有一个文档字符串,用于解释其功能,这对于理解测试结果非常重要。 setUp 方法会在每个测试运行前被调用,用于创建 Tank 类的实例。

test_move_arg1 test_move_arg2 方法通过传递无效参数,故意使 move 方法抛出异常。 assertRaises 方法用于测试是否抛出了预期的异常。 test_fire 方法是一个失败的测试,用于展示测试失败时的情况。

最后两行代码是创建测试套件并运行测试的快捷方式:

suite = unittest.TestLoader().loadTestsFromTestCase(TestTank)
unittest.TextTestRunner(verbosity=2).run(suite)

Python 2.6中可用的 assert 方法如下表所示:
| 方法 | 描述 |
| — | — |
| assertTrue(expr) | 如果 expr False ,测试失败 |
| assertEqual(first, second) | 如果 first 不等于 second ,测试失败 |
| assertNotEqual(first, second) | 如果 first 等于 second ,测试失败 |
| assertAlmostEqual(first, second, [,places]) | 如果 first second 的差值大于 places 位小数(默认7位),测试失败 |
| assertNotAlmostEqual(first, second[,places]) | 如果 first second 的差值小于 places 位小数(默认7位),测试失败 |
| assertRaises(exception, callable [,args]) | 除非 callable 方法抛出指定的 exception 异常,否则测试失败 |
| assertFalse(expr) | 如果 expr True ,测试失败 |

3. 单元测试策略

定义单元测试需要仔细思考和判断。在大多数程序中,测试所有可能的执行路径是不可能或不切实际的。在编写测试之前,开发者应该考虑代码的预期用途,并参考之前定义的需求。以下是一些单元测试的建议:
- 边界(或边缘)情况 :测试代码在某个参数达到极值时的性能。
- 角点情况 :测试所有参数都取极值时的情况。
- 分支测试 :尝试至少测试一次源代码的所有分支。
- 异常测试 :检查异常是否被正确抛出和处理。
- 固定输入测试 :使用一组固定的输入运行代码,确保其能重现已知结果。
- 随机输入测试 :随机生成有效输入,运行代码,查看某些参数组合是否会导致错误。

对于某些类型的测试,如角点情况,代码的作者是编写测试的最佳人选。在大型项目中,单元测试通常由代码作者以外的人编写,以覆盖软件定义的需求,这样可能会发现代码作者做出的一些假设。

如果想将代码包含在Sage库中,需要熟悉Sage项目的测试标准。Sage项目使用一种称为 doctesting 的测试类型来确保质量,函数或模块的文档字符串采用特殊格式,包含示例部分, doctesting 会自动搜索文档字符串中的示例,运行并验证结果是否正确。更多信息可参考:
- http://www.sagemath.org/doc/developer/doctesting.html
- http://www.sagemath.org/doc/developer/conventions.html

4. LaTeX排版方程

Sage可以使用LaTeX文档标记语言轻松记录和发布数学结果。TeX排版系统用于处理LaTeX文件,生成如DVI、Postscript或PDF等格式的矢量图形文件,就像网页浏览器解析HTML文档创建网页一样。许多数学和科学书籍、期刊的出版商鼓励作者以LaTeX文件形式提交作品,有些期刊甚至要求使用。

4.1 安装LaTeX

不同操作系统安装LaTeX的方式不同:
- UNIX和类UNIX系统(如Solaris、OpenSolaris、Linux) :安装TeX Live发行版。如果无法通过系统的包管理器安装,可以从http://www.tug.org/texlive/直接下载。
- OS X :安装基于TeX Live的MacTeX,可从http://www.tug.org/mactex/获取。
- Windows :可以安装TeX,但Sage运行在Linux虚拟机中,需要在虚拟机中安装Linux版本的TeX。如果只是想在Windows上运行TeX,可以尝试MiKTeX(http://www.miktex.org/)或proTeXt(http://www.tug.org/protext/)。

可以通过以下命令验证基本工具是否安装:

sage: print latex.engine()
latex
sage: print sage.misc.viewer.viewer()
sage-open
sage: print sage.misc.viewer.pdf_viewer()
sage-native-execute sage-open
sage: print sage.misc.viewer.dvi_viewer()
sage-native-execute sage-open

不同操作系统的输出可能会有所不同。如果设置了 SAGE_BROWSER 环境变量,可能会影响PDF或DVI文件的外部查看,此时需要取消设置并更改操作系统的默认浏览器。

4.2 从笔记本界面输出PDF

以下是在工作表的输入单元格中输入代码并生成PDF文件的示例:

var('n,x,t')
J_n(n,x) = 1/pi*integral(cos(n*t-x*sin(t)), t)
J_n
show(J_n)
view(J_n)
view(J_n, mode='display')

如果想生成PDF文件,可以继续输入以下代码:

restore('i')
J_n_2(n, x) = 1 / (2 * pi) * integral(exp(-i * (n * t - x * sin(t))), 
t, -pi, pi)
view([J_n, J_n_2], title='Representations of the Bessel function', 
sep='\hrule', viewer='pdf', mode='display')

如果只想将单个方程输出为PDF文件,可以使用以下代码:

view(J_n, viewer='pdf', tightpage=True, mode='display')

还可以将方程输出为PNG文件:

sage.misc.latex.png(J_n, 'J_n.png')

在上述示例中,定义了一个表示第一类贝塞尔函数的函数 J_n show 函数用于显示贝塞尔函数, view 函数返回其参数的LaTeX表示。在笔记本界面中,LaTeX标记会被 jsMath 自动解析,生成浏览器可以显示的HTML表达式。 jsMath 是一组用于在网页上显示数学内容的JavaScript程序,安装在服务器端,用户无需安装额外软件即可查看数学表达式,但下载一组TeX字体可以使表达式显示得更好。

LaTeX有内联和显示两种显示数学表达式的模式。默认情况下, view 函数使用内联模式,但可以通过 mode 关键字将其设置为 display 模式,此时输出与 show 函数的输出相同。

在生成PDF文件的示例中,使用 restore('i') 将符号 i 恢复为默认值,以确保代码在 i 已被用作循环计数器的情况下仍能正确运行。

通过以上内容,我们学习了高级Python编程中的异常处理和单元测试,以及Sage中使用LaTeX排版方程和生成PDF文件的方法。这些技术可以帮助我们编写更健壮的代码,并更好地展示数学结果。

5. 单元测试实践拓展

为了进一步巩固对单元测试的理解,我们可以按照之前提到的建议,为 Tank 类的 fire 方法添加更多的单元测试。以下是两个验证 fire 方法在传入无效参数时是否抛出正确异常的方法示例:

import combatsim
import combatsim.exceptions as ex
import unittest

class TestTank(unittest.TestCase):
    """Tests for the combatsim package."""
    def setUp(self):
        """Called before EACH test is run."""
        # Define parameters for the tank
        armor_values = {'front' : 100, 'side' : 50, 'rear' : 25,
            'turret' : 75}
        main_gun_damage = 50
        initial_position = (0.0, 0.0)
        # Create a tank object
        self.tank = combatsim.tank.Tank(armor_values, main_gun_damage, 
initial_position)

    # 之前的测试方法...

    def test_fire_arg1(self):
        """Test method fire, arg 1 invalid"""
        self.assertRaises(ex.FireError, self.tank.fire, -1, 30)

    def test_fire_arg2(self):
        """Test method fire, arg 2 invalid"""
        self.assertRaises(ex.FireError, self.tank.fire, 90, -1)

suite = unittest.TestLoader().loadTestsFromTestCase(TestTank)
unittest.TextTestRunner(verbosity=2).run(suite)

在这个示例中, test_fire_arg1 test_fire_arg2 方法分别传入了无效的参数,期望 fire 方法抛出 FireError 异常。这样可以确保 fire 方法在遇到无效输入时能够正确处理。

6. 更多LaTeX与Sage结合的应用场景

除了前面介绍的基本功能,LaTeX与Sage结合还有更多强大的应用场景。

6.1 生成复杂文档

当我们需要生成包含多个数学公式、图表和文本的复杂文档时,可以利用LaTeX的强大排版功能。首先,我们可以在Sage中生成所需的数学内容,然后将其嵌入到LaTeX文档中。以下是一个简单的示例:

# 在Sage中生成数学内容
var('x y')
f(x) = x^2 + y
g(x) = sin(x)

# 将内容保存为LaTeX代码
latex_content = r"""
\documentclass{article}
\usepackage{amsmath}
\begin{document}

\section{数学公式示例}

我们定义了两个函数:
\[
f(x) = """ + latex(f) + r"""
\]
和
\[
g(x) = """ + latex(g) + r"""
\]

\end{document}
"""

# 将LaTeX代码保存为文件
with open('math_document.tex', 'w') as f:
    f.write(latex_content)

在这个示例中,我们在Sage中定义了两个函数 f(x) g(x) ,然后将它们的LaTeX表示嵌入到一个LaTeX文档模板中。最后,将生成的LaTeX代码保存为 math_document.tex 文件。接下来,我们可以使用TeX处理器将这个文件转换为PDF文档。

6.2 自动化报告生成

在数据分析和科学研究中,我们经常需要生成包含实验结果、图表和分析的报告。利用Sage和LaTeX,我们可以实现自动化报告生成。以下是一个简单的流程:

graph TD
    A[数据收集与处理] --> B[在Sage中分析数据]
    B --> C[生成数学公式和图表]
    C --> D[将结果转换为LaTeX代码]
    D --> E[嵌入到LaTeX文档模板]
    E --> F[使用TeX处理器生成PDF报告]

具体步骤如下:
1. 数据收集与处理 :收集所需的数据,并在Sage中进行必要的处理。
2. 数据分析 :使用Sage的各种功能进行数据分析,例如计算统计量、绘制图表等。
3. 生成数学公式和图表 :将分析结果以数学公式和图表的形式表示出来。
4. 转换为LaTeX代码 :使用Sage的 latex 函数将数学公式和图表转换为LaTeX代码。
5. 嵌入到文档模板 :将生成的LaTeX代码嵌入到预先设计好的LaTeX文档模板中。
6. 生成PDF报告 :使用TeX处理器(如 pdflatex )将LaTeX文档转换为PDF报告。

7. 总结

通过本文的学习,我们掌握了高级Python编程中的异常处理和单元测试技术,以及Sage中使用LaTeX排版方程和生成PDF文件的方法。异常处理可以帮助我们更好地应对程序运行时的错误,提高代码的健壮性。单元测试则是保证代码质量的重要手段,通过合理设计测试用例,可以有效地发现代码中的潜在问题。而LaTeX与Sage的结合,为我们展示和分享数学结果提供了强大的工具,能够生成高质量的文档和报告。

在实际应用中,我们可以根据具体需求灵活运用这些技术。例如,在开发大型Python项目时,充分利用异常处理和单元测试来确保代码的稳定性和可靠性;在进行数学研究和教学时,使用LaTeX和Sage来生成精美的文档和演示材料。希望本文的内容能够对大家的编程和数学学习有所帮助。

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值