iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python设计方法有哪些
  • 209
分享到

Python设计方法有哪些

2023-06-02 02:06:01 209人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python设计方法有哪些”,在日常操作中,相信很多人在Python设计方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python设计方法有哪些”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“python设计方法有哪些”,在日常操作中,相信很多人在Python设计方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python设计方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为什么 CPython 不使用更传统的垃圾回收方案?

首先,这不是 C 标准特性,因此不能移植。(是的,我们知道 Boehm GC 库。它包含了 大多数 常见平台(但不是所有平台)的汇编代码,尽管它基本上是透明的,但也不是完全透明的; 要让 Python 使用它,需要使用补丁。)

当 Python 嵌入到其他应用程序中时,传统的 GC 也成为一个问题。在独立的 Python 中,可以用 GC 库提供的版本替换标准的 malloc()和 free(),嵌入 Python 的应用程序可能希望用 它自己 替代 malloc()和 free(),而可能不需要 Python 的。现在,CPython 可以正确地实现 malloc()和 free()。

CPython 退出时为什么不释放所有内存?

当 Python 退出时,从全局命名空间或 Python 模块引用的对象并不总是被释放。如果存在循环引用,则可能发生这种情况 C 库分配的某些内存也是不可能释放的(例如像 Purify 这样的工具会抱怨这些内容)。但是,Python 在退出时清理内存并尝试销毁每个对象。

如果要强制 Python 在释放时删除某些内容,请使用 atexit 模块运行一个函数,强制删除这些内容。

为什么有单独的元组和列表数据类型?

虽然列表和元组在许多方面是相似的,但它们的使用方式通常是完全不同的。可以认为元组类似于 Pascal 记录或 C 结构;它们是相关数据的小集合,可以是不同类型的数据,可以作为一个组进行操作。例如,笛卡尔坐标适当地表示为两个或三个数字的元组。

另一方面,列表更像其他语言中的数组。它们倾向于持有不同数量的对象,所有对象都具有相同的类型,并且逐个操作。例如, os.listdir('.') 返回表示当前目录中的文件的字符串列表。如果向目录中添加了一两个文件,对此输出进行操作的函数通常不会中断。

元组是不可变的,这意味着一旦创建了元组,就不能用新值替换它的任何元素。列表是可变的,这意味着您始终可以更改列表的元素。只有不变元素可以用作字典的 key,因此只能将元组和非列表用作 key。

列表如何在 CPython 中实现?

CPython 的列表实际上是可变长度的数组,而不是 lisp 风格的链表。该实现使用对其他对象的引用的连续数组,并在列表头结构中保留指向该数组和数组长度的指针。

这使得索引列表 a[i] 的操作成本与列表的大小或索引的值无关。

当添加或插入项时,将调整引用数组的大小。并采用了一些巧妙的方法来提高重复添加项的性能; 当数组必须增长时,会分配一些额外的空间,以便在接下来的几次中不需要实际调整大小。

字典如何在 CPython 中实现?

CPython 的字典实现为可调整大小的哈希表。与 B-树相比,这在大多数情况下为查找(目前最常见的操作)提供了更好的性能,并且实现更简单。

字典的工作方式是使用 hash() 内置函数计算字典中存储的每个键的 hash 代码。hash 代码根据键和每个进程的种子而变化很大;例如,"Python" 的 hash 值为-539294296,而"python"(一个按位不同的字符串)的 hash 值为 1142331976。然后,hash 代码用于计算内部数组中将存储该值的位置。假设您存储的键都具有不同的 hash 值,这意味着字典需要恒定的时间 -- O(1),用 Big-O 表示法 -- 来检索一个键。

为什么字典 key 必须是不可变的?

字典的哈希表实现使用从键值计算的哈希值来查找键。如果键是可变对象,则其值可能会发生变化,因此其哈希值也会发生变化。但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典中修改条目。然后,当你尝试在字典中查找相同的对象时,将无法找到它,因为其哈希值不同。如果你尝试查找旧值,也不会找到它,因为在该哈希表中找到的对象的值会有所不同。

如果你想要一个用列表索引的字典,只需先将列表转换为元组;用函数 tuple(L)创建一个元组,其条目与列表 L相同。元组是不可变的,因此可以用作字典键。

已经提出的一些不可接受的解决方案:

  • 哈希按其地址(对象 ID)列出。这不起作用,因为如果你构造一个具有相同值的新列表,它将无法找到;例如:

mydict = {[1, 2]: '12'}print(mydict[[1, 2]])
  • 会引发一个 KeyError 异常,因为第二行中使用的 [1, 2] 的 id 与第一行中的 id 不同。换句话说,应该使用 == 来比较字典键,而不是使用is 。

  • 使用列表作为键时进行复制。这没有用的,因为作为可变对象的列表可以包含对自身的引用,然后复制代码将进入无限循环。

  • 允许列表作为键,但告诉用户不要修改它们。当你意外忘记或修改列表时,这将产生程序中的一类难以跟踪的错误。它还使一个重要的字典不变量无效:d.keys() 中的每个值都可用作字典的键。

  • 将列表用作字典键后,应标记为其只读。问题是,它不仅仅是可以改变其值的顶级对象;你可以使用包含列表作为键的元组。将任何内容作为键关联到字典中都需要将从那里可到达的所有对象标记为只读 —— 并且自引用对象可能会导致无限循环。

如果需要,可以使用以下方法来解决这个问题,但使用它需要你自担风险:你可以将一个可变结构包装在一个类实例中,该实例同时具有 __eq__() 和 __hash__() 方法。然后,你必须确保驻留在字典(或其他基于 hash 的结构)中的所有此类包装器对象的哈希值在对象位于字典(或其他结构)中时保持固定。

class ListWrapper: def __init__(self, the_list): self.the_list = the_list def __eq__(self, other): return self.the_list == other.the_list def __hash__(self): l = self.the_list result = 98767 - len(l)*555 for i, el in enumerate(l): try: result = result + (hash(el) % 9999999) * 1001 + i except Exception: result = (result % 7777777) + i * 333 return result

注意,哈希计算由于列表的某些成员可能不可用以及算术溢出的可能性而变得复杂。

此外,必须始终如此,如果 o1 == o2 (即 o1.__eq__(o2) is True )则 hash(o1) == hash(o2)``(即``o1.__hash__() == o2.__hash__() ),无论对象是否在字典中。如果你不能满足这些限制,字典和其他基于 hash 的结构将会出错。

对于 ListWrapper ,只要包装器对象在字典中,包装列表就不能更改以避免异常。除非你准备好认真考虑需求以及不正确地满足这些需求的后果,否则不要这样做。请留意。

为什么 list.sort() 没有返回排序列表?

在性能很重要的情况下,仅仅为了排序而复制一份列表将是一种浪费。因此, list.sort() 对列表进行了适当的排序。为了提醒您这一事实,它不会返回已排序的列表。这样,当您需要排序的副本,但也需要保留未排序的版本时,就不会意外地覆盖列表。

如果要返回新列表,请使用内置 sorted() 函数。此函数从提供的可迭代列表中创建新列表,对其进行排序并返回。例如,下面是如何迭代遍历字典并按 keys 排序:

for key in sorted(mydict): ... # do whatever with mydict[key]...

如何在 Python 中指定和实施接口规范?

c++和 Java 等语言提供的模块接口规范描述了模块的方法和函数的原型。许多人认为接口规范的编译时强制执行有助于构建大型程序。

Python 2.6 添加了一个 abc 模块,允许定义抽象基类 (ABCs)。然后可以使用isinstance() 和 issubclass() 来检查实例或类是否实现了特定的 ABC。collections.abc 模块定义了一组有用的 ABCs 例如 Iterable , Container , 和 MutableMapping

对于 Python,通过对组件进行适当的测试规程,可以获得接口规范的许多好处。还有一个工具 PyChecker,可用于查找由于子类化引起的问题。

一个好的模块测试套件既可以提供回归测试,也可以作为模块接口规范和一组示例。许多 Python 模块可以作为脚本运行,以提供简单的“自我测试”。即使是使用复杂外部接口的模块,也常常可以使用外部接口的简单“桩代码(stub)”模拟进行隔离测试。可以使用 doctest 和 unittest 模块或第三方测试框架来构造详尽的测试套件,以运行模块中的每一行代码。

适当的测试规程可以帮助在 Python 中构建大型的、复杂的应用程序以及接口规范。事实上,它可能会更好,因为接口规范不能测试程序的某些属性。例如,append() 方法将向一些内部列表的末尾添加新元素;接口规范不能测试您的 append() 实现是否能够正确执行此操作,但是在测试套件中检查这个属性是很简单的。

编写测试套件非常有用,您可能希望设计代码时着眼于使其易于测试。一种日益流行的技术是面向测试的开发,它要求在编写任何实际代码之前,首先编写测试套件的各个部分。当然,Python 允许您草率行事,根本不编写测试用例。

为什么没有 Goto?

可以使用异常捕获来提供 “goto 结构” ,甚至可以跨函数调用工作的 。许多人认为异常捕获可以方便地模拟 C,Fortran 和其他语言的 "go" 或 "goto" 结构的所有合理用法。例如:

class label(Exception): pass # declare a labeltry: ... if condition: raise label() # goto label ...except label: # where to goto pass...

但是不允许你跳到循环的中间,这通常被认为是滥用 goto。谨慎使用。

为什么原始字符串(r-strings)不能以反斜杠结尾?

更准确地说,它们不能以奇数个反斜杠结束:结尾处的不成对反斜杠会转义结束引号字符,留下未结束的字符串。

原始字符串的设计是为了方便想要执行自己的反斜杠转义处理的处理器(主要是正则表达式引擎)创建输入。此类处理器将不匹配的尾随反斜杠视为错误,因此原始字符串不允许这样做。反过来,允许通过使用引号字符转义反斜杠转义字符串。当 r-string 用于它们的预期目的时,这些规则工作的很好。

如果您正在尝试构建 windows 路径名,请注意所有 Windows 系统调用都使用正斜杠:

f = open("/mydir/file.txt") # works fine!

如果您正在尝试为 DOS 命令构建路径名,请尝试以下示例

dir = r"\this\is\my\dos\dir" "\\"dir = r"\this\is\my\dos\dir\ "[:-1]dir = "\\this\\is\\my\\dos\\dir\\"

为什么 Python 没有属性赋值的“with”语句?

Python 有一个 'with' 语句,它封装了块的执行,在块的入口和出口调用代码。有些语言的结构是这样的:

with obj: a = 1 # equivalent to obj.a = 1 total = total + 1 # obj.total = obj.total + 1

在 Python 中,这样的结构是不明确的。

其他语言,如 ObjectPascal、Delphi 和 C++ 使用静态类型,因此可以毫不含糊地知道分配给什么成员。这是静态类型的要点 -- 编译器 总是 在编译时知道每个变量的作用域。

Python 使用动态类型。事先不可能知道在运行时引用哪个属性。可以动态地在对象中添加或删除成员属性。这使得无法通过简单的阅读就知道引用的是什么属性:局部属性、全局属性还是成员属性?

例如,采用以下不完整的代码段:

def foo(a): with a: print(x)

该代码段假设 "a" 必须有一个名为 "x" 的成员属性。然而,Python 中并没有告诉解释器这一点。假设 "a" 是整数,会发生什么?如果有一个名为 "x" 的全局变量,它是否会在 with 块中使用?如您所见,Python 的动态特性使得这样的选择更加困难。

然而,Python 可以通过赋值轻松实现 "with" 和类似语言特性(减少代码量)的主要好处。代替:

function(args).mydict[index][index].a = 21function(args).mydict[index][index].b = 42function(args).mydict[index][index].c = 63

写成这样:

ref = function(args).mydict[index][index]ref.a = 21ref.b = 42ref.c = 63

这也具有提高执行速度的副作用,因为 Python 在运行时解析名称绑定,而第二个版本只需要执行一次解析。

为什么 if/while/def/class 语句需要冒号?

冒号主要用于增强可读性(ABC 语言实验的结果之一)。考虑一下这个:

if a == b print(a)

if a == b: print(a)

注意第二种方法稍微容易一些。请进一步注意,在这个 FAQ 解答的示例中,冒号是如何设置的;这是英语中的标准用法。

另一个次要原因是冒号使带有语法突出显示的编辑器更容易工作;他们可以寻找冒号来决定何时需要增加缩进,而不必对程序文本进行更精细的解析。

为什么 Python 在列表和元组的末尾允许使用逗号?

Python 允许您在列表,元组和字典的末尾添加一个尾随逗号:

[1, 2, 3,]('a', 'b', 'c',)d = { "A": [1, 5], "B": [6, 7], # last trailing comma is optional but good style}

有几个理由允许这样做。

如果列表,元组或字典的字面值分布在多行中,则更容易添加更多元素,因为不必记住在上一行中添加逗号。这些行也可以重新排序,而不会产生语法错误。

不小心省略逗号会导致难以诊断的错误。例如:

x = [ "fee", "fie" "foo", "fum"]

这个列表看起来有四个元素,但实际上包含三个 : "fee", "fiefoo" 和 "fum" 。总是加上逗号可以避免这个错误的来源。

允许尾随逗号也可以使编程代码更容易生成。

到此,关于“Python设计方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Python设计方法有哪些

本文链接: https://www.lsjlt.com/news/228510.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python设计方法有哪些
    这篇文章主要介绍“Python设计方法有哪些”,在日常操作中,相信很多人在Python设计方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python设计方法有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-02
  • 数据库设计的方法有哪些
    这篇文章主要讲解了“数据库设计的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库设计的方法有哪些”吧!数据库设计技巧: 第2 部分—...
    99+
    2024-04-02
  • C#组件设计的方法有哪些
    本篇内容主要讲解“C#组件设计的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#组件设计的方法有哪些”吧!在C#中为类预定义属性是件再简单不过的事,见程序1。程序1using&nbs...
    99+
    2023-06-17
  • 数据库的设计方法有哪些
    本篇内容介绍了“数据库的设计方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Python词频统计的方法有哪些
    这篇文章将为大家详细讲解有关Python词频统计的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。统计文件里每个单词的个数思路:分别统计文档中的单词,与出现的次数用两个列表将其保存起来,最后再用z...
    99+
    2023-06-21
  • Python统计词频的方法有哪些
    本文小编为大家详细介绍“Python统计词频的方法有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python统计词频的方法有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方法一:运用集合去重方法&nb...
    99+
    2023-07-05
  • 天津网站设计的方法有哪些
    1. 用户体验设计(UX设计):以用户为中心,通过调研、分析用户需求、行为模式等,设计出符合用户习惯、易于使用、能够满足用户需求的网...
    99+
    2023-06-14
    天津网站设计
  • python中有哪些统计mock的方法
    python中有哪些统计mock的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、说明called:表示是否调用过。call_count:返回调用的次数。call_arg...
    99+
    2023-06-15
  • 设计模式速记的方法有哪些
    这篇文章主要讲解了“设计模式速记的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“设计模式速记的方法有哪些”吧!工厂方法模式(Factory Met...
    99+
    2024-04-02
  • 网页版式设计的方法有哪些
    本篇内容介绍了“网页版式设计的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 广告主图搭配简洁的格栅系统无论屏幕尺寸大小如何,...
    99+
    2023-06-10
  • Python中有哪些设计模式
    Python中有哪些设计模式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。目前的功能可以增加功能块可以增加连接线可以移动功能块可以输出JSON格式将来的功能支持基本的演算功...
    99+
    2023-06-19
  • qt设计登录界面的方法有哪些
    Qt设计登录界面的方法有以下几种:1. 使用Qt的UI设计工具:Qt提供了一个可视化的UI设计工具,可以直接通过拖拽和布局来设计登录...
    99+
    2023-08-09
    qt
  • Python统计次数方法技巧有哪些
    本篇内容介绍了“Python统计次数方法技巧有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、使用字典 dict 统计循环遍历出一个可...
    99+
    2023-06-25
  • python现金流计算的方法有哪些
    今天小编给大家分享一下python现金流计算的方法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。常用现金流的计算1.固...
    99+
    2023-06-27
  • 前端测试用例设计方法有哪些
    这篇文章主要为大家展示了“前端测试用例设计方法有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“前端测试用例设计方法有哪些”这篇文章吧。测试用例指导我们怎么去...
    99+
    2024-04-02
  • 珠海网站设计优化的方法有哪些
    1. 确定网站设计目标:首先,需要明确网站设计的目标,例如增加销售、提高品牌知名度、增加访问量等,这将有助于确定网站设计的方向和重点...
    99+
    2023-06-12
    珠海网站设计
  • python统计代码耗时的方法有哪些
    这篇文章将为大家详细讲解有关python统计代码耗时的方法有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。时间戳相减在代码执行前后各记录一个时间点,两个时间戳相减即程序运行耗时。获取时间戳time.t...
    99+
    2023-06-14
  • 福州网站设计制作的方法有哪些
    福州网站设计制作的方法有:1.确定目标和需求:首先需要确定网站的目标和需求,包括网站的类型、主题、定位、功能等等。2.制定网站规划:...
    99+
    2023-06-11
    福州网站设计
  • 台州网站设计制作的方法有哪些
    1. 确定网站目标和定位:首先需要明确网站的目标和定位,包括网站的主要功能、受众群体、内容类型等。2. 网站结构规划:根据网站目标和...
    99+
    2023-06-12
    台州网站设计
  • python设置代理Ip的方法有哪些
    本篇内容主要讲解“python设置代理Ip的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python设置代理Ip的方法有哪些”吧!1、urllib模块设置代理。假如我们经常使用ip爬...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作