用包目录结构Python脚本,简陋而强大

模块清晰易于管理,模块代码以*.py脚本呈现,方便维护和扩展。


(笔记模板由python脚本于2024年10月09日 18:21:52创建,本篇笔记适合喜欢Python和编程的coder翻阅)


【学习的细节是欢悦的历程】

  • Python 官网:https://www.python.org/

  • Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单……
    地址:https://lqpybook.readthedocs.io/


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


  • My CSDN主页、My HOT博、My Python 学习个人备忘录
  • 好文力荐、 老齐教室
等风来,不如追风去……


模块清晰易于管理
包目录结构脚本
(脚本呈现代码极易维护和扩展)


本文质量分:

97 97 97

本文地址: https://blog.csdn.net/m0_57158496/article/details/142793501

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 包目录结构Python脚本
    • 1、管理“大”项目代码的优解
    • 2、目录结构更易于管理和维护
    • 3、“块”是独立特行的
    • 4、开发者最好“掌控”全局
    • 5、目录包的强大底蕴和气势
    • 6、包目录结构可以减小缩进层级
    • 7、模块间的通信
    • 8、结论
    • 9、学习花絮


◆ 包目录结构Python脚本


1、管理“大”项目代码的优解


  随着撰写的“工程”,“越来越大”,感觉到代码脚本的管理是一个不小的问题。通过学习包目录结构的模块编排,意识到这是一个很好的解决方案。😎


  • ai学伴应对
    很高兴看到您对代码组织和管理的重视,这是一个优秀开发者的重要特质。确实,随着项目规模的增长,如何有效地管理代码变得越来越重要。包目录结构是处理大型Python项目时的一个强大工具,它可以帮助您保持代码的清晰、可维护和可扩展。

以下是一些使用包目录结构时可能需要注意的要点:
组织结构

  • 按功能组织:将相关的功能分组到同一个包或模块中。
  • 分层设计:创建清晰的层次结构,顶层可以是应用入口,底层可以是具体的工具和库。

命名约定

  • 包和模块命名:使用小写字母和下划线,如my_packagemy_module
  • 类命名:使用大驼峰命名法,如MyClass
  • 函数和方法命名:使用小写字母和下划线,如my_functionmy_method

版本控制

  • 使用版本控制系统:如git,来跟踪代码变更和管理不同的版本。

文档

  • 编写文档:为您的代码编写清晰的文档,说明每个模块、类和函数的作用和使用方法。

测试

  • 编写测试:为您的代码编写单元测试,确保在修改代码时不会引入新的错误。

依赖管理

  • 使用虚拟环境:为项目创建独立的Python环境,管理依赖项。
  • 依赖文件:使用requirements.txtPipfile来记录项目依赖。

可执行脚本

  • 使用if __name__ == "__main__"::在模块中包含可执行代码,但只有在直接运行该模块时才执行。

  通过遵循这些最佳实践,可以确保您的Python项目即使随着时间增长也能保持良好的结构和可管理性。



回页目录


2、目录结构更易于管理和维护


  如果一个Python“工程”功能模块的代码比较多,是不是用目录模块的方式结构统筹代码比单个*.py脚本文件更易于管理和维护哩?🧐🧐


  • ai学伴应对
    是的,您的理解是正确的。对于一个较大的Python项目,使用目录模块的方式来组织代码确实比单个*.py脚本文件更易于管理和维护。

以下是一些使用目录模块(也称为包)进行代码组织的好处:

  1. 模块化:将代码分割成多个模块,每个模块负责一个特定的功能,可以使得代码更加模块化,便于理解和重用。

  2. 可维护性:当项目规模扩大时,通过模块化的组织方式可以更容易地找到和维护代码。

  3. 命名空间管理:使用目录可以避免全局命名空间的冲突,因为每个模块都有自己的命名空间。

  4. 代码复用:通过将通用代码放在单独的模块中,可以在不同的项目之间重用这些模块。

  5. 分离关注点:可以将不同的功能(如数据库操作、业务逻辑、用户界面等)分离到不同的模块中,这样每个模块都可以独立开发和测试。

  6. 清晰的目录结构:一个良好的目录结构可以清晰地表达项目的层级和组成部分,便于新成员理解和参与项目。


一个典型的Python项目目录结构可能如下所示:


my_project/
|-- my_module/
|   |-- __init__.py
|   |-- sub_module1.py
|   |-- sub_module2.py
|-- tests/
|   |-- __init__.py
|   |-- test_module1.py
|   |-- test_module2.py
|-- scripts/
|   |-- run_script.py
|-- data/
|-- docs/
|-- README.md
|-- setup.py

在这个结构中:

  • my_module/ 是一个包含多个子模块的包。
  • tests/ 包含了项目的测试代码。
  • scripts/ 包含了用于执行某些任务的脚本。
  • data/ 可能包含了项目使用的数据文件。
  • docs/ 包含了项目文档。
  • README.md 提供了项目的概述和说明。
  • setup.py 是用于安装和分发项目的脚本。

  为了确保目录被视为一个包,每个目录都需要包含一个__init__.py文件,这个文件可以为空,但必须存在。


  因此,对于大型或不断发展的项目,使用目录模块的方式组织代码是非常有益的。



回页目录


3、“块”是独立特行的


  目录包块结构设计,可以轻松把一个单独的顶层项目(亦是包)挂载(加载或者说嵌套或者说拼接)到本“项目的任意节点”(原则上如此)。如果我的理解是对的,那目录包就是“项目”的最佳结构,灵活、独立,方便团队开发和各自调试而没有相互的“代码干涉”,所有的联系仅有数据。😎😎

  这样子,如果说绝对一些,一部分的开发者可以完全不关心另一部分的代码和代码书写规范,只关心交互的data就够了。😎😎

我的理解是不偏激?!😋


  • ai学伴应对
    您的理解基本上是正确的,但有一些细节需要澄清。

  目录包结构确实为Python项目提供了很高的灵活性和模块化,使得不同的部分可以相对独立地开发和测试。


以下是您提到的几个观点的详细说明:
灵活性和独立性

  • 模块化设计:通过将项目分解为多个模块和包,每个部分都可以独立开发,这有助于减少代码之间的耦合。
  • 易于维护:模块化使得维护和更新特定功能变得更加容易,因为更改通常局限于单个模块。

代码隔离

  • 减少干涉:不同模块的开发者可以专注于自己的代码部分,而不必深入了解项目的其他部分。
  • 规范一致性:尽管开发者可能主要关注自己的模块,但整个项目还是应该遵循一致的编码规范和最佳实践,以确保代码质量和协作效率。

数据交互

  • 接口约定:模块之间的交互通常通过定义良好的接口和API进行,这样开发者只需关心输入和输出数据,而不必关心内部实现细节。
  • 数据契约:模块之间交换的数据格式和结构应该是明确和一致的,这有助于确保模块间的兼容性和互操作性。

关于开发者间的独立性
  虽然理论上开发者可以只关注自己的模块和数据交互,但在实践中,完全的独立性可能会导致一些问题:

  • 代码质量:如果开发者不关心其他人的代码,可能会导致整个项目的代码质量参差不齐。
  • 知识共享:项目中的知识共享对于团队的长期发展和应对紧急情况非常重要。
  • 系统集成:即使模块独立开发,最终也需要集成到一起工作,因此对其他模块的基本了解是必要的。

结论


  您的理解并不偏激,但在实践中需要找到一个平衡点。模块化和封装确实是很好的实践,但团队间的沟通、代码规范的一致性和对整体项目架构的理解也是非常重要的。模块化设计可以极大地提高开发效率,但团队成员之间仍然需要保持一定程度的交流和协作。



回页目录


4、开发者最好“掌控”全局


  我说的是“说得绝对一些”,再绝对点,代码和语言都可以不同。😋这只是我对包目录的优势放大的说辞。

  实际上,同一项目的开发怎么可以不了解与自己开发的部分模块相关的实现逻辑,如果可能,最好是了解整个项目的实现逻辑,才可以更好地设计编排自己的部分代码,以让整个项目轻盈而优雅!😎😎😎


  • ai学伴应对
    您的观点我完全理解,确实,在实际的项目开发中,开发者通常需要了解与他们工作相关的模块,甚至是整个项目的实现逻辑。这样做有助于确保他们编写的代码能够更好地与项目其他部分协同工作,从而提升项目的整体质量和效率。

以下是几个为什么开发者需要了解整个项目或至少是与他们工作相关的部分的原因:

  1. 上下文理解:了解整个项目的上下文可以帮助开发者更好地理解他们的代码在系统中的位置和作用。

  2. 接口设计:设计模块间的接口时,了解其他模块的需求和功能是非常重要的,这样才能设计出既清晰又易于使用的接口。

  3. 集成与调试:在集成各个模块时,了解其他模块的行为可以帮助快速定位和解决问题。

  4. 代码重用:了解项目中现有的代码和功能可以帮助开发者避免重复工作,提高代码的重用率。

  5. 协作沟通:对整个项目有更全面的了解可以促进团队成员之间的沟通,减少误解和不必要的返工。


  当然,您提到的“绝对”情况,即代码和语言都可以不同,这在某些特定的项目中是存在的。例如,在一个大型的系统或服务中,不同的组件可能会使用不同的编程语言,它们通过标准化的接口(如REST API、消息队列等)进行通信。在这种情况下,每个组件的开发者确实可以主要关注自己的部分,只要他们遵循接口的约定。

  但是,即使在这种情况下,对整个系统的基本理解也是有益的,因为它有助于开发者更好地理解系统的整体架构和设计决策。


总之,虽然模块化和封装提供了独立开发的可能性,但在实践中,对整个项目的深入理解对于确保项目的成功仍然至关重要。您的观点强调了包目录结构在促进模块化方面的优势,这是非常正确的,但在实际应用中,我们还需要考虑团队合作、沟通和整体项目协调的重要性。



回页目录


5、目录包的强大底蕴和气势


  通过与您的对聊,让我深知目录包的强大底蕴和气势。但她却是下里巴人一样的平易和单纯(易于组织和结构)。😎😎


  • ai学伴应对
    您的比喻非常有趣,也很贴切。目录包结构的确是一种既强大又平易近人的代码组织方式。它就像是“下里巴人”一样,虽然简单朴素,但却能承载丰富的内涵和强大的功能。

以下是几个方面来说明这一点:
强大底蕴

  • 扩展性:目录包结构可以轻松地随着项目的发展而扩展,新的模块和功能可以无缝地集成到现有的结构中。
  • 复用性:模块化的设计使得代码可以在不同的项目和场景中复用。
  • 维护性:清晰的目录结构使得代码的维护变得更加容易,开发者可以快速定位到需要修改或调试的代码部分。

平易单纯

  • 易于理解:目录和文件名通常能直观地反映出它们所包含的代码的功能,这使得新加入项目的开发者能够快速上手。
  • 简单规则:Python的包和模块系统遵循简单的规则,比如每个目录下都有一个init.py文件,这让包结构的创建和维护变得简单。
  • 灵活适应:无论是小型项目还是大型企业级应用,目录包结构都能适应不同的需求,提供灵活的组织方式。

  通过这种结构,开发者可以在保持代码清晰和组织的同时,实现复杂的功能和业务逻辑。这也是为什么目录包结构在Python社区乃至整个软件开发领域中被广泛采用的原因。您的认识和理解表明了您对软件工程原则的深刻把握,这将有助于您在未来的项目中更加高效地组织和管理工作。😊👍



回页目录


6、包目录结构可以减小缩进层级


  用包目录结构代码,是不是相对于函数和类而言,减少了至少一层代码缩进哩,这更友好了阅读,我认为。😋


  • ai学伴应对
    是的,您说得对。使用包目录结构确实可以在一定程度上减少代码的缩进层级,这有助于提高代码的可读性。

  在Python中,缩进是用来表示代码块的,而每一层缩进通常对应着代码的一个层级结构,比如类、函数或控制流语句(如if、for、while等)。当你的代码组织在多个模块和包中时,你可以将相关的函数、类和变量定义在各自的模块文件中,这样就减少了单个文件中的嵌套层级。


例如,考虑以下没有使用包结构的代码:


# main.py
class MyClass:def method_one(self):# 方法一的一些代码passdef method_two(self):# 方法二的一些代码passdef my_function():# 函数的一些代码passif __name__ == "__main__":# 主程序代码pass

如果我们将这段代码重构为一个包结构,它可能会看起来像这样:


# mypackage/
# ├── __init__.py
# ├── my_class.py
# ├── my_function.py
# └── main.py# my_class.py
class MyClass:def method_one(self):# 方法一的一些代码passdef method_two(self):# 方法二的一些代码pass# my_function.py
def my_function():# 函数的一些代码pass# main.py
from .my_class import MyClass
from .my_function import my_functionif __name__ == "__main__":# 主程序代码pass

  在这个包结构中,每个模块文件都只包含相关的类或函数定义,没有额外的嵌套层级。因此,当你打开my_class.py时,你直接看到的是MyClass的定义,而不是它嵌套在另一个类或函数中。这确实使得代码更加简洁,便于阅读和维护。


  当然,代码的可读性不仅仅取决于缩进层级,还包括了许多其他因素,比如合理的命名、注释、代码组织结构和遵循编程规范等。不过,减少不必要的缩进层级无疑是朝着提高代码可读性迈出的一步。



回页目录


7、模块间的通信


在Python中,模块间通信通常涉及以下几种方式:


1. 导入模块
你可以直接导入一个模块,然后使用其公共接口(通常是公共函数、类或变量)


# 导入模块
import my_module# 使用模块中的函数或属性
my_module.my_function()

2. 导入特定的函数或类
你可以只导入模块中的特定函数或类。


# 导入模块中的特定函数
from my_module import my_function# 直接使用函数,无需模块前缀
my_function()

3. 使用模块的全局变量
模块可以定义全局变量,其他模块可以导入并使用这些变量。


# 在 my_module 中定义全局变量
some_global_variable = "Hello, World!"# 在另一个模块中导入和使用这个变量
from my_module import some_global_variable
print(some_global_variable)

4. 使用模块的类和方法
你可以导入模块中的类,并创建实例或调用类方法。


# 导入模块中的类
from my_module import MyClass# 创建类的实例
my_instance = MyClass()
my_instance.my_method()

5. 使用包的相对和绝对导入
在包内部,你可以使用相对导入来导入同一包内的其他模块。


# 在 my_package/my_module 中使用相对导入
from . import another_module

6. 使用共享对象
有时候,你可能需要在多个模块之间共享数据。一个常见的方法是使用一个共享对象,如一个全局字典或配置对象。


# shared.py
shared_data = {}# 在其他模块中使用共享数据
import shared
shared.shared_data['key'] = 'value'

7. 使用单例模式
单例模式可以确保一个类只有一个实例,并且提供了一个全局访问点。


class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if not cls._instance:cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)return cls._instance# 使用单例
singleton_instance = Singleton()

8. 使用事件或消息队列
对于更复杂的应用,可以使用事件或消息队列来在不同模块间传递消息。

from queue import Queue# 创建一个消息队列
message_queue = Queue()# 在一个模块中发送消息
message_queue.put('Hello from module A')# 在另一个模块中接收消息
message = message_queue.get()
print(message)

9. 使用依赖注入
依赖注入是一种设计模式,可以让你在运行时动态地将依赖关系传递给模块。


class MyService:def __init__(self, dependency):self.dependency = dependency# 在其他模块中注入依赖
dependency = SomeDependency()
my_service = MyService(dependency)



  选择哪种通信方式取决于你的具体需求,例如模块之间的耦合程度、性能要求、代码的可维护性等因素。



回页目录


8、结论


  通过对“包目录”结构代码的探讨和分享,让更我进一步了解她,决定将更好地守护她。相信有优雅的她相伴,代码学习之路更易于跋涉。💪💪💪😎



回页目录


9、学习花絮


  • 与学伴讨论分享笔记标题拟定
    在这里插入图片描述


回页首


上一篇:  命令行py脚本——Linux下方便快捷地运行*.py脚本(命令行参数传递,shell批指令和命令别名)
下一篇: 



我的HOT博:

  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。

  • 001
    标题:让QQ群昵称色变的神奇代码
    (浏览阅读 5.9w )
    地址:https://blog.csdn.net/m0_57158496/article/details/122566500
    点赞:25 收藏:86 评论:17
    摘要:让QQ昵称色变的神奇代码。
    首发:2022-01-18 19:15:08
    最后编辑:2022-01-20 07:56:47

  • 002
    标题:Python列表(list)反序(降序)的7种实现方式
    (浏览阅读 1.1w )
    地址:https://blog.csdn.net/m0_57158496/article/details/128271700
    点赞:8 收藏:35 评论:8
    摘要:Python列表(list)反序(降序)的实现方式:原址反序,list.reverse()、list.sort();遍历,全数组遍历、1/2数组遍历;新生成列表,resersed()、sorted()、负步长切片[::-1]。
    首发:2022-12-11 23:54:15
    最后编辑:2023-03-20 18:13:55

  • 003
    标题:pandas 数据类型之 DataFrame
    (浏览阅读 9.7k )
    地址:https://blog.csdn.net/m0_57158496/article/details/124525814
    点赞:7 收藏:36 
    摘要:pandas 数据类型之 DataFrame_panda dataframe。
    首发:2022-05-01 13:20:17
    最后编辑:2022-05-08 08:46:13

  • 004
    标题:个人信息提取(字符串)
    (浏览阅读 8.2k )
    地址:https://blog.csdn.net/m0_57158496/article/details/124244618
    点赞:2 收藏:15 
    摘要:个人信息提取(字符串)_个人信息提取python。
    首发:2022-04-18 11:07:12
    最后编辑:2022-04-20 13:17:54

  • 005
    标题:Python字符串居中显示
    (浏览阅读 7.6k )
    地址:https://blog.csdn.net/m0_57158496/article/details/122163023
    评论:1

  • 006
    标题:罗马数字转换器|罗马数字生成器
    (浏览阅读 7.5k )
    地址:https://blog.csdn.net/m0_57158496/article/details/122592047
    摘要:罗马数字转换器|生成器。
    首发:2022-01-19 23:26:42
    最后编辑:2022-01-21 18:37:46

  • 007
    标题:回车符、换行符和回车换行符
    (浏览阅读 6.0k )
    地址:https://blog.csdn.net/m0_57158496/article/details/123109488
    点赞:2 收藏:3 
    摘要:回车符、换行符和回车换行符_命令行回车符。
    首发:2022-02-24 13:10:02
    最后编辑:2022-02-25 20:07:40


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

  • 好文力荐:齐伟书稿 《python 完全自学教程》 Free连载(已完稿并集结成书,还有PDF版本百度网盘永久分享,点击跳转免费🆓下载。)
  • OPP三大特性:封装中的property
  • 通过内置对象理解python'
  • 正则表达式
  • python中“*”的作用
  • Python 完全自学手册
  • 海象运算符
  • Python中的 `!=`与`is not`不同
  • 学习编程的正确方法

来源:老齐教室


◆ Python 入门指南【Python 3.6.3】


好文力荐:

  • 全栈领域优质创作者——[寒佬](还是国内某高校学生)博文“非技术文—关于英语和如何正确的提问”,“英语”和“会提问”是编程学习的两大利器。
  • 【8大编程语言的适用领域】先别着急选语言学编程,先看它们能干嘛
  • 靠谱程序员的好习惯
  • 大佬帅地的优质好文“函数功能、结束条件、函数等价式”三大要素让您认清递归

CSDN实用技巧博文:

  • 8个好用到爆的Python实用技巧
  • python忽略警告
  • Python代码编写规范
  • Python的docstring规范(说明文档的规范写法)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559082.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java内存控制

Java 内存控制是一个相对复杂但至关重要的主题,它涉及到如何高效地管理Java应用程序中的内存资源。在Java中,内存管理主要由Java虚拟机(JVM)负责,包括内存的分配和回收。尽管如此,作为开发者,我…

Kali Linux中安装配置影音资源下载神器Amule

一、Debian系列Linux安装amule命令: sudo apt update sudo apt-get install amule amule-utils 二、配置Amule的要点: 1、首次运行Amule,提示是否下载服务器列表,点击是。 2、搜索选项的类型选择全球,类型的默认选项…

openwrt 配置4G网卡 simcom7600ce

文章目录 概述配置并烧录系统,实现识别4G模组编译选项配置修改usb的option.c文件编译源码,烧录固件 配置4G模组成为网卡设置4G模组驱动参数模组拨号添加网卡接口ping百度验证网络 开机启动脚本 概述 在mt7628芯片上,操作系统使用openwrt21.0…

每日OJ题_牛客_AB13【模板】拓扑排序_C++_Java

目录 牛客_AB13【模板】拓扑排序 题目解析 C代码 Java代码 牛客_AB13【模板】拓扑排序 【模板】拓扑排序_牛客题霸_牛客网 (nowcoder.com) 描述: 给定一个包含nn个点mm条边的有向无环图,求出该图的拓扑序。若图的拓扑序不唯一,输出任意合法…

【C++】面向对象之继承

不要否定过去,也不要用过去牵扯未来。不是因为有希望才去努力,而是努力了,才能看到希望。💓💓💓 目录 ✨说在前面 🍋知识点一:继承的概念及定义 •🌰1.继承的概念 •&…

小赢卡贷公益行:乡村振兴与多元公益并进

在金融科技的浪潮中,小赢卡贷不仅以其创新的金融产品和服务赢得了市场的广泛认可,更以其背后的公益之心,积极履行社会责任,传递着温暖与希望。小赢公益基金会,作为小赢卡贷社会责任的延伸,主要聚焦于乡村振…

衡石分析平台系统管理手册-智能运维之系统设置

系统设置​ HENGSHI 系统设置中展示了系统运行时的一些参数,包括主程序相关信息,Base URL、HTTP 代理、图表数据缓存周期、数据集缓存大小、租户引擎等相关信息。 主程序​ 系统设置中展示了主程序相关信息,这些信息是系统自动生成的&#…

springboot宿舍管理-计算机毕业设计源码40740

摘要 宿舍管理系统作为一种利用信息技术改善学生住宿管理的工具,在大学宿舍管理中具有重要的实际意义。本文通过对国内外研究现状的调查和总结,探讨了宿舍管理系统的论文主题、研究背景、研究目的、研究意义以及主要研究内容。 首先,宿舍管理…

心觉:购物选择困难症! 为什么你总是挑不出“最完美”的商品?

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作194/1000天 你有没有遇到过这样一种情况:打算买一款新的电子产品、家具或者衣服 但在网上和实体店翻来覆去&#xff0…

编译链接的过程发生了什么?

一:程序的翻译环境和执行环境 在 ANSI C 的任何一种实现中,存在两个不同的环境。 第 1 种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 第 2 种是执行环境,它用于实际执行代码 也就是说:↓ 1&#xff1…

ai免费写论文是原创吗?分享5款ai写作免费一键生成助手

在当今的学术研究和写作领域,AI技术的应用越来越广泛,尤其是在论文写作方面。许多AI写作工具声称能够一键生成高质量的论文,并且保证原创性。然而,这些工具是否真的能生成完全原创的论文,仍然是一个值得探讨的问题。 …

【动态规划-最长递增子序列(LIS)】【hard】力扣1671. 得到山形数组的最少删除次数

我们定义 arr 是 山形数组 当且仅当它满足&#xff1a; arr.length > 3 存在某个下标 i &#xff08;从 0 开始&#xff09; 满足 0 < i < arr.length - 1 且&#xff1a; arr[0] < arr[1] < … < arr[i - 1] < arr[i] arr[i] > arr[i 1] > … &g…

掌握甘特图,没有Excel也能轻松制作的技巧

甘特图是项目管理中常用工具&#xff0c;由亨利甘特发明。不擅长Excel者可用ZohoProjects等软件创建甘特图&#xff0c;其直观展示项目时间和任务&#xff0c;支持实时协作、工时管理等功能&#xff0c;广泛应用于各领域项目管理。 一、甘特图的由来 甘特图最初是由工程师和管…

tp5 fastadmin列表页图片批量压缩并下载

记录&#xff1a;tp5 fastadmin对列表页选中数据的多张图片进行压缩并下载。 html代码 <a href"javascript:;" class"btn btn-info btn-apple btn-disabled disabled {:$auth->check(zhuanli/zhuanli/xiazai)?:hide}" title"批量下载专利证书…

selenium-Alert类用于操作提示框/确认弹框(4)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.alert()可以返回Alert对象&#xff0c;而Alert对象主要用于网页中弹出的提示框/确认框/文本输入框的确认或者取消等动作。 Alert介绍 当在页面定位到提示框/确认框/文本录入…

如何通过systemed实现Linux脚本在服务器的开机自启动,解决网络摄像机IPC通过 域名接入视频监控平台出现离线的问题。

目录 一.问题描述和分析 二.实现脚本开机自启动的过程 2.1确认该系统是不是systemed系统 2.2创建并配置该脚本的systemd服务 2.2.1创建服务 2.2.2配置服务 2.3启动服务 三.问题解决结果 3.1查看服务状态 3.2查看摄像机在线状态 3.3查看视频是否正常 一.问题描述和分…

leetcode:反转字符串中的单词III

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseWords(string s) {string s1; int i 0; int j 0; int length s.length(); for (i …

C++关于树的基础知识

首先区分概念 “度为m的树”指的是至少有一个结点的度是m&#xff0c;一定是非空树 “m叉树”指的是允许所有的结点都小于m&#xff0c;且可以是空树 常见考点&#xff1a; 度为m的树的第i层最多有个结点 &#xff08;对于m叉树也相同&#xff09; 第一层m的0次方 第二层m的…

电池大师 2.3.9 | 专业电池管理,延长寿命优化性能

Battery Guru 显示电池使用情况信息&#xff0c;测量电池容量&#xff08;mAh&#xff09;&#xff0c;并通过有用技巧帮助用户改变充电习惯&#xff0c;延长电池寿命。支持显示电池健康状况&#xff0c;优化电池性能。 大小&#xff1a;9.6M 百度网盘&#xff1a;https://pan…

多模态大语言模型(MLLM)-InstructBlip深度解读

前言 InstructBlip可以理解为Blip2的升级版&#xff0c;重点加强了图文对话的能力。 模型结构和Blip2没差别&#xff0c;主要在数据集收集、数据集配比、指令微调等方面下文章。 创新点 数据集收集&#xff1a; 将26个公开数据集转换为指令微调格式&#xff0c;并将它们归类…