函数的通用性和可重用性:以图片处理为例

背景简介

在编程的世界里,函数是构建复杂程序的基石。它们不仅能够实现特定的功能,还应当能够被重复使用,并且易于理解和维护。本章通过图片处理的案例,深入探讨了如何设计和编写既通用又可重用的函数。

Chapter 4 Modifying Pictures Using Loops

函数设计原则

在处理图片时,我们通常会用到循环来对图片的像素进行操作。本章提出了一个关键的问题:是否有必要在每个图片处理函数中都包含打开文件和制作图片的步骤?答案是否定的。更好的做法是将这些功能分离出来,让每个函数只做一件事,即所谓的“单一职责原则”。这样,函数在不同的上下文中可以被重复使用,从而提高程序的灵活性。

举例说明

通过一个简单的例子,即制作日落效果的程序,作者展示了如何通过将一个大函数拆分为多个专门化的小函数来提高代码的可读性和可维护性。例如,原来的 makeSunset 函数被拆分为 reduceBlue reduceGreen 两个小函数,每个函数负责一个简单任务——减少蓝色和绿色。然后,主函数 makeSunset2 调用这两个函数来完成整个日落效果的制作。

def makeSunset2(picture):
    reduceBlue(picture)
    reduceGreen(picture)

def reduceBlue(picture):
    for p in getPixels(picture):
        value = getBlue(p)
        setBlue(p, value * 0.7)

def reduceGreen(picture):
    for p in getPixels(picture):
        value = getGreen(p)
        setGreen(p, value * 0.7)

模块化与可重用性

函数的模块化不仅让代码更加清晰,而且提高了函数的可重用性。例如, reduceBlue reduceGreen 函数可以被用在任何需要减少蓝色或绿色的场景中。而且,如果未来需要为数百帧图片添加日落效果,模块化的设计可以让我们轻松地通过循环处理所有帧,而不是手动为每帧选择文件。

函数的命名和参数传递

函数的命名应当反映其功能,参数传递则提供了灵活性。在本章中,作者建议使用函数参数来传递图片或文件名,而不是在函数内部打开文件。这样做不仅可以避免重复加载相同的图片,还可以让函数在不同的上下文中被复用。

def makeSunset3(filename):
    picture = makePicture(filename)
    reduceBlue(picture)
    reduceGreen(picture)

程序的层次分解

本章还讨论了程序的层次分解,即通过将一个复杂的问题分解为多个小问题,并为每个小问题编写一个专门的函数来解决,最终组合这些函数来完成整个任务。这种方法不仅可以使程序结构更加清晰,还便于管理和维护。

def lighten(picture):
    for px in getPixels(picture):
        color = getColor(px)
        color = makeLighter(color)
        setColor(px, color)

总结与启发

通过本章的学习,我们了解到函数设计的重要性和编写原则。函数应当简洁明了,只做一件事,并且具备良好的模块化和可重用性。此外,函数的命名和参数传递方式也对程序的易读性和灵活性有着重要影响。掌握了这些原则,我们就能编写出更加清晰、高效且易于维护的代码。

在实际应用中,我们应该从一开始就注重函数的通用性和可重用性,而不是急于编写完整应用程序。好的用户界面固然重要,但在没有充分掌握基础之前,我们应当先构建出能够被重复使用的代码。最终,这将有助于我们构建更加强大和灵活的软件系统。

【源码免费下载链接】:https://renmaiwang.cn/s/gxrh8 该系统采用PHP开发,功能定位为在线视频平台,并专为电影网站搭建与管理而设计。其核心优势在于具备数据采集能力,能够自动生成来自网络的影视资源链接,从而帮助用户快速构建内容库并减少手动上传工作量。在系统架构中,包含多个关键组件:配置文件(.htaccess)用于定义URL重写规则;Apache服务器配置文件(.htaccess)可能支持SEO优化、隐藏真实路径或实现目录保护等功能;IIS服务器配置文件(httpd.ini)包含了PHP配置信息、站点设置及权限管理等数据;入口文件(index.php)负责处理用户请求并展示首页内容,同时支持用户登录操作;安装脚本(install.php)引导数据库连接设置、权限验证初始数据导入过程;后台管理界面(admin.php)允许管理员完成对网站的各种控制与维护;系统介绍文档(system-intro.txt)详细描述了系统的功能特性及其适用场景;安装说明文件(install-manual.txt)提供完整的部署步骤及注意事项;合作邀请文件(invite-partners.txt)旨在吸引合作伙伴共同推广或定制该平台;HTML模板文件位于/HMPL子目录中,用于构建网站前端页面;运行时临时文件存放于/Runtime目录内,管理日志、缓存会话数据等。这些组件协同运作,形成一个功能完善且易于管理的在线视频平台系统,在合理配置下,用户可快速搭建包含电影推荐、分类、搜索与评论等功能的网站,并通过数据采集维持内容更新。对于希望进入在线视频领域的企业或个人来说,这是一份值得考虑的选择方案。
项目资源包含:可运行源码+sql文件+LW; python3.8+django+mysql5.7+html 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 本研究将应用Python编程语言进行数据处理深度学习模型的建立,结合MySQL数据库存储数据,以及采用Django框架构建用户友好的Web应用界面,为用户提供便捷操作体验。深度学习方法将是本研究的核心技术,利用卷积神经网络(CNN)等模型来实现对手写文字的特征抽取识别,从而提高系统的识别准确度稳定性。同时,引入光学字符识别(OCR)技术对文本进行处理,进一步优化手写文字的识别过程,提升整个系统的效率可靠性。 管理员功能需求主要包括密码修改、手写字识别、手写数字识别识别日志信息统计功能,以提供更方便、高效的管理监控服务。 系统将采用深度学习技术实现图像文字识别功能,通过训练模型使用预训练模型,能够准确识别上传图像中的文字信息。深度学习模型将会通过对大量样本数据的学习训练,掌握各种字体、大小颜色的特征,以提高识别准确性。在文字识别过程中,系统将进行错误处理结果记录。当发生识别错误或未能识别的情况时,系统会将相关信息进行记录,并生成日志文件,便于管理员进行问题分析修复。为了提高系统的性能稳定性,采用异步任务队列来处理识别请求,将请求响应分离,减少延迟时间,提升系统的并发处理能力。
【源码免费下载链接】:https://renmaiwang.cn/s/2s69k IT 行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰,但是,我们要清楚:淘汰的永远只是那些初级水平的从业者,过硬技术的从业者永远都是稀缺的。因此对于学习,我们还是要踏踏实实的。 自学 Python ,也是一样,不要一开始因为头脑发热就不停地收藏各种资料网站,购买各种书籍,下载了大量的教学视频,过了几天,学习的热情开始褪去,再过几个星期,终于完成了学习课程 —— 《从入门到放弃》。所以,学习 Python 需要一步一个脚印,踏踏实实地学。 FQ 在讲 Python 如何入门之前,个人建议最好每个人都有自己的 FQ 工具,多使用 Google 搜索,多去看一下墙外的世界,多看 上的开源项目。 至于如何 FQ ,这里提供一下我用过的工具:FQ工具集 Python 学习资源集 相信很多人学习某门编程语言的时候,都会找各种学习资料。说句实话,资料太多,反而没用,根据自己的学习习惯,个人能力选择一门资源坚持学就好了。 因为每个人的需求不同,这里整理了一批 Python 比较好的学习资料: Python 博客网站资源 还有一些有趣的网站: 一个可以看执行过程的网站 Python 入门 对于入门,主要是掌握基本的语法熟悉编程规范,因此大部分的教程基本一致的,所以还是建议选好适合自己的一个教程,坚持学下去。 在 Python 入门中,本人编写了一系列的 《草根学 Python 》 文章, 是基于 Python 3.6 写的 Python 入门系列教程,为了更好的阅读,把它整理在 GitBook 上,希望对各位入门 Python 有所帮助。 注:2018 年 02 月 27 日,基础知识入门部分已经完成了的。因近期读者反映有些图片没法打开了(之前图片放在七牛云,用的是临时链接,最
### 可读性 - **命名规范**:使用有意义的命名,变量函数名称要能清晰表达用途功能,遵循一致的命名约定,如匈牙利命名法驼峰命名法。避免随意缩写,杜绝完全不规范的英文缩写,防止降低代码的可阅读性。如在Python测试脚本中,使用 `test_user_login` 来命名用户登录测试函数,而不是 `test1` [^3]。 ```python def test_user_login(): # 测试用户登录的代码逻辑 pass ``` - **代码缩进**:使用空格而不是制表符进行缩进,通常以4个空格为单位,确保代码结构清晰易读。 ```python if condition: # 满足条件时执行的代码 do_something() ``` - **编写注释**:在关键位置添加注释,解释代码逻辑目的,便于他人理解维护。特别是对于公共接口复杂的逻辑块,要编写详细的文档注释。 ```python # 计算两个数的 def add_numbers(a, b): return a + b ``` - **代码结构清晰**:将代码分解为小的模块或函数,降低复杂度,提高代码的可读性可维护性。不同功能的代码块进行合理划分,使用空行缩进增强代码的视觉结构。 ```python def setup(): # 测试前的准备工作 pass def test_function(): # 具体的测试逻辑 pass def teardown(): # 测试后的清理工作 pass ``` ### 可重用性 - **模块化封装**:将代码分解为小的模块或函数,把重复代码抽象成可复用的函数或类,提高代码可重用性如在Python编程中,自定义函数是提升代码重用性可读性的有效手段。 ```python # 可复用的函数,用于检查字符串是否为空 def is_string_empty(s): return len(s) == 0 # 在不同的测试用中复用该函数 def test_case_1(): string = "" assert is_string_empty(string) def test_case_2(): string = "not empty" assert not is_string_empty(string) ``` - **避免重复代码**:识别并提取重复的代码逻辑,将其封装成通用的函数或类,避免在多个地方重复编写相同的代码。 ### 可维护性 - **易于修改**:代码结构要清晰,各个模块之间的耦合度低,当需求发生变化时,能够方便地对代码进行修改扩展,而不会影响到其他部分的功能。 - **错误处理日志记录**:在测试脚本中添加适当的错误处理机制,捕获并处理可能出现的异常,同时记录详细的日志信息,方便后续的问题排查调试。 ```python try: # 可能会抛出异常的代码 result = divide_numbers(10, 0) except ZeroDivisionError as e: # 记录错误日志 import logging logging.error(f"Error: {e}") ``` - **版本控制**:使用版本控制系统(如Git)对测试脚本进行管理,记录代码的变更历史,方便团队成员之间的协作代码的回溯。 ### 可移植性 - **跨平台兼容性**:编写的测试脚本应能够在不同的操作系统(如Windows、Linux、macOS)环境中运行,避免使用特定平台的特性依赖。 - **依赖管理**:明确列出测试脚本所依赖的库工具,并使用合适的包管理工具(如pip、npm)进行管理,确保在不同环境中能够正确安装使用这些依赖。 ```python # requirements.txt requests==2.28.1 pytest==7.2.0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值