自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(509)
  • 收藏
  • 关注

原创 Python 高手编程系列五百零六:槽

属性来为指定的类设置一个静态属性列表,并在类的每个实例中跳过__dict__字典的创建过程。不幸的是,这个问题不能用第 2 章“(4)保存内省的装饰器”一节介绍的方法(使用额外。Python 中的混入类是一种不应被初始化的类,而是用来向其他现有类提供某种可复用。虽然有这样的警告,但类装饰器仍然是对流行的混入(mixin)类模式的一种简单又轻。在类装饰器中这样使用闭包的主要缺点是,生成的对象不再是被装饰的类的实例,而是在。这种模式的框架之一。当然,上面的代码片段并不是很好的代码示例,因为其含义过于模糊。

2025-09-21 10:03:43 817

原创 Python 高手编程系列五百零五:property

基于上述原因,创建 property 的最佳语法是使用 property 作为装饰器。如果需要修改property的工作方式,推荐在派生类中覆写所有的property。property 的 setter 行为的话,通常意味着也需要修改 getter 的行为。property 提供了一个内置的描述符类型,它知道如何将一个属性链接到一组方法上。不幸的是,上面的代码有一些可维护性的问题。在大多数情况下,这是唯一的选择,因为如果修改了。是利用当前类的方法实时创建,不会使用派生类中覆写的方法。

2025-09-21 10:03:12 669

原创 Python 高手编程系列五百零四:现实例子 — 延迟求值属性

描述符的一个示例用法就是将类属性的初始化延迟到被实例访问时。如果这些属性的初始化依赖全局应用上下文的话,那么这一点可能有用。另一个使用场景是初始化的代价很大,但在导入类的时候不知道是否会用到这个属性。这样的描述符可以按照如下所示来实现:defdef’)else:’)下面是示例用法:m.lazily_m.lazilycached!

2025-09-21 10:02:35 621

原创 Python 高手编程系列五百零三:最佳实践

在 Python 2 中,没有指定任何祖先的类被认为是旧式类。(self, obj, value):在读取属性时将调用这一方法(被称为 getter)。幸运的是,多亏了 Python 描述符的工作方式。• super 的使用必须一致:在类的层次结构中,要么全部用 super,要么全不用。它是一个类,定义了另一个类的属性的访问方式。为了避免前面提到的所有问题,在 Python 在这个领域取得进展之前,我们需要考虑以。Python 提供这一特性是为了避免继承中的名称冲突,因为属性被重命名为以类名为前。

2025-09-21 10:02:04 517

原创 Python 高手编程系列五百零二:使用 super 易犯的错误

在下面来自 James Knight 网站(http://fuhm.net/super-harmful)的示例中,C 类使用。主要原因在于类的初始化。在 Python 中,基类不会在__init__()中被隐式地调用,所以。现在回到 super。如果使用了多重继承的层次结构,那么使用 super 是非常危险的,需要由开发人员来调用它们。()调用,但这又会导致第一种错误。混用 super 与显式类调用。

2025-09-21 10:01:34 263

原创 Python 高手编程系列五百零一:Python 2 中的旧式类与 super

Python 的方法解析顺序是基于 C3,这是为 Dylan 编程语言(http://opendylan.org)构建的。在早期版本的 Python 中,所有类并没有一个共同的祖先 object。这里 L[MyClass]是 MyClass 类的线性化,而 merge 是合并多个线性化结果的具体。在 Python 2 中,如果使用的是旧式类(不继承自 object),仍然存在这样的算法。例如,在(Base1,Python 所有的 2.x 版本中都保留了旧式类,目的是为了向后兼容,所以在这些版本中,如。

2025-09-21 10:01:04 457

原创 Python 高手编程系列五百:子类化内置类型

注意,零参数的 super()形式也可用于被 classmethod 装饰器装饰的方法。super 的简化形式(不传入任何参数)可以在方法内部使用,但 super 的使用并不。的速度更快,代码更整洁。最后,关于 super 还有很重要的一点需要注意,就是它的第二个参数是可选的。前面提到的使用实例很容易理解,但如果面对多重继承模式,super 将变得难以使用。当需要实现与某个内置类型具有相似行为的类时,最好的方法就是将这个内置类型子类化。类型的共同祖先,也是所有没有显式指定父类的用户自定义类的共同祖先。

2025-09-21 10:00:24 633

原创 Python 高手编程系列四百九十九:yield 语句

在社区中,生成器并不常用,因为开发人员还不习惯这种思考方式。send 的作用和 next 类似,但会将函数定义内部传入的值变成 yield 的返回值。Python 生成器的另一个重要特性,就是能够利用 next 函数与调用的代码进行交互。基于 yield 语句,生成器可以暂停函数并返回一个中间结果。这个函数返回一个 generator 对象,是特殊的迭代器,它知道如何保存执行上下文。它可以被无限次调用,每次都会生成序列的下一个元素。实际上,它看上去就像。成它的生成器每次提供一个值,并不需要无限大的内存。

2025-09-21 09:58:06 347

原创 Python 高手编程系列四百九十八:超越基础集合类型 — collections 模块

幸运的是,Python 标准库内置的 collections 模块提供了更多的选择。• defaultdict:字典子类,可以通过调用用户自定义的工厂函数来设置缺失值。• deque:双端队列,类似列表,是栈和队列的一般化,可以在两端快速添加或取出。法元素,我们会讲到这样的元素,它们不与任何特定的内置类型直接相关,而且在刚开始。迭代器本身是一个底层的特性和概念,在程序中可以不用它。• ChainMap:类似字典的类,用于创建多个映射的单一视图。• OrderedDict:字典子类,可以保存元素的添加顺序。

2025-09-21 09:57:14 319

原创 Python 高手编程系列四百九十七:使用进程池

来自 multiprocessing 模块的高级抽象,例如 Pool 类,与在 threading 模块中。multiprocessing 模块最好的一点是它提供了一个即用型的 Pool 类,可以处理管理。但这并不意味着你需要牺牲 multiprocessing 模块中的所有有用的抽象,只要你想。们再看看我们的之前的例子的 main()。的情况,这是一个很大的改进。与“使用线程池”中的描述的线程方式类似,构建一个进程池,这是在依赖多进程以。这可以减少代码中的样板代码数量,并且还可以创建更多可插入的接口。

2025-09-21 09:56:15 246

原创 Python 高手编程系列四百九十六:多进程

• 使用 multiprocessing.Queue 类,它是早先用于线程之间通信的 queue.Queue。另一种在进程之间共享状态的方法是在 multiprocessing.sharedctypes 中提供的。• 使用 multiprocessing.sharedctypes 模块,通过它可以在进程之间共享的。不幸的是,os.fork 在 Windows 下不可用,需要生成一个新的解释器以模仿 fork。称,multiprocessing 模块也暴露了类似的线程接口,所以你可能想要使用相同的接口。

2025-09-21 09:55:24 821

原创 Python 高手编程系列四百九十五:处理错误与速率限制

在处理这些问题时,你可能会遇到的最后一个问题是外部服务提供商施加的速率限制。以使用 Google Maps API 为例,在撰写本书时,免费和未经身份验证的请求的官方费率限制为每秒 10 个请求和每天 2,500 个请求。当使用多线程时,很容易耗尽这样的限制。更严重的问题是,因为我们没有覆盖任何故障的场景,而处理多线程 Python 代码中的异常比平常更复杂。当客户端超过 Google 的速率时,api.geocode()函数将抛出异常,这是个好消息。

2025-09-21 09:52:11 841

原创 Python 高手编程系列四百九十四:使用线程池

是用于与工作线程通信的很好的选择,它来自内置的 queue 模块。何性能改进,但实际上,我们还减少由于缓慢的 print()执行的线程串行化的风险。这里是一个修改版本的 main()函数,它只启动有限数量的工作线程,并使用。建一个严格定义大小的工作线程池,它将处理所有的并行工作,并通过一些线程安全的数。所以通常的想法是启动一些预定义数量的线程,它将从队列中消费工作项,直到完成。我们尝试解决的第一个问题是程序运行中未绑定限制的线程。我们现在能够解决的另一个问题是在线程中输出的潜在的有问题的打印。

2025-09-21 09:51:40 444

原创 Python 高手编程系列四百九十三:何时应该使用多线程

受欢迎的 Python WSGI 兼容的网络服务器:Gunicorn(参考 http://gunicorn.org/)和 uWSGI(参考 https://uwsgi-docs.readthedocs.org),它们使用工作线程处理 HTTP 请求,这些工作线。进程,例如使用 subprocess 模块中的 run()函数,实际上这是在多个进程中进行工作,幸运的是,许多兼容 WSGI 的 Web 服务器允许这样的设置。如果在多线程中毫无顾忌的使用它,中可能会导致串行化,这将撤消多线程的所有好处。

2025-09-21 09:51:04 484

原创 Python 高手编程系列四百九十二:为什么需要并发

通过推断程序、算法或问题中的事件,我们可以说,如果它们可以被完全或部分分解为顺序无关的组件(单位),则这些事件是并发的。是完全正确的,但是它们不和 C 或 Java 一样解决同样多的问题。在 Python 中,多核 CPU 的多线程的性能优势有一些限制,我们稍后将讨。冒险(race hazard),这里可能发生意外的结果,因为每个线程运行的代码对数据的状态做。中多线程的局限性,以及使用 Python 线程作为可行解决方案时的一些常见并发问题。并发不是应用程序实现的问题,而只是程序,算法或问题的属性。

2025-09-21 09:50:11 331

原创 Python 高手编程系列四百九十一:非确定性缓存

非确定性函数的缓存比记忆化更复杂。事实上,由于这样的函数的每次执行可能给出不同的结果,通常无法使用先前的很长时间的值。你需要做的是判断一个缓存的值的有效时间。在定义的时间段过去之后,所存储的结果被认为是陈旧的,并且高速缓存需要通过新值来刷新。非确定性函数的缓存通常依赖于某些外部状态,这些状态在应用程序代码中很难跟踪。典型的示例组件如下。• 关系型数据库以及常用的任何类型的结构化数据存储引擎。• 通过网络连接(Web API)访问的第三方服务。• 文件系统。

2025-09-10 20:01:18 392

原创 Python 高手编程系列四百九十:使用概率型数据结构

换句话说,对于同一组参数,确定性函数总是返回相同的结果,而非确定性函数可能返回随时间变化的结果。情况下,我们可以从视觉上推断出在不改变 fibonacci()函数的核心的情况下,我们将。缓存的另一个重要的使用案例是保存通过 Web 服务获得的第三方 API 的结果。正如我们所看到的,fibonacci()是一个递归函数,如果输入值大于 2,则调用自身。值的存储和取回的平均复杂度为 O(1),因此这大大降低了被记忆函数的总体复杂性。我们使用 memoize()装饰器的闭包的字典作为缓存值的简单存储。

2025-09-10 20:00:32 279

原创 Python 高手编程系列四百八十九:使用任务队列和延迟处理

如果你需要更简单的东西,那么 RQ(参见 http://pythonrq.org/)可能是一个很好的选择。的任务队列框架,支持多个消息服务器,也允许计划执行任务(它可以替代您的 cron 作业)。你不能简单地跳过你正在等待的答复的时间。在这种情况下,增加的响应时间可能不一定是由你的实现导致。间的主要贡献者,并且你没有其他更快的解决方案可以使用,当然,你无法进一步的加快。作时,只需将其添加到处理它的工作队列中,并立即响应接受请求的用户即可。幸运的是,已经有一些流行的工具可以用于构建分布式任务队列。

2025-09-10 20:00:01 404

原创 Python 高手编程系列四百八十八:namedtuple

它们的高级版本,称为元启发式(metaheuristics),提供解决数学优化问题的策略,这些问。然而,你可以从具有 O(1)平均复杂度的 get/set 操作的字典中获得相同的好处。优化的,以确保良好的性能与集合大小无关,但所提到的 O(1)复杂度实际上只是平均复杂性。实际上,namedtuple 是基于元组的,这可能也有益于它的性能。在这种情况下,namedtuple 是一个很好的类型,它结合了字典和元组的优点。例如,有已知良好的启发式和近似问题可以在合理的时间内解决非常大的 TSP 问题。

2025-09-10 19:59:31 258

原创 Python 高手编程系列四百八十七:使用集合模块

dict.setdefault 方法包括两个步骤(键查找和键设置),它们都具有 O(1)的复杂度,我们已经在第 2 章中的字典部分中了解过。当然,在 Python 中,由于列表类型中内部数组的过度分配,不是每个 list.append()由于有效的 append()和 pop()方法,从序列的两端以相同的速度工作,deque 是一。如果你需要执行大量的弹出、追加和插入,替代列表的 deque 可以提供实质性的性。collections 模块提供了高性能的容器类型,它可以替换内置的容器类型。

2025-09-10 19:58:57 292

原创 Python 高手编程系列四百八十六:简化

复杂度是通过使用 in 操作符在 result 列表中的查找引入,该操作的时间复杂度是 O(n)。表不是正确的顺序,那么对它进行排序,这是一个至少有 O(nlogn)复杂度的任务。由于 Python 中的 list 类型的实现细节,在列表中搜索特定的值并不是一个廉价的操。此外,如果你的列表已经是有序的,则可以使用 bisect 将新元素插入到该列表中,中的函数主要设计用于插入或查找给定值的插入索引,并且会保留有序序列的顺序。素的索引查找,这种线性复杂度不是特别糟糕,但如果需要许多这样的操作,它可能具有。

2025-09-10 19:58:19 273

原创 Python 高手编程系列四百八十五:大 O 记法

但是通过求解一个简单的 100n2>5n3 不等式,我们可以发现,当 n 小于 20 时,程序 B。但最坏的情况是 O(n),例如,在第 2 章中已经讲过,在字典中查找的平均复杂度为 O(1)。常大的输入时,程序 A 当然是更好的选择,因为它的行为更好的渐近。少个元素,它被认为是常数,而在特定元素个数的列表中进行查找的时间复杂度是 O(n)。例如,看一个这样的操作,将一个元素追加到 Python 的列表类型的实例。为了获取算法的性能与输入数据的大小相关的概述,手动计算它的大 O 记法是最佳的。

2025-09-10 19:57:56 322

原创 Python 高手编程系列四百八十四:降低复杂度

一些复杂度指标可以提供代码行为的客观信息,并且sqc 这样的信息有时可以用来推测性能的预期。在 Python 中,测量 McCabe 的复杂度是相对简单的,因为它可以从它的抽象语法树中推。试使用不同的分析策略或工具,或从不同的角度(内存、I/O 操作或网络吞吐量)查看它。执行时间或资源消耗没有实质性的影响,分析并优化这些小组件,需要花费大量的时间,如果你的应用程序似乎没有真正的瓶颈,有可能是你错过了一些东西。码分析,代码分析在查找性能瓶颈的时很有必要。它是一个源代码的指标,因此可以使用适当的工具进行测量。

2025-09-10 19:56:17 373

原创 Python 高手编程系列四百八十三:分析网络使用情况

正如我前面所说,与第三方程序(如数据库、缓存、Web 服务或 LDAP 服务器)通信的应用程序可能会在这些应用程序运行缓慢时放慢速度。在应用程序端使用常规代码分析方法可以进行跟踪。但是,如果第三方软件自己工作正常,那么罪魁祸首可能是网络。问题可能是配置错误的集线器,低带宽网络链路,或甚至是大量的使计算机多次发送相同的数据包的流量冲突。这里有几个元素,你应该收集一下。要了解发生了什么,首先要研究以下 3 个领域:• 使用以下工具观察网络流量。

2025-09-10 19:55:46 247

原创 Python 高手编程系列四百八十二:分析内存使用

• Pympler(http://pythonhosted.org/Pympler/):该库声明支持 Python 2.5,2.6,2.7,3.1,3.2,3.3。objgraph(参考 http://mg.pov.lt/objgraph/)是一个简单的工具,用于创建对象引用的。不幸的是,在使用 Python/C API 的 C 扩展中,引用计数的管理必须使用 Py_INCREF()尽管相当吓人,看似复杂,Python 中的内存管理有着非常好的文档(参考 https://docs.

2025-09-10 19:55:09 304

原创 Python 高手编程系列四百八十一:微观分析

这在应用程序上下文之外非常有用,在命令提示符中,例如,在现有应用程序中使用不是很方便。种用法设计的一些较小的 CPython 微优化,它最终会导致二次的运行时间。这种方法当然不是理想的并且 100%准确的,但是它至少比以硬编码的执行时间断言更好,timeit 提供一种简单的方法来测量小代码片段的执行时间,它使用主机系统提供的。优化时,他们将能够在测试中设置其最大执行时间,并确保它不会被进一步的更改所破坏。短代码,但它也会让你很容易犯下危险的错误,这将导致令人困惑的结论。由此,函数所花费的时间可以转换为。

2025-09-10 19:54:36 346

原创 Python 高手编程系列四百八十:扩展硬件

用 pip 下载这个简单的脚本,只要 Graphviz(参见 http://www.graphviz.org/)安装在你的。的输出,而且可以从多个其他分析文件中(如 Linux perf,xperf,gprof,Java HPROF 等)• cProfile:这是一个 C 实现,提供与 profile 工具相同的接口,但具有较少的开销。要以某种方式扩展分析器,那么 profile 可能会是一个更好的选择,因为它不使用 C 扩展。此外,高效的硬件是非常昂贵的(收益递减规律),因此这种方法也存在经济上的限。

2025-09-10 19:54:05 243

原创 Python 高手编程系列四百七十九:首先要能工作

只要你坚持使用 Python 化的语法,这些语法在第 2 章和第 3 章中提到过,你的代码应该是。即使 Python 试图使常见的代码模式是最快的,优化工作可能也会混淆你的代码,使代。当你达到了 90%的优化目标,剩下的 10%将使你的代码完全不可读,那么你最好停止。此外,如果有一个很好的库可以满足你的需求,你就没必要重新。设计文档应提供所有交互和每个连接的性质的设计图,从中可以获得系统的整体架构,这是没有意义的,因为真正的。应用程序通常由非常复杂的交互组成,并且,在真正使用它之前,我们不可能全面的。

2025-09-10 19:53:31 412

原创 Python 高手编程系列四百七十八:文档驱动开发

说,这个 doctest 也是一个很好的文档,所以,应该发自内心地改变对 doctest 的用法。稍后,doctest 将演变以考虑新的元素或所需的变化。所以,doctests 和常规测试之间的平衡是一个饱受争议的问题,这取决于由团队,可读的和可用的,所以,它们可以是包文档的一部分,而那些不可读的,只是用于构建并。由于我们已经知道如何构建、打包和测试软件,在接下来的两章中,我们将关注如何。本章是关于优化的,并且提供一套一般原则和分析技术。“我们应该忘记小的效能,大约 97%的情况:过早优化是万恶之源。

2025-09-10 19:53:01 279

原创 Python 高手编程系列四百七十七:测试环境与依赖兼容性

环境隔离的重要性在本书中已经提到很多次了。通过在应用程序级(虚拟环境)和系统级(系统虚拟化)上隔离执行环境,你可以确保测试可以在可重复的条件下运行。这样,你可以避免受因破坏依赖关系导致的罕见且模糊的问题。正确隔离测试环境的最佳方法是使用支持系统虚拟化的持续集成系统。对于开源项目有很好的免费解决方案,如 Travis CI(Linux 和 OS X)或 AppVeyor(Windows),但是如果你需要这样的东西来测试私有的软件,很可能你需要花一些时间,在一些现有的开源 CI。

2025-09-10 19:52:18 830

原创 Python 高手编程系列四百七十六:测试覆盖率

py.test 中的典型解决方案要容易得多。在我们的例子中,我们使用了 py.test 框架中的 monkey-patching 实用程序,但。在上面的代码中,我们使用了一个新的 pytest.yield_fixture()装饰器。Python 中有很多模拟库,但最常见的是 unittest.mock,标准库中也提供了该库。例中,我们手动执行了一切,并提供了一个自定义的 patch_smtplib()固件函数,具有。创建之初,它是一个第三方包,并不是 Python 分发版的一部分,但很快就作为临时包加入。

2025-09-06 10:27:17 707

原创 Python 高手编程系列四百七十五:我做测试

OK常规的 TestCase 类和 doctests 也会被执行。最后,nose 提供了类似于 TestCase 方法的断言函数(assertion functions)。这些函数遵循 PEP 8 命名约定,而不是使用 Java 单元测试中的约定(参考 http://nose.readthedocs.org/)。编写测试固件nose 支持 3 个级别的测试固件。● 包级别:可以把 setup 和 teardown 函数添加到__init__.py 模块中,这是一。

2025-09-06 10:25:46 821

原创 Python 高手编程系列四百七十四:达式 Python 标准测试工具

name。

2025-09-06 10:25:00 929

原创 Python 高手编程系列四百七十三:什么样的测试

它们测试代码的绝大部分,并专注于许多应用程序层或者组件相互交互的情况。集成测试的形式和范围因项目的。好的并且流行的方法是至少测试基本指标(静态代码分析和代码风格违例),不允许将任何拉低指标的代码合并到主干。单元测试(unit tests)是完全适合测试驱动开发的底层测试。流行的测试 Web 应用程序的方式,其中负载被理解为来自真实用户或程序化客户端的 Web。这些测试不是通过 TDD 完成的,而是由项目经理、QA 工作人员甚至客户构建的。件真的做了它应该做的,使用与用户相同的媒体并控制输出。

2025-09-06 10:24:24 236

原创 Python 高手编程系列四百七十二:文档构建与持续集成

会让你的开发更加轻松。它是一个免费的服务,用于托管使用 Sphinx 的开源 Python 项目的文档。托管使用 Sphinx 构建的文档的最佳方式是生成 HTML 构建,并将其作为你选择的 Web。记住,大多数的 bug 与错误的语法使用无关,而是与逻辑错误和细微的误解有关,它们可。你无法可靠地区别软件中一直存在的 bug 之间的区别,有的是新引入的,有的部分在前一。从消费者的角度看,Sphinx 真的提高了文档的可读性和用户体验。这体现为一些功能和特性在以前版本的软件中正常工作,而在项目开发中的某。

2025-09-06 10:22:49 806

原创 Python 高手编程系列四百七十一:构建自己的文档集

请记住:mod:以及前面的元素是由 Sphinx 在 reSTructuredText 中引入的具体指令。这将会在索引页中添加两个新条目,即 Database Access 和 Session。最后,Sphinx 提供了一个行内标记来设置交叉引用。这里,:mod:是模块标记的前缀,是要链接到的模块的名称(如先前注册。

2025-09-06 10:22:15 561

原创 Python 高手编程系列四百七十:链接

用 Python 做事情(参考 http://code.activestate.com/recipes/langs/python/)。docs.djangoproject.com/en/1.9/intro/tutorial01/)解释如何使用 Django 构建应用程序。模块的 docstring 的目的是可以在模块的顶部写入文本。一个技巧(recipe)文档解答一个非常具体的问题,并提供一个解决方案来解决问题。这是框架应用程序中的文档的。● 教程:这是一个逐步的文档,说明如何使用软件的功能。

2025-09-06 10:21:50 595

原创 Python 高手编程系列四百六十九:章节结构

reST 提供了易读的自动枚举特性的列表语法(运行结果参见图 9-2),主要有:无序列。如果不想保留单个冒号,可以在前面的文本和::之间插入一个空格。请注意,冒号字符可以放在文本行中。在这种情况下,它将被渲染为单个冒号。表,枚举列表和自定义列表。将被解释并且完全删除。

2025-09-06 10:20:38 316

原创 Python 高手编程系列四百六十八:使用现实中的代码示例

Foo 和 bar 是坏成员。当读者试图通过一个使用示例来理解一段代码如何运行时,不切实际的示例会让代码难以理解。为什么不使用现实中的例子?通常的做法是确保每个代码示例都可以剪切并粘贴到一个真正的程序中。

2025-09-06 10:19:37 581

原创 Python 高手编程系列四百六十七:7 项技术写作规则

这并不总是很明显,因为一个技术文本解释了一个软件如何工作,并且通常为每个可能获取和使用代码的人而写。● 如果你不是一个真正优秀的作家,不要在文本中讲笑话。在技术文本中滑稽是很难的,很少有作家掌握它。Atomisator 是一个产品,它提取 RSS 源并将其保存在数据库中,并带有筛选功能。每个开发人员都能够输出这样的材料,本节提供了 7 个规则,可以应用在所有情况下。开发者开始写一个持续的流,当他或她犯语法错误,或任何东西,只。一个好的做法是当他们出现时将它们写在第二张纸或屏幕上,这样它们就不会丢。

2025-09-06 10:19:06 333

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除