Python工匠 | 全书要点汇总

news2024/12/23 3:52:50

请添加图片描述

前言

Python前前后后我学了好几遍了,了解了Python中的许多用法,但都为快速入门之类的教程,基于“要干什么 --> 怎么做”的模式学习。而在动手编程的过程中,我常常感觉心有所惑,于是决定更系统地去学习、了解Python知识。

但通过什么学习呢,视频,还是书籍?我想了想,还是选择了书,书的知识体系往往更加系统和详细。我打开了豆瓣,看看有哪些评分比较高的书。我从中挑出了几本:《Python编程 从入门到实践》、《流畅的Python》、《Python工匠 案例、技巧与工程实践》、《Effective Python》,对比了它们的目录,最终选择了这本Python工匠。

读起来体验感还不错,如果Python语言是把斧子,那有的入门书籍就像是买斧子送的产品说明书,而这本书则像是李逵的《黑风斧法》。(想不出合适的比喻了,就这样吧

这本书我7天看了第一遍,感觉整体还比较好懂,但从”第八章——装饰器“开始,难度有所上升,读时留了一些还未理解的地方。

本文可在开发同时,快速回顾各种注意事项,审查自己的代码。

文章目录

  • 前言
  • 1 变量与注释
  • 2 数值与字符串
  • 3 容器类型
  • 4 条件分支控制流
  • 5 异常与错误处理
  • 6 循环与可迭代对象
  • 7 函数
  • 8 装饰器
  • 9 面向对象编程
  • 10 面向对象设计原则(上)
  • 11 面向对象设计原则(下)
  • 12 数据模型与描述符
  • 13 开发大型项目


:以下内容完全摘自《Python工匠 案例、技巧与工程实践》 一书。

1 变量与注释

1、变量和注释决定第一印象

  • 变量和注释是代码里最接近自然语言的东西,它们的可读性非常重要。
  • 即使是同一个算法,变量和注释不一样,给人的感觉也会截然不同。

2、基础知识

  • Python的变量赋值语法非常灵活,可以使用*variables星号表达式灵活赋值。
  • 编写注释的两个要点:不要用来屏蔽代码,不要用来解释为什么。
  • 接口注释是为使用者而写,因此应该简明扼要地描述函数职责,而不必包含太多内部细节。
  • 可以使用Sphinx格式文档或类型注解给变量标明类型。

3、变量名字很重要

  • 给变量起名要遵循PEP8原则,代码的其他部分也同样如此。
  • 尽量给变量起描述性强的名字,但评价描述性也需要结合场景。
  • 在保证描述性的前提下,变量名的长度要尽量短。
  • 变量名要匹配它所表达的类型。
  • 可以使用一两个字母的超短名字,但注意不要过度使用。

4、代码组织技巧

  • 按照代码的职责来组织代码:让变量定义靠近使用。
  • 适当定义临时变量可以提升代码的可读性。
  • 不必要的变量会让代码显得冗长、啰嗦。
  • 同一个作用域内不要有太多变量,解决办法:提炼数据类、拆分函数。
  • 空行也是一种特殊的“注释”,适当的空行可以让代码更易读。

5、代码的可维护性技巧

  • 保持变量在两个方面的一致性:名字一致性和类型一致性。
  • 显式优于隐式:不要使用locals()批量获取变量。
  • 把接口注释当成一种函数设计工具:先写注释,后写代码。

2 数值与字符串

1、数值基础知识

  • Python的浮点数有精度问题,请使用Decimal对象做精确的小数运算。
  • 布尔类型是整型的子类型,布尔值可以当作0和1来使用。
  • 使用float('inf')无穷大可以简化边界处理逻辑。

2、字符串基础知识

  • 字符串分为两类:str(给人阅读的文本类型)和bytes(给计算机阅读的二进制类型)
  • 通过.encode().decode()可以在两种该字符串之间做转换
  • 优先推荐的字符串格式化方式(从前往后):f-string、str.format()、C语言风格格式化
  • 使用以r开头的字符串内置方法可以从右往左处理字符串,特定场景下可以派上用场
  • 字符串拼接并不慢,不要因为性能原因害怕使用它

3、代码可读性技巧

  • 在定义数值字面量时,可以通过插入_字符来提升可读性
  • 不要出现“神奇”的字面量,使用常量或者枚举类型替换它们
  • 保留数学算式表达式不会影响性能,并且可以提升可读性
  • 使用textwrap.dedent()可以让多行字符串更好地融入代码

4、代码可维护性技巧

  • 当操作SQL语句等结构化字符串时,使用专有模块比裸处理的代码更易于维护
  • 使用Jinja2模板来代替字符串拼接操作

5、语言内部知识

  • 使用dis模块可以查看Python字节码,帮助我们理解内部原理
  • 使用timeit模块可以对Python代码方便地进行性能测试
  • Python语言进化得特别快,不要轻易被旧版本的“经验”所左右

3 容器类型

1、基础知识

  • 在进行函数调用时,传递的不是变量的值或者引用,而是变量所指对象的引用
  • Python内置类型分为可变与不可变两种,可变性会影响一些操作的行为,比如+=
  • 对于可变类型,必要时对其进行拷贝操作,能避免产生意料之外的影响
  • 常见的浅拷贝方式:copy.copy,推导式,切片操作

2、列表与元组

  • 使用enumerate可以在遍历列表的同时获取下标
  • 函数的多返回值其实是一个元组
  • 不存在元组推导式,但可以使用tuple来将生成器表达式转换为元组
  • 元组经常用来表示一些结构化的数据

3、字典与集合

  • 在Python3.7版本前,字典类型是无序的,之后变为保留数据的插入顺序
  • 使用OrderedDict可以在Python3.7以前的版本里获取有序字典
  • 只有可哈希的对象才能存入集合,或者作为字典的键使用
  • 使用有序字典OrderedDict可以快速实现有序去重
  • 使用fronzenset可以获得一个不可变的集合对象
  • 集合可以方便地进行集合运算,计算交集、并集
  • 不要通过集成dict来创建自定义字典类型

4、代码可读性技巧

  • 具名元组比普通元组可读性更强
  • 列表推导式可以更快速地完成遍历、过滤、处理以及构建新列表操作
  • 不要编写过于复杂的推导式,用朴实的代码代替就好
  • 不要把推导式当作代码量更少的循环,写普通循环就好

5、代码可维护性技巧

  • 当访问的字典键不存在时,可以选择捕获异常或先做判断,优先推荐捕获异常
  • 使用getsetdefault、带参数的pop方法可以贱货边界处理逻辑
  • 使用具名元组作为返回值,比普通元组更好扩展
  • 当字典键不存在时,使用defaultdict可以简化处理
  • 继承MutableMapping可以方便地创建自定义字典类,封装处理逻辑
  • 用生成器按需返回成员,比直接返回一个结果列表更灵活,也更省内存
  • 使用动态解包语法可以方便地合并字典
  • 不要再遍历列表的同时修改,否则会出现不可预期的结果

6、代码性能要点

  • 列表的底层实现决定了它的头部操作很慢,deque类型则没有这个问题
  • 当需要判断某个成员在容器中是否存在时,使用字典/集合更快

4 条件分支控制流

1、条件分支语句惯用写法

  • 不要显式地和布尔值作比较
  • 利用类型本身的布尔值规则,省略零值判断
  • not代表的否定逻辑移入表达式内部
  • 仅在需要判断某个对象是否式NoneTrueFalse时,使用is运算符

2、Python数据模型

  • 定义__len____bool__魔法方法,可以自定义对象的布尔值规则
  • 定义__eq__方法,可以修改对象在进行==运算时的行为

3、代码可读性技巧

  • 不同分支内容易出现重复或类似的代码,把它们抽到分支外可提升代码的可读性
  • 使用"德摩根定律"可以让有多重否定的表达式变得更容易理解

4、代码可维护性技巧

  • 尽可能让三元表达式保持简单
  • 扁平优于嵌套:使用“提前返回”优化代码里的多层分支嵌套
  • 当条件表达式变得特别复杂时,可以尝试封装新的函数和方法来简化
  • and的优先级比or高,不要忘记使用括号来让逻辑更清晰
  • 在使用or运算符替代条件分支时,请注意避开因布尔值运算导致的陷阱(?)

5、代码组织技巧

  • bisect模块可以用来优化范围类分支判断
  • 字典类型可以用来替代简单的条件分支语句
  • 尝试总结条件分支代码里的规律,用更精简、更易扩展的方式改写它们
  • 使用any()all()内置函数可以让条件表达式变得更加精简

5 异常与错误处理

1、基础知识

  • 一个try语句支持多个except子句,但请记得把更精确的异常类放在前面
  • try语句的else分支会在没有异常时执行,因此它可用来替代标记变量
  • 不带任何参数的raise语句会重复抛出当前异常
  • 上下文管理器经常用来处理异常,它最常见的用途是替代finally子句
  • 上下文管理器可以用来忽略某段代码里的异常
  • 使用@contextmanager装饰器可以轻松定义上下文管理器

2、错误处理与参数校验

  • 当你可以选择编写条件判断或异常捕获时,优先选异常捕获
  • 不要让函数返回错误信息,直接抛出自定义异常吧
  • 手动校验数据合法性非常烦琐,尽量使用专业模块来做这件事
  • 不要使用assert来做参数校验,用raise来替代它(?)
  • 处理错误需要付出额外成本,假如能通过设计避免它就再好不过了
  • 在设计API时,需要慎重考虑是否真的有必要抛出错误
  • 使用“空对象模式”能免去一些针对边界情况的错误处理工作

3、当你捕获异常时

  • 过于模糊和宽泛的异常捕获可能会让程序免于崩溃,但也可能会带来更大的麻烦
  • 异常捕获贵在精确,只捕获可能抛出异常的语句,只捕获可能的异常类型
  • 有时候,让程序提早崩溃未必是什么坏事
  • 完全忽略异常时风险非常高的行为,大多数情况下,至少记录一条错误日志

4、当你抛出异常时

  • 保证模块内抛出的异常与模块自身的抽象级别一致
  • 如果异常的抽象级别过高,把它替换为更低级的新异常
  • 如果异常的抽象级别过低,把它包装成更高级的异常
  • 不要让调用方用字符串匹配来判断异常种类,尽量提供可区分的异常

6 循环与可迭代对象

1、迭代与迭代器原理

  • 使用iter()函数会尝试获取一个迭代器对象
  • 使用next()函数会获取迭代器的下一个内容
  • 可以将for循环简单地理解为while循环加不断调用next()
  • 自定义迭代器需要实现__iter____next__两个魔法方法
  • 生成器对象是迭代器的一种
  • iter(callable, sentinel)可以基于可调用对象构造一个迭代器(?)

2、迭代器与可迭代对象

  • 迭代器和可迭代对象是不同的概念
  • 可迭代对象不一定是迭代器,但迭代器一定是可迭代对象
  • 对可迭代对象使用giter()会返回迭代器,迭代器则会返回它自身
  • 每个迭代器的被迭代过程是一次性的,可迭代对象则不一定
  • 可迭代对象只需要实现__iter__方法,而迭代器还需要额外实现__next__方法

3、代码可维护性技巧

  • 通过定义生成器函数来修饰可迭代对象,可以优化循环内部代码
  • itertools模块里有许多函数可以用来修饰可迭代对象
  • 生成器函数可以用来解耦循环代码,提升可复用性
  • 不要使用多个break,拆分为函数然后直接return更好
  • 使用next()函数有时可以完成一些意想不到的功能

4、文件操作知识

  • 使用标准做法读取文件内容,在处理没有换行符的大文件时会很慢
  • 调用file.read()方法可以解决读取大文件的性能问题

7 函数

1、函数参数与返回相关基础知识

  • 不要使用可变类型作为参数默认值,用None来代替
  • 使用标记对象,可以严格区分函数调用时是否提供了某个参数
  • 定义仅限关键字参数,可以强制要求调用方提供参数名,提升可读性
  • 函数应该拥有稳定的返回类型,不要返回多类型
  • 使用返回None的情况——操作类函数、查询类函数表示意料之中的缺失值
  • 在执行失败时,相比返回None,抛出异常更为合适
  • 如果提前返回结果可以提升可读性,就提前返回,不必追求“单一出口”

2、代码可维护性技巧

  • 不要编写太长的函数,但长度没有标准,65行算是一个危险信号
  • 圈复杂度是评估函数复杂程度的常用指标,圈复杂度超过10的函数需要重构
  • 抽象与分层思想可以帮我们更好地构建与管理复杂的系统
  • 同一个函数内的代码应该处在同一抽象级别

3、函数与状态

  • 没有副作用的无状态纯函数易于理解,容易维护,但大多是时候“状态”不可避免
  • 避免使用全局变量给函数增加状态
  • 当函数状态较简单时,可以使用闭包技巧
  • 当函数需要较为复杂的状态管理时,建议定义类来管理状态

4、语言机制对函数的影响

  • functools.partial()可以用来快速构建偏函数
  • functools.lru_cache()可以用来给函数添加缓存
  • 比起mapfilter,列表推导式的可读性更强,更应该使用
  • lambda函数只是一种语法糖,你可以使用operator模块等方式来替代它
  • Python语言里的递归限制较多,可能的话,请尽量使用循环来替代

8 装饰器

1、基础与技巧

  • 装饰器最常见的实现方式,是利用闭包原理通过多层嵌套函数实现
  • 在实现装饰器时,请记得使用wraps()更新包装函数的元数据
  • wraps()不光有保留元数据,还能保留包装函数的额外属性
  • 利用仅限关键字参数,可以很方便地实现可选参数的装饰器

2、使用类来实现装饰器

  • 只要是可调用对象,都可以使用装饰器
  • 实现了__call__方法的类实例可调用
  • 基于类的装饰器分为两种:“函数替换”与“实例替换”
  • “函数替换”装饰器与普通装饰器没什么区别,只是嵌套层数更少
  • 通过类来实现“实例替换”装饰器,在管理状态和追加行为上有天然的优势
  • 混合使用类和函数来实现装饰器,可以灵活满足各种场景

3、使用wrapt模块

  • 使用wrapt模块可以方便地让装饰器同时兼容函数和类方法
  • 使用wrapt模块可以帮你写出结构更扁平的装饰器代码

4、装饰器设计技巧

  • 装饰器将包装调用提前到了函数被定义的位置,它的大部分优点也源于此
  • 在编写装饰器时,请考虑你的设计是否能够很好地发挥装饰器的优势
  • 在某些场景下,类装饰器可以替代元类,并且代码更简单
  • 装饰器和装饰器模式截然不同,不要弄混它们
  • 装饰器里应该只有一层浅浅的包装代码,要把核心逻辑放在其它函数与类中

9 面向对象编程

1、语言基础知识

  • 类与实例的数据,都保存在一个名为__dict__的字典属性中
  • 灵活利用__dict__属性,能帮你做到常规做法难以完成的一些事情
  • 使用@classmethod可以定义类方法,类方法常用作工厂方法
  • 使用@staticmethod可以定义静态方法,静态方法不依赖实例状态,是一种无状态方法
  • 使用@property可以定义动态属性对象,该属性对象的获取、设置和删除行为都支持自定义

2、面向对象高级特性

  • Python使用MRO算法来确定多重继承时的方法优先级
  • super()函数获取的并不是当前类的父类,而是当前MRO链条里的下一个类
  • Mixin是一种基于多重继承的有效编程模式,用好Mixin需要精心设计
  • 元类的功能相当强大,但同时也相当复杂,除非开发一些框架类工具,否则你极少需要使用元类
  • 通过定义__init_subclass__钩子方法,你可以在某个类被继承时执行自定义逻辑

3、鸭子类型与抽象类

  • “鸭子类型”是Python语言最为鲜明的特点之一,在该风格下,一般不做任何严格的类型检查
  • 虽然“鸭子类型”非常实用,但是它有两个明显的缺点——缺乏标准和过于隐式
  • 抽象类提供了一种更灵活的子类化机制,我们可以通过定义抽象类来改变isinstance()的行为
  • 通过@abstractmethod装饰器,你可以要求抽象类的子类必须实现某个方法

4、面向对象设计

  • 继承提供了相当强大的代码复用机制,但同时也带来了非常紧密的耦合关系
  • 错误使用继承容易导致代码失控
  • 对事物的行为而不是事物本身建模,更容易孵化出好的面向对象设计
  • 在创建继承关系时应当谨慎。用组合来替代继承有时是更好的做法

5、函数与面向对象的配合

  • Python里的面向对象不必特别纯粹,加入用函数打一点儿配合,你可以设计出更好的代码
  • 可以想requests模块一样,用函数为自己的面向对象模块实现一些更易用的API
  • 在Python中,我们极少会应用真正的“单例模式”,大多数情况下,一个简单的模块级全局对象就够了
  • 使用“预绑定方法模式”,你可以快速为普通实例包装出类似普通函数的API

6、代码编写细节

  • Python的成员私有协议并不严格,如果你想标示某个属性为私有,使用单下划线前缀就够了
  • 编写类时,类方法排序应该遵循某种特殊规则,把读者最关心的内容摆在最前面
  • 多态是面向对象编程里的基本概念,同时也是最想大的思维工具之一
  • 多态可能的介入时机:许多类似的条件分支判断、许多针对类型的isinstance()判断

10 面向对象设计原则(上)

1、SRP

  • 一个类只应该有一种被修改的可能
  • 编写更小的类通常更不容易违反SRP
  • SRP同样适用于函数,你可以让函数和类协同工作

2、OCP

  • 类应该对修改关闭,对扩展开放
  • 通过分析需求,找到代码中易变的部分,是让类符合OCP的关键
  • 使用子类继承的方式可以让类符合OCP
  • 通过算法类与依赖注入,也可以让类符合OCP
  • 将数据与逻辑分离,使用数据驱动的方式也是时间OCP的好办法

11 面向对象设计原则(下)

1、LSP

  • LSP认为子类应该可以任意替代父类使用
  • 子类不应该抛出符类不认识的异常
  • 子类方法应该返回与父类一致的类型,或者返回父类返回值的子类型对象
  • 子类的方法参数应该和父类方法完全一致,或者要求更为宽松(注意与上一点区别
  • 某些类可能会存在隐式合约,违反这些合约也会导致LSP

2、DIP

  • DIP认为高层模块和底层模块都应该依赖于抽象
  • 编写单元测试有一个原则:测试行为,而不是测试实现
  • 单元测试不宜使用太多mock,否则需要调整设计
  • 依赖抽象的好处是,修改底层模块实现不会影响高层代码
  • 在Python中,你可以用abc模块来定义抽象类
  • abc外,你也可以用Protocol等技术来完成依赖倒置

3、ISP

  • ISP认为客户依赖的接口不应该包含任何它不需要的方法
  • 设计接口就是设计抽象
  • 写更小的类、更小的接口在大多是情况下是个好主意

12 数据模型与描述符

1、字符串相关协议

  • 使用__str__方法,可以定义对象的字符串值(被str()触发)
  • 使用__repr__方法,可以定义对象爱对调试友好的详细字符串值(被repr()触发)
  • 如果对象只定义了__repr__方法,它同时会用于替代__str__
  • 使用__format__方法,可以在对象被用于字符串模板渲染时,提供多种字符串值(被.format()触发)

2、比较运算符重载

  • 通过重载与比较运算符有关的6个魔法方法,你可以让对象支持==>=等比较运算
  • 使用functools.total_ordering可以极大地减少重载比较运算符的工作量

3、描述符协议

  • 使用描述符协议,你可以轻松实现可复用的属性对象
  • 实现了__get____set____delete__其中任何一个方法的类都是描述符类
  • 要在描述符里保存实例级别的数据,你需要将其存放在instance.dict里,而不是直接放在描述符对象上
  • 使用__set_name__方法能让描述符对象知道自己被绑定了什么名字

4、数据类与自定义哈希运算

  • 要让自定义类支持集合运算,你需要实现__eq____hash__两个方法
  • 如果两个对象相等,它们的哈希值也必须相等,否则会破坏哈希表的正确性
  • 不同对象的哈希值可以一样,哈希冲突并不会破坏程序正确性,单会影响效率
  • 使用dataclasses模块,你可以快速创建一个支持哈希操作的数据类
  • 要让数据类支持哈希操作,你必须指定frozen=True参数将其声明为不可变类型
  • 一个对象的哈希值必须在它的声明周期里保持不变

5、其他建议

  • 虽然数据模型能帮我们写出更Pythonic的代码,单切勿过度推崇
  • __del__方法不是在执行del语句时被触发,而是在对象被作为垃圾回收时触发
  • 不要使用__del__来做任何“自动化”的资源回收工作

13 开发大型项目

一些项目开发工具介绍

  • flake8:包含pycodestyle模块(检查代码风格规范)和pyflakes模块(检查代码的正确性)
  • isort:格式化import语句
  • black:严格的代码风格工具,使用black {filename}命令整理代码
  • mypy:静态类型检查工具

单元测试工具:TDD(测试驱动开发)是一种行之有效的工作方式

  • unittest:标准库模块。

  • pytest:一个开源的第三方单元测试框架,更符合python风格。

    @pytest.mark.parametrize可以编写参数化测试。


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

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

相关文章

ROS学习笔记(三)---好用的终端Terminator

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序(简例) 一、Terminator是什么? 在前面的学习中,为了运行hello.py我是在vscode频繁的点击运行窗口的“”号…

视频集中存储EasyCVR视频汇聚平台定制项目增加AI智能算法

安防视频集中存储EasyCVR视频汇聚平台,可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

BGP知识总结

目录 EGP和IGP的协议追求 EGP的协议追求 IGP的协议追求 BGP的特点 BGP数据包 BGP的工作过程 1、配置完成后 2、邻居关系建立后 3、收敛完成 BGP路由黑洞问题 BGP的防环机制 1、EBGP水平分割——解决EBGP环路 2、IBGP水平分割——解决IBGP环路由中的一种机制 BGP的…

SpringBoot中的可扩展接口

目录 # 背景 # 可扩展的接口启动调用顺序图 # ApplicationContextInitializer # BeanDefinitionRegistryPostProcessor # BeanFactoryPostProcessor # InstantiationAwareBeanPostProcessor # SmartInstantiationAwareBeanPostProcessor # BeanFactoryAware # Applicati…

ubuntu篇---配置FTP服务,本机和docker安装

ubuntu篇---配置FTP服务 一、本机安装1.1 安装FTP服务器软件1.2 配置FTP服务 二、docker安装(我用的这个)2.1 创建 目录2.2 启动脚本2.3 访问2.4 如何创建一个新的用户2.5 测试2.6 使用 一、本机安装 1.1 安装FTP服务器软件 ubuntu安装vsftp sudo apt…

TiDB数据库从入门到精通系列之三:在单机上模拟部署生产环境集群

TiDB数据库从入门到精通系列之三:在单机上模拟部署生产环境集群 一、准备环境二、实施部署1.下载并安装 TiUP2.声明全局环境变量3.安装 TiUP 的 cluster 组件4.如果机器已经安装 TiUP cluster,需要更新软件版本5.由于模拟多机部署,需要通过 r…

注意力机制-基础

注意力机制-基础 基础部分比较简单,全是搬运,主要介绍几个例子。 主要是搬运来的:动手学深度学习 心理学 人类的注意力是有限的、有价值和稀缺的资源。而环境中的干扰注意力的信息却并不少。 比如人类的视觉神经系统大约每秒收到 位的信息…

Hlang社区-前端社区宣传首页实现

文章目录 前言页面结构固定钉头部轮播JS特效完整代码总结前言 这里的话,博主其实也是今年参与考研的大军之一,所以的话,是抽空去完成这个项目的,当然这个项目的肯定是可以在较短的时间内完成的。 那么废话不多说,昨天也是干到1点多,把这个首页写出来了。先看看看效果吧:…

STS(eclipse)批量修改文件里的某个内容

在STS或Eclipse的时候,有时候需要成批修改相应内容,如相关项目里的所有文件的demo修改成test,可以按照下面方式来做。 1、首先,在相应项目下搜索demo,如下图: 2、搜索出内容来,如下:…

Android Alarm闹钟API使用心得

前言 有什么办法可以在不打开App的时候,也能够触发一些操作呢?比如说发送通知,解决这个需求的办法有很多种选择,比如说官方推荐的WorkManager API,可以在后台执行一次性、耗时、定时的任务,但WorkManager是…

【Maven教程】(一)入门介绍篇:Maven基础概念与其他构建工具:理解构建过程与Maven的多重作用,以及与敏捷开发的关系 ~

Maven入门介绍篇 1️⃣ 基础概念1.1 构建1.2 maven对构建的支持1.3 Maven的其他作用 2️⃣ 其他构建工具2.1 IDE2.2 Make2.3 Ant2.4 Jenkins 3️⃣ Maven与敏捷开发🌾 总结 1️⃣ 基础概念 "Maven"可以翻译为 “知识的积累者” 或 “专家”。这个词源于波…

【第三阶段】kotlin语言空合并操作符

1.空操作符?: xxx?:“如果是null执行” 如果xxx是null,就执行?:后面的逻辑,如果不是null就执行?:前面的逻辑,后面的不在执行 fun main() {var name:String?"kotlin" namenullvar …

【数据结构OJ题】反转链表

原题链接:https://leetcode.cn/problems/reverse-linked-list/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 方法一:三指针翻转法 使用三个结构体指针n1,n2,n3,原地修改结点…

移动端直播相关技术总结

一、直播APP原理 二、直播APP架构 三、直播APP实现流程 四、流媒体开发 流媒体模块架构 流媒体相关基础知识 帧:每一帧代表一幅静止的图像 GOP:Group of Pictures,画面组,一个GOP就是一组连续的画面,很多帧的集合 码率…

腾讯Perfdog支持Windows PC端体验性能测试

一、背景 最近在做抖音的小玩法,其基于unity引擎,然后挂载到直播伴侣。以及Perfdog近期也支持了Windows的测试,所以做一个体验测试。 二、如何做 查看PC端的支持,目前是beat版本 选择或搜索自己需要的对应的程序,如…

Allegro172版本如何在联机模式下使用skill文件操作指导

Allegro172版本如何在Symphony模式下使用skill文件操作指导 在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图 这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件 如下图,当调用skill的时候就会出现…

Aspera替代方案:探索这些安全且可靠的文件传输工具

科技的发展日新月异,文件的传输方式也在不断地更新换代。传统的邮件附件、FTP等方式已经难以满足人们对于传输速度和安全性的需求了。近年来,一些新兴的文件传输工具受到了人们的关注,其中除了知名的Aspera之外,还有许多可靠安全的…

全志H616交叉编译,orangepi-zero2

文章目录 交叉编译是什么为什么需要交叉编译? 宿主机和目标机所需工具解压编译工具临时有效,配置环境变量(切换终端无效)永久有效,配置环境变量大功告成开始测试拷入文件测试结束 交叉编译是什么 交叉编译&#xff1a…

《Learning Combinatorial Optimization Algorithms over Graphs》阅读笔记

一.文章概述 本文提出将强化学习和图嵌入的组合以端到端地自动为图上组合优化问题设计贪心启发式算法,以避免设计传统算法所需要的大量专业知识和试错。学得的贪心策略行为类似增量构造解决方案的元算法,动作由解决方案当前状态上的图嵌入网络确定。作者…

『清安无别事-赠书01期』|〖测试设计思想〗

目录 🧡 内容简介 💛 作者简介 💖 本书内容|目录 💗 读后感想 💝 参与方式 购书传送门:测试设计思想购书传送门:测试设计思想购书传送门:测试设计思想 🧡 内容简介 …