<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <blockquote>
讯享网
原文:PythonCentral
协议:CC BY-NC-SA 4.0
原文:https://www.pythoncentral.io/check-file-exists-in-directory-python/
在 Python 中,有几种方法可以用来检查某个目录中的文件是否存在。当检查文件是否存在时,通常在访问(读取和/或写入)文件之前执行。下面我们将介绍检查文件是否存在(以及是否可访问)的每种方法,并讨论每种方法的一些潜在问题。
如果给定的路径是现有的常规文件,此函数返回 true。它遵循符号链接,因此有可能为真,而也为真。这是一个检查文件是否存在的方便函数,因为它是一个简单的命令行程序。不幸的是,该函数只检查指定的路径是否是一个文件,但不保证用户可以访问它。它也只告诉你在你调用这个函数的时候这个文件已经存在了。有可能(尽管可能性极小),在调用这个函数和访问这个文件之间,它已经被删除或移动/重命名了。
OS . path . is File(’ foo . txt ‘)
True
f = open(’ foo . txt ‘,’ r’)
Traceback(最近一次调用 last):
File " ",第 1 行,in
IOError: [Errno 13]权限被拒绝:’ foo.txt’
这个函数测试当前用户(拥有真实的 uid/gid)是否有访问给定路径的权限(读和/或写权限)。要测试文件是否可读,可以使用,使用来确定文件是否可写。比如如下。
讯享网
如果您计划访问一个文件,使用这个函数会更安全一些(尽管不完全推荐),因为它还会检查您是否可以访问(读或写)该文件。但是,如果您计划访问该文件,则在您检查该文件是否可访问和您访问该文件之间,该文件可能已经被删除或移动/重命名。这就是所谓的竞争条件,应该避免。下面是一个如何发生的例子。
为了绝对保证文件不仅存在,而且在当前时间是可访问的,最简单的方法实际上是尝试打开文件。
讯享网
这可以转换成一个易于使用的函数,如下所示。
例如,您可以按如下方式使用它:
讯享网
无论您决定使用哪种方法,都取决于您为什么需要检查文件是否存在,速度是否重要,以及在任何给定时间您经常尝试打开多少个文件。在许多情况下,应该足够了。但是请记住,在使用任何一种方法时,每种方法都有自己的优点和潜在问题。
原文:https://www.pythoncentral.io/check-object-type-python/
这篇 Python 初学者教程将教你如何在 Python 中检查对象类型的基础知识。你可能已经知道了,Python 中不同类型的对象。对象可以是列表、字符串、整数等。在您作为开发人员的职业生涯中,有时您需要知道一种类型或另一种类型之间的区别,因为肉眼并不总是显而易见的。如果您发现自己需要找出正在处理的对象的类型,Python 有一个内置的功能来确定这一点。type()函数,顾名思义,使用起来非常简单,它将帮助您快速确定您正在处理的 Python 对象的类型。
要使用它,你只需要把对象作为参数传递给函数,你很快就会得到答案。例如,如果您正在寻找一个如下所示的对象类型:
您只需要使用 type()函数,就像这样:
讯享网
根据对象的格式,您可能已经知道了答案(两个[]括号之间的任何对象都是列表),但是您的输出将是这样的:
您也可以使用以下语法,以稍微不同的方式使用 type()。
讯享网
在上面的例子中,第一行是如何使用 type()函数,第二行是告诉您对象是否是您所认为的类型的输出(在本例中,它实际上是一个列表)。在 Python 中使用 type()函数是一种简单且相对容易的方法,可以确定您正在处理的对象的类型,所以可以尝试使用它,直到您可以在任何编码环境中轻松使用它。
原文:https://www.pythoncentral.io/circular-queue/
要了解循环队列,您首先应该很好地理解以下内容:
- Python 3
- 线性队列(你可以在这里了解更多)
- 基本 Python 数据结构概念-列表
- 基本数学运算-模数(%)
在你继续阅读本教程之前,我强烈推荐你阅读我们之前的关于队列的教程,因为我们将建立在这些概念之上。循环队列被广泛使用,并且经常在工作面试中被测试。循环队列可以看作是对线性队列的改进,因为:
- 由于头尾指针会自行复位,因此无需复位。这意味着一旦头部或尾部到达队列的末尾,它会将自己重置为 0。
- 尾部和头部可以指向同一个位置——这意味着队列是空的
- 头可以比尾大,反之亦然。这是可能的,因为头指针和尾指针允许相互交叉。
看看 这个 的动画可以更好地理解环形队列。
基于上述动画的观察:
- 头指针——指向队列的最前面。或者换句话说,如果调用出列操作,它指向要删除的元素。
- 尾指针指向下一个可以插入新元素的空白点。在上面的动画中,如果您试图完全填满队列,您将无法在第 13 个位置之后排队。这是因为在第 14 个位置插入一个元素后,尾部没有空的点可以指向。即使还有一个空位,也认为队列已满。您还应该尝试执行三次或四次出列操作,然后将一个元素入队。在这里,您将看到元素从第 14 个位置插入,然后从 0 重新开始。正是由于这个原因,它被称为循环队列。
- 元素数量:
- 尾>=头:元素个数=尾-头。例如,如果 Head = 2,Tail = 5,那么元素的数量将是 5 - 2 = 3
- 头>尾:元素个数=(队列大小)-(头尾)=(队列大小)-头+尾。例如,头= 14,尾= 5,队列大小= 15,那么元素数= 15 - (14 - 5) = 6
我希望你现在有信心知道什么是循环队列。让我们 看看如何使用语言不可知的方法来实现它。为此,我们需要像对待数组一样对待列表,因此我们将限制它的大小。
注意: 在出队操作期间,头指针将增加 1,但实际上不会从队列中移除任何元素。这是因为一旦删除了一个元素,列表会自动将所有其他元素向左移动一个位置。这意味着位置 0 将总是包含一个元素,该元素不是实际队列/循环队列的工作方式。
算法
以下步骤可以看作是循环队列操作的流程图:
- 初始化队列、队列大小(maxSize)、头指针和尾指针
- 排队:
- 检查元素的数量(size)是否等于队列的大小(maxSize):
- 如果是,抛出错误消息“队列已满!”
- 如果没有,则追加新元素并递增尾指针
- 检查元素的数量(size)是否等于队列的大小(maxSize):
- 出列:
- 检查元素数量(大小)是否等于 0:
- 如果是,抛出错误消息“队列为空!”
- 如果没有,则增加头指针
- 检查元素数量(大小)是否等于 0:
- 尺寸:
- 如果尾部> =头部,则大小=尾部-头部
- 如果 head>tail,size = maxSize -(头尾)
注意:头和尾指针的范围应该在 0 和 maxSize - 1 之间,因此我们使用的逻辑是,如果我们将 x 除以 5,那么余数永远不会大于 5。换句话说,应该在 0 到 4 之间。因此,将此逻辑应用于公式 tail = (tail+1)%maxSize 和 head = (head+1)%maxSize。请注意,这有助于我们避免在队列变满时将 tail 和 head 重新初始化为 0。
程序
循环队列有多种用途,例如:
- 计算机架构(调度器)
- 磁盘驱动器
- 视频缓冲
- 打印机作业调度
开始时,循环队列可能看起来有点混乱,但掌握它的唯一方法就是不断练习。在上面提供的动画链接中尝试不同的入队和出队操作,看看它是如何工作的。本教程到此为止。快乐的蟒蛇!
原文:https://www.pythoncentral.io/code-snippets-using-python-to-solve-the-quadratic-equation/
Python 是一种通用且强大的编码语言,可用于执行各种功能和流程。感受 Python 如何工作的最好方法之一是用它来创建算法和求解方程。在这个例子中,我们将向您展示如何使用 Python 来求解一个更广为人知的数学方程:二次方程(ax ² + bx + c = 0)。
讯享网
正如您所看到的,为了求解方程,必须导入 cmath 模块,并且通过使用乘法、除法和 cmath.sqrt 方法(可用于求一个数的平方根)来求解方程。打印出来的文字可以定制成你喜欢说的任何话。
原文:https://www.pythoncentral.io/comparison-of-python-ides-development/
This article was written by Jason Fruit. For another opinion on Python IDES by Sergio Tapia Gutierrez, checkout our article Best IDEs for Python Development. We also have a Review of Python’s Best Text Editors.Edit: Mike has pointed out in the comments that PyCharm now comes with a free version (community edition). We’ve updated the article to reflect this.
直到最近,我已经好几年没有研究 Python IDEs 了;我通常不是一个 IDE 用户——我通常使用 Emacs 。当我最后一次检查它们时,Python IDEs 是令人沮丧的;为动态语言编写工具并不容易,因为他们必须分析代码,并且它的许多行为在运行前很难预测。然而,现在有一点对我来说变得特别明显:Python IDEs 已经有了很大的改进。如果我现在开始成为一名 Python 程序员,我很可能会选择 IDE——其中一些确实令人印象深刻。我已经测试并回顾了其中的许多,所以下面你会发现 Python IDEs 的比较,按字母顺序排列:
- 与 PyDev 的月食
- 埃里克
- 空闲
- Komodo IDE
- PyCharm
- 机翼 IDE
完全公开:在编程环境(或者文学环境,就此而言)中,“Eclipse”这个词让我充满恐惧;在我心目中,月食就是一头被绑在鲸鱼身上的猪和一只被绑在鲸鱼身上的狗。我不愿意安装 Eclipse,因为它是一个非常大的应用程序;有人会说臃肿。鉴于此,我对 PyDev 有些偏见——但我试图公平地评价它,它给我留下的印象比我预期的要多得多。
PyDev 的安装比这里讨论的许多 ide 要复杂一些,因为 Eclipse 必须单独安装。然后,Eclipse 必须关闭并作为管理员运行,您必须添加 PyDev 的软件源,接受它的证书,并等待插件安装。那么您必须以普通用户的身份重启 Eclipse。(优秀的说明可从pydev.org处获得。)
PyDev 的 Eclipse
我最初的反应是,它很好,但有些笨重。代码导航做得很好,也很有效,自动缩进和去缩进工作得很漂亮。自动补全功能运行良好,并给出了很好的建议,但是用户交互实现有些笨拙;在某些情况下,例如,如果您有一个缩小到单个建议的列表,并且您想键入其他内容,您必须按 Escape 键来退出自动完成列表,将您的手从它们的键入位置移开。出于某种原因,在项目中创建一个新的 Python 文件有时需要几秒钟。对于类和函数来说,代码折叠是可用的,但是由于某种原因,对于任何其他类型的块来说都是不可用的。调试器工作正常,但它的用户界面——它打开了一个不同的调试视图,而不是将调试集成到常规的 PyDev 视图中——只是比它需要的更加分散,到处都是额外的 chrome,使得可用空间如此之小,以至于你必须滚动才能看到一切。
PyDev 确实有一些其他 ide 没有的东西,那就是远程调试;如果这对您很重要,您必须使用 Emacs 或 PyDev,这是我发现的唯一可行的选择。
总的来说,Eclipse 和 PyDev 是一个非常好的 IDE。如果您是一个已经习惯了 Eclipse 的 IDE 用户,并且您喜欢它,我会让 PyDev 试试,这样您就可以使用您已经熟悉的工具了。如果 Eclipse 对您不重要,但是您想要一个 IDE,我会尝试 PyCharm,它以一个更干净、更快、更好的软件包提供了所有相同的特性;尽管如此,PyDev 还是一个不错的选择。
Eric 是用 Python 写的 IDE,带 PyQt 。它集成了一些熟悉的 Qt 工具,比如 Designer 和 languages,使用了无处不在的 Scintilla 编辑组件,并且拥有一些看起来非常有用的工具。
这就是我对 Eric 的总结,因为它有一个非常严重的缺点:它有一个非常复杂的界面,可发现性很低,文档很少。感觉就像它被设计成让用户感到愚蠢和无能。我可以直接进入并使用这个列表中的其他编辑器和 ide,并查阅文档中不明显的部分,Eric 每次都阻止我,尽管它的插件 API 是有文档记录的(我想是通过一个工具),但没有包括用户文档。没有。零文档。
毫无疑问,你会原谅这篇评论中沮丧的语气。

Eric 4 Python IDE 截图
自动完成起初似乎没有打开,所以我翻遍了首选项,在两个地方启用了它,我认为这是必要的。这太糟糕了——事实上糟糕得可笑,所以我搜索并找到了自动补全替代插件的参考资料。我安装了其中的一个,基于 Rope,检查了偏好设置以启用和,发现有变化但没有改进——然后厌恶地放弃了。
自动缩进是勉强可以接受的。Qt 的 GUI 设计器已经足够好了,但是祝你好运找到它。提示:它不在菜单上。调试工作,并声称可以远程调试,虽然我没有测试。哦,偏好设置里禁用了。
重构?不知道行不行;我从未见过菜单被启用。也许它在首选项中也被禁用了,但是我找不到它的设置。对于完全无用的帮助查看器,有广泛的定制选项,如果有帮助的话。
我见过比 Eric 用户体验更好的狗屎。
大多数 Python 发行版都有 IDLE,它将自己描述为“用 tkinter GUI 工具包构建的 Python IDE”。它宣传以下功能:
- 用 100%纯 Python 编码,使用 Tkinter GUI 工具包。
- 跨平台:适用于 Windows、Mac 和 Linux/Unix。
- 多窗口文本编辑器,具有多重撤销、Python 着色和许多其他功能,例如智能缩进和呼叫提示。
- Python shell 窗口(也称为交互式解释器)。
- 调试器(不完整,但可以设置断点、视图和步骤)。

Python IDE 空闲截图
所有这些特性实际上都存在,但它们并不能真正构成一个 IDE。事实上,虽然 IDLE 提供了一些你期望从 IDE 中得到的特性,但它并不是一个令人满意的文本编辑器。该界面存在缺陷,未能考虑 Python 的工作方式,特别是在交互式 shell 中,自动完成在标准库之外没有用,编辑功能如此有限,以至于没有一个认真的 Python 程序员——见鬼,没有一个认真的
打字员——可以全职使用它。
如果你使用 IDE,它不应该是空闲的。
ActiveState 提供了“额外电池”的 Python 优秀发行版,他们的 Perl 和 Tcl 发行版也不错,但是他们应该把 Python IDE 的业务留给别人。为科莫多巨蜥支付 295 美元是令人难以容忍的;PyDev 不免费或者 PyCharm 花更少的钱做的事情很少,而且它做的很多事情只是名义上有效,至少在 Ubuntu 上是现成的。
公平地说,他们从事的工作比本文所讨论的大多数 IDE 的开发人员更困难:Komodo IDE 还为 CSS、HTML、JavaScript、PHP、Perl、Ruby、Tcl、XML、XSLT、XUL 和各种模板语言提供了编辑和代码完成功能。我没有测试其中任何一个,尽管我了解到它们的 JavaScript 支持非常出色。尽管如此,这对你写 Python 还是没什么帮助。
PyCharm 是由 IntelliJ IDEA、WebStorm、RubyMine 和其他强大的单一语言 ide 背后的人 JetBrains 创建的。他们当然知道 IDEs,他们的经验用 PyCharm 表现出来。这是一个完美的、强大的、多功能的 IDE,运行良好、快速,并且提供了很多功能。
PyCharm 实际上拥有 IDE 的所有功能:代码突出显示、真正有效的自动缩进、可定制的代码格式、我见过的最好的 Python 自动完成功能(尽管在第一次创建项目时构建索引花费了大量时间)、实时错误检测(加上拼写检查,我觉得这很有价值)、代码片段、代码折叠、智能引号、括号、冒号,甚至参数:它真的非常强大。它拥有强大的项目导航工具、自动纠错建议、优秀的重构工具、文档浏览器、Python 调试器、单元测试工具等等。太棒了。

PyCharm Python IDE 截图
它还提供了使用和调试 Django 和 Google App Engine 应用程序的特殊功能,强大的 JavaScript、CoffeeScript、HTML 和 CSS 编辑器,各种模板工具,JavaScript 调试器——你相信了吗?我唯一想从一个 IDE 中得到的是一个 GUI 设计器;也许 JetBrains 的人不希望他们优秀的 IDE 被称为“PyGTK 的 RAD IDE”,或者他们选择的任何工具包。无论如何,有很多独立的 GUI 设计器可用于各种 GUI 工具包,而且我也不使用它们,所以我觉得这并不是一个不足。
PyCharm 有两个版本——社区版和专业版。社区版是免费的(就像 freedom 一样),而专业版是部分专有的,价格不等。他们向开源项目和教育机构免费提供专业版,而价格从 29 美元到 199 美元不等。你可以点击查看全部定价。
如果我是一个几乎完全依赖 Python 的开发人员,并且我还没有投入太多时间来学习如何用 Emacs 做 PyCharm 做的所有事情,我会强烈考虑转向 PyCharm。你绝对应该把它放在你的候选名单上。
Wing IDE 专业版(我评测的版本)和 Komodo IDE 价格差不多,但相似之处也就到此为止了。它速度快,功能全,而且有效。自动完成和自动缩进与这里最好的评论一样好,集成测试和调试工作良好,具有直观的界面,尽管重构选项非常有限,但是一旦您在运行工具之前确定了应该选择什么,它们就工作得很好。
片段是存在的,但不像 PyCharm 中那样干净地实现,或者更严重的是,Sublime Text;尽管如此,它们仍然是合理的默认值,您可以编辑它们并添加更多。

Wing Python IDE 截图
几个杂项:Wing 可以做 Django 项目,集成了 diff 和 merge,一个很好的 Python shell,一个操作系统命令接口,我发现它令人困惑,不如一个简单的控制台,并且通常可以做你期望从 IDE 中得到的所有事情。
我发现 UI 比 Eclipse/PyDev 好,但比 PyCharm 稍差一些,而且比这两者都不落后。机翼是一个非常好的选择,但价格昂贵;如果我掏钱,我会注意到两件事:个人版只省略了一些我认为有用的功能,而且价格低得多;而 PyCharm,一般来说也一样好但是速度慢,价格和 Personal 差不多。
ide 中有一些非常好的选择:如果你想要一个运行良好的免费的,安装 Eclipse 和 PyDev 如果你愿意出钱,PyCharm 和 Wing IDE 的能力差不多,都是优秀的 IDE。也有一些灾难,包括免费的和不免费的,但是很明显 Python 的 ide 在过去的十年里有了很大的进步,可以和不太动态的语言的工具相比较。
要了解关于 Python IDEs 的另一个观点,请查看塞尔吉奥的文章。
原文:https://www.pythoncentral.io/connected-cmms/
互联 CMMS 是一种连接您的系统、人员和流程的新型维护和物业运营方法。它将 CMMS 的范围扩展到维护和工作单之外,以简化流程,促进利益相关方的参与,并在一个位置提高效率和连接性。
联网 CMMS 是为大型物业运营和维护团队提供单一平台的最有效方式。
联网 CMMS 不再要求运营专业人员依赖各种单点解决方案来处理超出维护、电子邮件沟通、电子表格报告等范围的工作,而是将所有运营工作流程(包括客户参与和物业维护、工作场所管理、供应商管理、资产绩效和物联网信息)整合到一个单一的综合平台中。
CMMS/CaFM 系统的构建方式存在问题,即使是作为一个记录保存系统。它们不再与房地产业务的投资组合兼容。
投资组合不断发展,需要关注客户参与、合同管理、支出可见性、基于条件的投资组合规模维护优化…不胜枚举。
然而,在目前的 CMMS 模式中,通过电子表格和电子邮件完成的工作比 CMMS 还要多。这还没有提到登录几个系统来满足不同需求的困难。每个工作流程都必须通过各种工具,数字的和模拟的,每一步都变得低效、无效和缓慢。
《连线 CMMS》如何将 CMMS 重新思考成一个现代的“行动系统”
在我们生活的这个时代,使用企业软件就像发短信一样简单——它速度快、界面友好、使用简单,并且采用了尖端技术。相比之下,56%的 O & M 利益相关者面临着维护和运营技术以及数字化转型的挑战。当前的 CMMS 只关注技术人员,很少或没有自动化或与 O & M 技术堆栈的其余部分集成。
互联 CMMS API 通过整合流程、人员和系统,提高效率并转变用户体验的提供方式。
【ConnectedCMMS(实际上)应该是什么样的,我们如何应对?
互联 CMMS 是一种灵活的方法。互联 CMMS 方法不需要您完全更换当前的技术堆栈并从头开始。它旨在与您当前的企业运营和业务软件协同工作,并开发基础设施(传感器和监控基础设施)。它必须使用 API 优先的设计来构建,这种设计将数据民主化和规范化,以允许访问第三方应用程序。它应该被设计为通过移动、网络和信息亭应用服务于 O & M 利益相关者(所有者、经营者、租户和居住者)。使用零代码 SaaS 平台而不是单点解决方案方法来解决与投资组合运营和维护相关的最常见的自动化、定制和集成问题是至关重要的。
《连线 CMMS》将其归结为三个支柱/步骤:
- 自动化
- 订婚
- 效率
第一步:在 CMMS 实现流程自动化,以简化操作并缩短时间
通常,今天的运营团队使用多个记录系统。这意味着各种工具在团队中存储和传递信息。此外,他们还投资软件或开发仪表板和分析工具。最终,你的日常工作流程缓慢而混乱。他们也挤满了不断变化的工具,很难跟踪。例如,团队使用电子邮件进行相互间的沟通,使用电话或聊天发出警告,使用企业工具进行会计和供应商 CRM,使用电子表格进行报告,以及所有其他事情。
为了解决这一问题,互联 CMMS 通过利用工作流自动化,帮助企业从记录系统“转向行动系统”。
在整个生命周期中,它通过各种流程的自动化来连接流程。这包括创建工作订单、发送通知、提醒技术人员、通信和批准、创建仪表板、报告、报表等。当所有的日常任务都由自动化工作流处理时,您的团队将有时间和精力专注于收入优化和向客户交付价值。
第二步:与 CMMS 的 O & M 参与者接触,提高各个层面的知名度和价值
从一开始,你的 CMMS 就必须设计成确保全面参与,而不是作为一种课外活动。它应向用户提供对物业单位的运营至关重要的用户界面,包括但不限于物业经理、现场技术人员、主管、物业经理和管理人员,他们可以在需要时访问所需的数据。所有来自外部的关键利益相关方(住户和工作中的员工以及租户/客户和承包商)都需要在他们的位置通过移动、网络或信息亭应用程序获得服务。
互联 CMMS 通过让多个利益相关方参与进来,帮助企业实现信息访问民主化,促进内部协作,并增强用户体验。
从财务和资产洞察、组织范围的进度监控到服务请求的反馈和互动响应,互联 CMMS 可以满足所有利益相关方的需求。
第三步:通过以有意义的方式整合 OT,在 CMMS 实现完全互联运营
运行 ppm 并不是唯一的业务运营要求。建筑物在能源管理、居住者健康和效率/预测性维护方面有更多的需求。连接到建筑系统并收集实时信息对于优化与之相关的流程至关重要。此外,CMMS 作为一个独立的解决方案是不够的。连接到第三方应用程序和软件以实现最大的企业 T2 价值是必不可少的。
互联 CMMS 通过一种 API 优先的方法,集成了 BMS 传感器、BIM 或任何第三方商业软件,使您能够更快地创建无缝的数字体验。
它支持互操作性,解决了企业应用程序最常见的集成问题。通过将来自第三方访问的数据大众化,您能够加快组合规模的物联网部署过程,而无需重复的站点级集成,并在更大范围内创造新的效率。
原文:https://www.pythoncentral.io/convert-dictionary-values-list-python/
在 Python 中,字典是一种内置的数据类型,可用于以不同于列表或数组的方式存储数据。字典不是序列,所以它们不能由一系列数字索引,而是由一系列关键字索引。在学习字典时,将字典数据看作无序的键:值对是有帮助的,在单个字典中,键需要是唯一的。您可以在一对花括号内轻松创建字典。用 key: value 格式的数据填充括号,用逗号分隔 key: value 对,这样就有了一个字典。
请参见下面的代码,了解字典的样子以及应该如何格式化的示例:
如果你的键是字符串,记住把它们放在引号中是很重要的。
字典的有趣之处在于它们可以用来映射数据的不同方式。一个常见的字典操作是从键:值对中提取值,并将它们转换成一个列表,其代码实际上非常简单。要了解这是如何做到的,请查看下面的代码片段。
首先,我们需要一本字典:
讯享网
接下来,我们需要可以用来执行从字典到列表的值转换的代码,如下所示:
就是这样。上面代码的输出应该是字典中键:值对的数据值,与它们在字典中出现的顺序完全一致。因此,您的输出应该如下所示:
讯享网
您可以使用这个代码片段将任何字典的键:值对的值打印为一个列表。
原文:https://www.pythoncentral.io/cutting-and-slicing-strings-in-python/
Python 字符串是单个字符的序列,与其他 Python 序列共享它们的基本访问方法——列表和元组。从字符串中提取单个字符(以及任何序列中的单个成员)的最简单方法是将它们解包到相应的变量中。
不幸的是,为了存储字符串中的每一个字符,我们很难事先知道需要多少个变量。如果我们提供的变量数量与字符串中的字符数量不匹配,Python 会给我们一个错误。
讯享网
在 Python 中通过索引访问字符串中的字符
通常,使用 Python 的类似数组的索引语法来访问字符串的单个字符更有用。这里,和所有序列一样,重要的是要记住索引是从零开始的;也就是说,序列中的第一项是数字 0。
如果您想从字符串的末尾开始计数,而不是从开头,请使用负索引。例如,索引-1 表示字符串最右边的字符。
讯享网
Python 字符串是不可变的,这只是一种奇特的说法,一旦它们被创建,你就不能改变它们。尝试这样做会触发错误。
如果你想修改一个字符串,你必须创建一个全新的字符串。在实践中,这很容易。我们一会儿就来看看。
切片 Python 字符串
在此之前,如果你想提取一个以上的字符,位置和大小已知的块呢?这相当简单和直观。我们稍微扩展了方括号语法,这样我们不仅可以指定我们想要的片段的起始位置,还可以指定它的结束位置。
讯享网
让我们看看这里发生了什么。和以前一样,我们指定要从字符串中的位置 4(从零开始)开始。但是现在,我们不再满足于字符串中的单个字符,而是说我们想要更多的字符,直到,但不包括位于第 8 位的字符。
你可能会认为你也会得到 8 号位的字符。但事情不是这样的。别担心,你会习惯的。如果有帮助的话,可以把第二个索引(冒号后面的那个)想象成指定你不想要的第一个字符。顺便说一句,这种机制的一个好处是,您可以通过简单地从第二个索引中减去第一个索引来快速判断您将得到多少个字符。
使用这种语法,您可以省略一个或两个索引。第一个索引,如果省略,默认为 0,这样您的块从原始字符串的开头开始;第二个默认为字符串中的最高位置,因此您的块在原始字符串的末尾结束。省略这两个指标不太可能有多大的实际用途;正如您可能猜到的,它只是返回整个原始字符串。

如果你还在纠结于这样一个事实,例如,s[0:8]返回到为止的所有内容,但不包括第 8 位的字符,这可能会有所帮助:对于你选择的任何 index、n值,的值将始终与原始目标字符串相同。如果索引机制是包含的,则位置 n 处的字符将出现两次。
讯享网
就像以前一样,您可以使用负数作为索引,在这种情况下,计数从字符串的结尾(索引为-1)开始,而不是从开头开始。
分割 Python 字符串时跳过字符
方括号语法的最后一个变化是添加了第三个参数,该参数指定了“步幅”,即在从原始字符串中检索每个字符后要向前移动多少个字符。第一个检索到的字符总是对应于冒号之前的索引;但此后,无论您指定多少个字符作为步幅,指针都会向前移动,并在该位置检索字符。依此类推,直到达到或超过结束索引。就像我们目前遇到的情况一样,如果参数被省略,它默认为 1,这样就可以检索指定段中的每个字符。一个例子更清楚地说明了这一点。
讯享网
您也可以指定负步幅。正如您所料,这表明您希望 Python 在检索字符时后退。
正如你所看到的,因为我们是在后退,所以起始索引比结束索引高是有意义的(否则什么都不会返回)。
讯享网
因此,如果您指定了一个负的步幅,但是忽略了第一个或第二个索引,Python 会将缺少的值默认为在这种情况下有意义的值:开始索引到字符串的末尾,结束索引到字符串的开头。我知道,它会让你一想到它就头疼,但是 Python 知道它在做什么。
这就是方括号语法,如果你知道你需要的字符块在字符串中的确切位置,它允许你检索字符块。
但是,如果您想基于字符串的内容检索一个块,而我们可能事先并不知道,该怎么办呢?
检查内容
Python 提供了字符串方法,允许我们根据指定的分隔符将字符串分割。换句话说,我们可以告诉 Python 在我们的目标字符串中寻找某个子字符串,并围绕该子字符串分割目标字符串。它通过返回结果子字符串的列表(减去分隔符)来实现这一点。顺便说一下,我们可以选择不显式指定分隔符,在这种情况下,它默认为空白字符(空格,’ ‘,’ ‘,’ ‘,’ f ')或此类字符的序列。
请记住,这些方法对调用它们的字符串没有影响;它们只是返回一个新的字符串。
讯享网
更有用的是,我们可以将返回的列表直接存储到适当的变量中。
让我们的西班牙英雄暂时离开他的风车,让我们想象一下,我们有一个字符串,其中包含以小时、分钟和秒表示的时钟时间,用冒号分隔。在这种情况下,我们可以合理地将单独的部分收集到变量中,以便进一步操作。
讯享网
我们可能只想分割目标字符串一次,不管分隔符出现多少次。方法将接受第二个参数,该参数指定要执行的最大分割数。
这里,字符串在第一个冒号处被拆分,其余部分保持不变。如果我们想让 Python 从字符串的另一端开始寻找分隔符呢?嗯,有一个叫做的变体方法,它就是这么做的。
讯享网
建造隔墙
类似的字符串方法是。这也基于内容分割一个字符串,不同之处在于结果是一个,它保留了分隔符,以及它两边的目标字符串的两个部分。与不同,总是只做一次拆分操作,不管分隔符在目标字符串中出现多少次。
与方法一样,、也有一个变体,它从目标字符串的另一端开始搜索分隔符。
讯享网
使用 Python 的 string.replace()
现在,回到我们的堂吉诃德。早些时候,当我们试图通过将“x”直接赋给来将“j”改为“x”从而使他的名字英语化时,我们发现我们做不到,因为你不能改变现有的 Python 字符串。但是我们可以通过在旧字符串的基础上创建一个我们更喜欢的新字符串来解决这个问题。允许我们这样做的字符串方法是。
再说一次,我们的字符串没有被改变。所发生的是 Python 只是根据我们给出的指令返回了一个新的字符串,然后立即丢弃它,留下我们的原始字符串不变。为了保存我们的新字符串,我们需要将它赋给一个变量。
讯享网
当然,我们可以重用现有的变量,而不是引入新的变量。
这里,虽然看起来我们改变了原来的字符串,但实际上我们只是丢弃了它,并在它的位置存储了一个新的字符串。
注意,默认情况下,将用新的子字符串替换搜索子字符串的每一次出现。
讯享网
我们可以通过添加一个额外的参数来指定搜索子串应该被替换的最大次数,从而控制这种浪费。
最后,replace()方法不限于作用于单个字符。我们可以用某个指定的值替换整个目标字符串。
讯享网
有关所用字符串方法的参考,请参见以下内容:
- str.replace(old,new[,count])
- 字符串分区(sep)
- str.rsplit(sep=None,maxsplit=-1)
- str.split(sep=None,maxsplit=-1)
原文:https://www.pythoncentral.io/difference-between-staticmethod-and-classmethod-in-python/
在本文中,我将尝试解释什么是和,以及它们之间的区别。和都使用装饰器将方法定义为或。请阅读文章 Python Decorators Overview ,对 Decorators 如何在 Python 中工作有一个基本的了解。
类中最常用的方法是实例方法,即实例作为第一个参数传递给方法。
例如,基本的实例方法如下:
这为我们提供了以下输出:
讯享网

查看代码示例和图表后:
- 在 1 和 2 中,参数被传递给方法。
- 在 3 上,参数指的是实例。
- 在 4 中,我们不需要向方法提供实例,因为它由解释器本身处理。
现在,如果我们要编写的方法只与类交互,而不与实例交互,该怎么办呢?我们可以在类之外编写一个简单的函数来实现这一点,但是这会将与类相关的代码分散到类之外。这可能会导致未来的代码维护问题,如下所示:
为我们提供了以下输出:
讯享网
我们现在要做的是在类中创建一个函数,它让类对象而不是实例工作。如果我们想得到实例的数量,我们所要做的就是下面这样的事情:
2
讯享网
class Kls(object):
no_inst = 0
def init(self):
Kls.no_inst = Kls.no_inst + 1
@ class method
def get _ no _ of _ instance(cls _ obj):
return cls _ obj . no _ inst
ik1 = Kls()
ik2 = Kls()
print ik1 . get _ no _ of _ instance()
print kls . get _ no _ of _ instance()
2
2
讯享网
IND = ‘ON’
def checkind():
return(IND = = ’ ON ‘)
Kls 类(object):
def init(self,data):
self.data = data
def do _ Reset(self):
if checkind():
print(’ Reset done for:',self.data)
def set _ DB(self):
if checkind():
self . DB = ‘新数据库连接’
print(‘数据库连接为:’,self.data)
ik1 = kls(12)
1 到 _reset()
ik1.set_db()
的缩写形式
Reset done for: 12
DB connection made for: 12
讯享网
IND = ‘ON’
Kls 类(object):
def init(self,data):
self.data = data
@ static method
def checkind():
return(IND = = ’ ON ‘)
def do _ Reset(self):
if self . checkind():
print(’ Reset done for:',self.data)
def set _ DB(self):
if self . checkind():
self . DB = ‘新数据库连接’
print('数据库连接为: ',self.data)
ik1 = kls(12)
1 到 _reset()
ik1.set_db()
的缩写形式
Reset done for: 12
DB connection made for: 12
讯享网
class Kls(object):
def init(self, data):
self.data = data
def printd(self):
打印(self.data)
@ Static method
def s method(* arg):
print(’ Static:‘,arg)
@ Class method
def cmethod(* arg):
print(’ Class:',arg)
[/python]
【python】
ik = Kls(23)
ik . printd()
23
ik . smethod()
Static:()
ik . cmethod()【t】Kls’ >,)
Kls . printd()
type error:必须以 Kls 实例作为第一个参数调用未绑定方法 printd()(改为 get nothing)
Kls . s method()
Static:()
Kls . cmethod()
Class:(<Class ’ _ _ main _ _。Kls’ >,)
原文:https://www.pythoncentral.io/does-ccna-ccnp-require-one-to-learn-programming-in-python/

Python 是一种面向对象的、交互式的解释语言。它包括最高级别的动态数据类型、动态类型、模块和类。也支持其他类型的编程,如过程和函数编程。除了面向对象编程,Python 还支持各种编程系统。它支持多种 Windows 系统以及 C 和 C++。它在与语法一起使用时执行。
Python 也在许多应用程序中被用作扩展语言。它是可移植的,可以适应各种 Unix 变种,包括 Linux、macOS 和 Windows。这在 CCNA 训练中至关重要。Python 是软件开发中最常用的编程语言。对于网络工程师来说,这是一门至关重要的语言。你可以在这里找到思科考试的完整指南。
一个网络工程师不一定要精通一门编程语言才能有效率。通过完成 CCNA、CCNP 和 CCIE 的课程,你可能会获得所有这些能力并由于你的教育而在 IT 组织中找到网络职位。
与其他语言相比,这种语言容易学习和阅读。
像大多数网络提供商一样,Cisco 喜欢这种语言,并在其所有组织中实施。
许多网络自动化技术已经用 Python 编写,这对网络工程师来说很有价值。
因为它是最流行的编程语言之一,所以它有一个相当大的社区。
想要使用这种语言的工程师应该确保它安装在 Linux 和 macOS 上。
目前在大量的 Cisco 交换机上都可以访问它。由于其受欢迎程度,这种情况下的职业机会非常好。
它已经被证明是许多软件应用程序的理想脚本语言。
以下是 Python 对于网络工程师和 IT 组织的一些主要优势:
- 网络管理得到简化。
- 改进的性能
- 为价值更高的工作保留 IT 人员
- 复兴网络
- 更少的错误
网络行业的科技巨头思科公司公布了 DevNet(开发网络)作为助理级和专业级认证的新途径。你会在我们的官方网站上看到完整的 CCNP 350-401 文章。网络自动化工程师需求量很大。然而,在网络架构中引入自动化需要专家的专业知识。他们可以使用网络可编程性更有效地操作网络。
不幸的是,网络工程师缺乏编程能力,这阻碍了他们适应招聘经理的雇佣标准。Python 简单且对代码友好的语法,以及其动态而强大的库,使得许多程序员和大型技术组织可以轻松地过渡到 Python,Python 已经取代了许多古老而著名的编程语言。
如果你在一家网络设备很少的小公司工作,并且不想成为一名程序员或者学习网络自动化,那就坚持你擅长的。你应该学习 Python 和网络自动化。最后,许多网络工程师担心自动化和 Python 会让他们失业。这意味着如果你建立了一系列的脚本来完成你的工作,你的雇主将不再需要你。
原文:https://www.pythoncentral.io/embed-interactive-python-interpreter-console/
你可以在应用程序中使用解释器做一些事情。其中最有趣的是让你的用户能够在运行时编写你的应用程序,就像 GIMP 和 Scribus 所做的那样,但它也可以用来构建增强的 Python shells,像 IPython 。
首先:首先从标准库的模块导入类,然后子类化它,这样你就可以添加一些钩子。Python 2 和 3 之间的模块没有真正的变化,所以本文对两者都有效。
讯享网
到目前为止,代码只是样板文件;它创建了一个名为的类,它只是的子类。
下面的代码演示了该类的工作方式。第 4 行调用了从继承而来的方法。方法获取一串源代码并在控制台内部执行,在本例中,将分配给,然后打印出来。
第 5 行打印了,因为控制台有自己的名称空间。注意,对象是一个常规的运行时对象;它在与初始化它的代码相同的线程和进程中运行代码,所以对的调用通常会被阻塞。
Python 的模块还提供了一个类,它会自动对表达式求值,就像 Python 的交互模式一样,但是使用多行输入会更复杂。接受任意有效的 Python 块。通常,当您需要使用终端时,您应该使用类,当您的输入将是完整的 Python 块时,通常作为文件或来自图形用户界面的输入字符串,您应该使用。
你经常想要处理用户的输入,可能需要转换编译一个语法扩展,比如 IPython Magic,或者执行更复杂的宏。
向名为的添加一个新的静态方法,该方法只接受一个字符串并返回它。添加另一个名为的新方法,它接受用户的输入,通过运行,然后传递给。这样做可以很容易地重新定义处理器,要么通过子类化,要么在运行时简单地给实例的属性分配一个新的 callable。
讯享网
类构造函数接受一个可选参数,这是一个字典,用于在创建控制台的名称空间时填充它。
当你创建一个新的实例时,传入对象允许你将任何对象放入用户编写应用程序可能需要的名称空间中。重要的是,这些可以是对对象的特定运行时实例的引用,而不仅仅是来自库导入的类和函数定义。
现在,您已经有了充实控制台所需的钩子。添加一个在新线程中调用的方法,可以让输入阻塞或并行运行。添加一个允许编写阻塞和非阻塞输入的预处理器的额外好处。
要在控制台的名称空间创建后访问它,可以引用它的属性。
讯享网
因为这有点难看,您可以将一个空的模块对象传入控制台,在外层空间保存对它的引用,然后使用该模块共享对象。
标准库的模块提供了一个函数,让我们在不影响(或者不需要实际文件)的情况下创建一个新的模块对象。您需要将新模块的名称传递给函数,并取回空模块。
现在您可以在控制台创建时将模块传递到控制台的名称空间中。在控制台内部也称它为,这使得它们是同一个对象变得更加明显,但是您可以使用不同的名称。
讯享网
现在是一个单独的空模块对象,在两个名称空间中都被这个名称引用。
将共享模块绑定到控制台实例是有意义的,因此每个控制台实例都有自己的共享模块。方法需要扩展来更直接地处理它的参数,所以它仍然能够接受可选的名称空间字典。
最好将预处理器的钩子传递到控制台的名称空间,这样用户就可以将自己的处理器绑定到这个名称空间。为了简单起见,下面的例子只是将对的引用作为传递到它自己的名称空间中,不是因为它是元的,只是因为它更容易阅读代码。
讯享网
如果你运行这段代码,现在在外部空间和控制台内部都有一个名为的全局变量引用相同的东西,所以在两者中都是相同的空模块。
在实践中,如果你允许用户编写你的应用程序,你会想要写一个你想要公开的运行时对象的包装器,这样用户就有一个干净的 API,他们可以在不崩溃的情况下入侵。然后将这些包装对象传递到控制台。
原文:https://www.pythoncentral.io/encoding-and-decoding-strings-in-python-3-x/
在我们的另一篇文章编码和解码字符串(在 Python 2.x 中)中,我们研究了 Python 2.x 如何处理字符串编码。在这里,我们将看看 Python 3.x 中的字符串编码和解码,以及有何不同。
当 Python 2.x 发展到最新的 Python 3.x 版本时,该语言的许多方面并没有发生很大的变化。Python 字符串是而不是其中之一,事实上它可能是变化最大的。与 Python 2.x 相比,它所经历的变化在 Python 3.x 的编码/解码中处理字符串的方式上最为明显。在 Python 2.x 中编码和解码字符串有点麻烦,您可能在另一篇文章中读到过。令人欣慰的是,将 8 位字符串转换为 unicode 字符串,反之亦然,在 Python 3.x 中,两者之间的所有方法都被遗忘了。让我们直接通过一些示例来检查这意味着什么。
我们将从一个包含非 ASCII 字符(即“ü”或“umlaut-u”)的示例字符串开始:
现在,如果我们引用并打印该字符串,它会给出基本相同的结果:
讯享网
与 Python 2.x 中的相同字符串相比,在这种情况下已经是 Unicode 字符串,而在 Python 3.x 中所有的字符串都是自动 Unicode 的。明显的区别是的在我们实例化后没有改变。
虽然我们的字符串值包含一个非 ASCII 字符,但它离 ASCII 字符集不远,也就是基本拉丁字符集(实际上它是基本拉丁字符集的一部分)。如果我们有一个字符,不仅是非 ASCII 字符,而且是非拉丁字符,会发生什么?让我们来试试:
正如我们所看到的,它是否包含所有拉丁字符并不重要,因为 Python 3.x 中的字符串都是这样的(与 Python 2.x 不同,您可以在空闲窗口中键入任何字符!).
如果你在 Python 2.x 中处理过编码和解码字符串,那么你会知道处理起来会麻烦得多,而 Python 3.x 让这变得不那么痛苦了。然而,如果我们不需要使用、或方法,或者在我们的字符串变量中包含多个反斜杠转义来立即使用它们,那么我们还有什么必要编码或解码我们的 Python 3.x 字符串呢?在回答这个问题之前,我们先来看一下 Python 3.x 中的(字节)对象,与 Python 2.x 中的对象形成对比。
Python 3 . x Bytes 对象
在 Python 2.x 中,在字符串前面加上“B”(或“B”)是合法的语法,但它没有什么特别之处:
讯享网
然而,在 Python 3.x 中,这个前缀表示字符串是一个不同于普通字符串的对象(我们知道普通字符串默认为 Unicode 字符串),甚至“b”前缀也被保留:
关于字节对象的事情是,它们实际上是整数的数组,尽管我们把它们看作 ASCII 字符。在这一点上,它们如何或者为什么是整数数组对我们来说并不重要,但是重要的是我们将只把它们看作一串 ASCII 文字字符,并且它们可以只有包含 ASCII 文字字符。这就是为什么下面的代码(或任何非 ASCII 字符)不起作用的原因:
讯享网
现在,为了了解字节对象与字符串的关系,我们先来看看如何将字符串转换成字节对象,反之亦然。
将 Python 字符串转换为字节,并将字节转换为字符串
如果我们想把之前的字符串转换成 bytes 对象,我们可以使用构造函数方法;然而,如果我们只使用字符串作为唯一的参数,我们会得到这个错误:
正如我们所看到的,我们需要在字符串中包含一个编码。让我们用一个常见的,UTF 8 编码:
讯享网
现在我们有了我们的物体,用 UTF 8 编码…但是这到底是什么意思呢?这意味着包含在我们的变量中的单个字符被有效地翻译成一串代码,这意味着“字“在 UTF-8 中——换句话说,它是用编码的。这是否意味着如果我们在上使用方法调用,我们会得到相同的结果?让我们看看:
事实上,我们得到了相同的结果,但在这种情况下我们不必给出编码,因为 Python 3.x 中的 encode 方法默认使用 UTF-8 编码。如果我们将其更改为 UTF-16,我们会得到不同的结果:
讯享网
尽管这两个调用执行相同的功能,但它们根据编码或编解码器的不同,以稍微不同的方式执行。
既然我们可以对字符串进行编码以生成字节,我们也可以对字节进行解码以生成字符串——但是当解码一个字节对象时,我们必须知道使用正确的编解码器来获得正确的结果。例如,如果我们尝试使用 UTF-8 来解码上面 nonlat 的 UTF-16 编码版本:
我们得到一个错误!现在,如果我们使用正确的编解码器,结果会很好:
讯享网
在这种情况下,由于解码操作失败,Python 向我们发出了警告,但警告是,当编解码器不正确时,错误不会总是发生!这是因为编解码器通常使用相同的代码短语(组成 bytes 对象的“xXXX”转义)来表示不同的内容!如果我们在人类语言的背景下考虑这一点,使用不同的编解码器编码和解码相同的信息就像试图用意大利语-英语词典将一个或多个单词从西班牙语翻译成英语一样——意大利语和西班牙语的一些音素可能相似,但你仍然会得到错误的翻译!
在 Python 3.x 中向文件写入非 ASCII 数据
关于 Python 3.x 和 Python 2.x 中的字符串,最后一点要注意的是,我们必须记住,使用方法写入两个分支中的文件不允许将 Unicode 字符串(包含非 ASCII 字符)写入文件。为了做到这一点,字符串必须经过编码。
这在 Python 2.x 中没什么大不了的,因为只有当你这样做时(通过使用方法或),字符串才会是 Unicode 的,但是在 Python 3.x 中,默认情况下所有字符串都是 Unicode 的,所以如果我们想将这样的字符串(例如)写入文件,我们需要使用和的(二进制)模式将字符串写入文件,而不会导致错误,如下所示:
同样,当读取非 ASCII 数据的文件时,使用模式并用正确的编解码器对数据进行解码也很重要——当然,除非你不介意用“意大利语”翻译你的“西班牙语”
原文:https://www.pythoncentral.io/execute-python-script-file-shell/
如果你不能执行或运行 Python 脚本,那么编程就毫无意义。当您运行 Python 脚本时,解释器会将 Python 程序转换成计算机可以理解的东西。执行 Python 程序有两种方式:用 shebang 行调用 Python 解释器,以及使用交互式 Python shell。
通常程序员编写独立的脚本,独立于真实环境。然后他们用一个。py”扩展名,它向操作系统和程序员表明该文件实际上是一个 Python 程序。在解释器被调用后,它读取并解释文件。Python 脚本在基于 Windows 和 Unix 的操作系统上运行的方式非常不同。我们将向您展示不同之处,以及如何在 Windows 和 Unix 平台上运行 Python 脚本。
使用命令提示符在 Windows 下运行 Python 脚本
Windows 用户必须将程序的路径作为参数传递给 Python 解释器。比如如下:
讯享网
注意,您必须使用 Python 解释器的完整路径。如果你想简单地输入,你必须将添加到你的环境变量中。要做到这一点,请查看将 Python 添加到路径环境的文章…
窗口的 python.exe 对 pythonw.exe
注意,Windows 附带了两个 Python 可执行文件- 和。如果你想在运行脚本时弹出一个终端,使用,但是如果你不想弹出任何终端,使用。通常用于 GUI 程序,在这里你只想显示你的程序,而不是终端。
在像 Mac、BSD 或 Linux (Unix)这样的平台上,你可以在程序的第一行加上一个“shebang ”,表示 Python 解释器在硬盘上的位置。它的格式如下:
用于 Python 解释器的常见 shebang 行如下:
讯享网
然后,您必须使用以下命令使脚本可执行:
与 Windows 不同,Python 解释器通常已经存在于环境变量中,因此没有必要添加它。
然后,您可以通过手动调用 Python 解释器来运行程序,如下所示:

讯享网
假设你已经安装了 Python 并且运行良好(如果你得到一个错误,见这篇文章),打开终端或控制台,输入‘Python’并按下‘Enter’键。然后,您将立即被定向到 Python live 解释器。您的屏幕将显示如下信息:
Python 程序员应该记住一件事:在使用实时解释器时,一切都是实时读取和解释的。例如,循环会立即迭代,除非它们是函数的一部分。所以需要一些心理规划。使用 Python shell 通常用于交互式执行代码。如果你想从解释器运行一个 Python 脚本,你必须它或者调用 Python 可执行文件。
原文:https://www.pythoncentral.io/expert-tips-for-using-apis-in-python/
Python 是一种通用的编程语言,你可以在 web 应用程序的后端、前端或整个堆栈上使用。在本文中,我们将回顾一些在 Python 中使用 API 的专家提示。首先,理解什么是 API 以及它是如何工作的很重要。API 或应用程序编程接口规则控制一个软件如何与另一个软件交互。当您使用 API 时,您向服务器请求可以在应用程序中使用的数据。例如,当您使用 Google Maps API 获取路线时,您正在向 Google Maps 服务器发送一个请求,以获取您需要的信息。然后,服务器用请求的数据进行响应。

API(应用编程接口)是一组允许软件程序相互通信的定义规则。当需要从远程数据源(如基于 web 的数据库)访问数据时,会使用 API。软件程序将向 API 发送访问数据的请求,返回所需的信息。
Python 使得使用 API 变得相对容易,并且可以使用几个不同的库来进行 API 调用。对于简单的 API 操作,可以考虑将 API 文件上传到云中。https://upload.io/cloudinary-alternative背后的团队建议上传你的 API 文件应该简单安全。在 Python 中进行 API 调用时,首先需要导入相关的库,并指定希望访问的 API 端点的 URL。根据您使用的 API,您可能还需要提供身份验证凭证。一旦进行了 API 调用,返回的数据将是 JSON 格式的,然后可以根据需要对其进行解析和处理。
在 Python 中进行 API 调用是一个相对简单的过程,但是你需要记住一些事情以确保一切顺利进行。首先,确保你已经安装了最新版本的 Python 解释器。其次,花一些时间熟悉您正在使用的 API,因为这将使您更容易理解返回的数据。最后,在部署代码之前一定要测试它,因为这将有助于避免任何潜在的问题。
在 Python 中使用 API 时,确保正确地验证请求是很重要的。毕竟,如果您没有正确的身份验证,您将无法访问您试图获取的数据。幸运的是,Python 中有几种不同的 API 认证方式。
使用 API 进行认证的一种常见方式是使用 HTTP 基本认证。使用这种方法,您可以在每次请求时提供您的用户名和密码。虽然这相对容易设置,但不是最安全的选择。如果您担心安全性,您可能会考虑使用 OAuth 令牌。
使用 OAuth,首先需要在服务器端生成一个令牌。一旦有了令牌,就可以在每个请求中包含它。它增加了一层额外的安全,因为如果需要的话,令牌可以很容易地被撤销。如果您想获得更高的安全性,还可以在 API 调用中使用双因素身份验证。除了用户名和密码之外,您还需要输入一个发送到您手机或电子邮件的代码。
无论您选择哪种身份验证方法,确保您安全地处理您的凭据都很重要。这意味着将它们存储在一个安全的地方,不与任何不需要访问的人共享。
使用 API 的一个常见任务是处理错误。毕竟,即使是设计最好的 API 有时也会返回意想不到的结果。幸运的是,Python 的异常处理能力可以使处理错误变得更加容易。以下是在 Python 中使用 API 时使用异常的一些准则。
首先,清楚地理解什么是异常是很重要的。在 Python 中,异常是程序执行过程中出现的错误。当出现异常时,程序将停止运行,并显示一条错误消息。异常处理就是处理这些错误,使程序能够继续顺利运行。
Python 中有两种处理异常的方法:try/except 块和 Try/Except/Finally 块。Try/except 块用于捕获可能发生的特定错误,而 Try/Except/Finally 块用于捕获所有错误。确保根据您的需要使用合适的块。
使用异常处理有助于使你的代码更加健壮。但是,一定要明智地使用它,因为过多的异常处理会使您的代码更难阅读和理解。

我们通常使用 API 的宝贵资源之一来调用 API。这就是为什么大多数原料药都有比率限制,以防止过度使用和滥用。如果你是第一次使用 API的 ,了解这些速率限制是如何工作的以避免超过它们是很重要的。大多数 API 会限制在某个时间段内的请求数量。例如,GitHub API 的速率限制是每小时 60 个请求。如果您试图在一个小时内发出超过 60 个请求,您将会收到一条错误消息。一些 API 还使用“突发”,这允许您发出一定数量的超出限制的请求,只要它们随时间间隔开。例如,Twitter API 将允许您在 15 分钟内发出 100 个请求。因此,如果您在此期间尝试发出超过 100 个请求,您将会收到一条错误消息。理解这些速率限制是如何工作的对于有效地使用 API 是至关重要的。
要使用 API 进行认证,您需要知道它的基本 URL、用户名和密码。通过身份验证后,您可以使用适当的端点进行 API 调用,并传入必要的参数。如果您的请求导致错误,Python 将引发一个异常。一定要适当地处理这些异常,这样你的程序才不会崩溃。最后,注意 API 比率限制,确保不要超过它们。
原文:https://www.pythoncentral.io/fastapi-tutorial-for-beginners-the-resources-you-need/
虽然 Flask 是 2004 年愚人节的一个玩笑,而 Django 是同一时期《劳伦斯世界日报》的一个内部项目,但这两个 Python web 框架都获得了巨大的声望和流行。
然而,构建这些框架时的 Python 不同于今天的 Python。该语言的当代元素,如 ASGI 标准和异步执行,要么不流行,要么不存在。
这就是 FastAPI 的用武之地。
它是一个较新的 Python web 框架,建于 2018 年,融入了 Python 的现代特性。除了能够使用 ASGI 标准与客户机进行异步连接之外,它还可以使用 WSGI。
此外,FastAPI web 应用程序是用带有类型提示的干净代码编写的,异步函数可用于路由和端点。
顾名思义,FastAPI 的主要用途之一是构建 API 端点。有了这个框架,构建端点就像以 JSON 的形式返回 Python 字典的数据一样简单。或者,您可以使用 OpenAPI 标准,它包括一个交互式的 Swagger UI。
但是 FastAPI 并不局限于 API,它可以用来完成 web 框架可以完成的任何任务——从交付网页到服务应用程序。
在本帖中,我们将讨论如何安装 FastAPI 以及使用它的基本原则。
FastAPI 是一个高性能的 web 框架,它使用标准的类型提示来帮助构建 Python APIs。其主要特点包括:
- 易于学习: 框架的简单本质使得阅读文档的时间最小化。
- 直观: FastAPI 提供优秀的编辑器支持,完善你的代码,减少你需要投入调试的时间。
- 减少 bug:由于使用起来相当直截了当,所以开发者犯错的几率较低。
- 健壮: 它有助于生产就绪代码和自动交互文档。
- 速度: 号称极致性能,框架堪比 NodeJS 和 Go。此外,它支持快速开发。
- 基于标准: 基于 JSON Schema、open API 等开放 API 标准。
除此之外,它最大限度地减少了代码重复。总的来说,该框架优化了开发人员的体验,并通过在默认情况下实施**实践,使他们能够有效地编码。
建议在新的虚拟环境中启动 FastAPI 项目,因为框架会在没有提示的情况下安装许多组件。要安装框架的核心组件,可以运行下面的命令:
讯享网
除此之外,你需要安装一个 ASGI 服务器来执行本地测试。该框架与 Uvicorn 无缝协作。因此,我们将在示例中使用该服务器。
要安装 Uvicorn,您可以运行命令:
上面的命令安装一组**的组件,包括 C 库。如果想安装一个只使用 Python 的最小版本,可以运行:
讯享网
下面是一个基本的 FastAPI 应用程序的样子:
要运行这个应用程序,您可以将代码保存在一个文本文件中,并将其命名为 main.py,然后使用以下命令在您的虚拟环境中运行它:
讯享网
虽然上述命令中的“uvicorn”部分是不言自明的,但是“app”是一个可以用于 ASGI 服务器的对象。如果您想使用 WSGI,您可以使用 ASGI-to-WSGI 适配器。但是,最好使用 ASGI。
当应用程序开始运行时,进入 localhost:8000,默认的 Uvicorn 测试服务器。您将看到浏览器上显示的(" greeting":" Hello coders "),这是字典生成的有效 JSON 响应。
现在您可以看出使用 FastAPI 从一个端点交付 JSON 是多么容易。想法很清楚——您必须创建一个路由并返回一个 Python 字典,它将被序列化为 JSON,而不需要您的干预。
也就是说,序列化复杂的数据类型需要一些工作,我们将在后面的文章中详细讨论。
如果你以前使用过 Flask 这样的系统,你会很容易认出 FastAPI 应用的大致轮廓:
- ASGI/WSGI 服务器导入应用程序对象并使用它来运行应用程序。
- 你可以使用装饰器给应用程序添加路线。例如,@ app . get(“/”)decorator 在网站的根位置生成一个 GET 方法路由,包装后的函数返回结果。
但是对于熟悉框架工作的人来说,一些不同之处会很明显。首先,路由函数是异步的,这意味着任何部署的异步组件——比如异步数据库中间件连接——都可以在函数中运行。
需要注意的是,如果你愿意,你可以使用常规的同步功能。如果您有一个使用大量计算能力的操作,而不是一个等待 I/O 的操作(这是 async 的**用例),那么最好使用 sync 函数,让 FastAPI 为您做一些工作。
在其他情况下,使用异步函数是正确的方法。
使用@app decorator,您可以设置路线的方法。您可以使用@app.get 或@app.post 来完成此操作。post、get、DELETE 和 PUT 方法就是这样使用的。不太为人所知的函数 HEAD、TRACE、PATCH 和 OPTIONS 也是这样使用的。
通过在一个函数上使用@app.get(“/”)和在另一个函数上使用@app.post(“/”)将路由函数包装在一起,也可以在一个路由上使用多种方法。
从 route 的路径中提取变量就像在将它们传递给 route 函数之前在 route 声明中定义它们一样简单,就像这样:
接下来,您可以使用 route 函数中的类型化声明从 URL 中提取查询参数。框架将自动检测这些声明:
讯享网
使用表单数据相对来说更复杂。您需要手动安装 Python 多部分库来解析表单数据。当您安装了这个库时,您可以使用一个类似于查询参数语法的语法:
上面代码中的表单对象从表单中取出指定的参数并向前传递。您必须记住,在声明中使用格式(…)意味着必须输入相应的参数,例如本例中的用户名。
另一方面,如果有一个可选的表单元素,比如上面例子中的 user_id,您可以将元素的默认值传递给表单。
JSON 是 FastAPI 中的默认响应类型,本文中的所有例子都会自动将数据序列化为 JSON。但是,您也可以返回其他响应。比如:
讯享网
fastapi . responses 模块是 FastAPI 最有用的模块之一,它支持大量的响应,包括:
- FileResponse: 从特定路径返回一个文件,异步流。
- PlainTextResponse 或 HTMLResponse: 文本以纯文本或 HTML 的形式返回。
- RedirectResponse: 重定向到特定的 URL。
- StreamingResponse: 接受一个生成器作为输入,并将结果传送给客户机。
除了使用上面列出的响应,您还可以使用通用的响应对象,并提供自定义的标题、媒体类型、状态代码和内容。
无论是设置 cookies 还是头来处理响应,都需要接受一个响应对象作为路由函数的参数:
从客户端检索 cookies 的工作方式类似于处理表单参数或查询的工作方式:
讯享网
您可以用。响应对象上的 set_cookie()方法:
虽然 Python 类型是可选的,但与大多数其他 Python 框架不同,FastAPI 坚持使用类型。这个框架利用 Pydantic 库来验证提交的数据,不需要您编写逻辑来完成验证。
让我们仔细看看 Pydantic 库,其中包含一些验证传入 JSON 的代码:
讯享网
上面的代码通过 name、year、rating 和 tags 字段接受 POST 上的 JSON 数据,而不是 HTML。接下来,验证字段的类型。
OpenAPI 是一种 JSON 格式的标准,用于创建 API 端点。客户端可以读取端点的 OpenAPI 定义,并自动识别站点 API 传输的数据的模式。
如果使用 FastAPI,它会自动为端点生成所需的 OpenAPI 定义。例如,如果您在 openapi 站点的根目录访问/openapi.json,您将收到一个 json 文件,它描述了每个端点以及它可以接收和返回的数据。
FastAPI 的另一个好处是它自动为你的 API 创建文档接口。你可以通过网络界面与他们互动。此外,框架附带了钩子,允许您扩展或修改自动生成的模式。它还允许您有条件地生成模式或完全禁用它。
原文:https://www.pythoncentral.io/find-remove-node-linked-lists/
要了解单链表,你应该知道:
- Python 3
- OOP 概念
- 单链表——插入节点并打印节点
在上一个教程中,我们讨论了什么是单链表,如何添加一个节点以及如何打印所有的节点。如果您还没有阅读,我们强烈建议您先阅读,因为我们将基于这些概念进行构建。
本教程是关于如何删除一个节点,以及如何知道一个特定的元素是否存在于链表中。这两种方法都属于linked list类。让我们一个一个来看这些。
像大多数数据结构一样,找到一个元素是否存在的唯一方法是遍历整个链表。注意,如果链表是排序的,我们可以使用二分搜索法。但是这里我们要考虑一个未排序的链表。其工作方式是,用户给我们一个元素,我们返回 真 如果我们找到其他元素,我们返回 假 。您也可以使用计数器并返回元素的索引(如果它存在的话)。
算法
- 设置指针到 头
- 比较curr . data与输入值:
- 如果相等,返回 真
- 否则,移动到下一个指针
- 重复步骤 1-2,直到找到元素或到达链表的末尾
代码
现在你知道如何找到一个节点,我们可以用它来删除一个节点。同样,有几种方法可以做到这一点。您可以删除第一个节点,也可以通过维护一个指向链表最后一个节点的尾指针来删除最后一个节点。我们在这里讨论的方法是,我们从用户那里获得一个值,在链表中找到这个元素,如果它存在,就删除它。让用户知道元素是否被成功移除是非常重要的。为此,我们返回 真 为成功,返回 假 否则。记得将 大小 属性减 1。
我们把要删除的节点称为当前节点。其思想是将前一个节点的 next 指向当前节点的下一个节点。例如,假设我们想从给定的链表中删除 4:
讯享网
我们让 3 的下一个节点指向 4 的下一个节点,也就是 5。
假设我们想要删除 3 个
我们让头部指针指向 3 的下一个,也就是 5。
注意:要在当前节点的下一个节点和前一个节点之间建立连接,跟踪前一个节点是很重要的。
算法
- 有两个指针:
- 当前 - 最初 分 到 头
- prev - 最初指向无
- 如果输入值与curr:的数据匹配
- 检查 上一张 是否存在:
- 如果是,则将 的下一个节点【上一个 设置为 的下一个节点
- 如果没有,只需将指向下一个节点(当你想删除第一个节点时就会出现这种情况)
- 减量 大小 减 1
- 返回*真实 *
- 检查 上一张 是否存在:
- 如果输入值与curr:的数据不匹配
- 通过前进到下一个节点
- 指向 前一 到 当前
- 将 当前 指向 当前 的下一个节点
- 通过前进到下一个节点
- 重复步骤 1-3,直到链表结束
- 如果到达链表的末尾,则返回 False 表示链表中没有元素匹配输入的值
代码
讯享网
本教程到此结束。在以后的教程中,我们将会看到如何反转一个单链表。快乐的蟒蛇!
原文:https://www.pythoncentral.io/finding-duplicate-files-with-python/
有时,我们需要在我们的文件系统或特定文件夹中找到重复的文件。在本教程中,我们将编写一个 Python 脚本来完成这个任务。这个脚本适用于 Python 3.x。
该程序将接收一个文件夹或文件夹列表进行扫描,然后将遍历给定的目录,并在文件夹中找到重复的文件。
这个程序将为每个文件计算一个散列,允许我们找到重复的文件,即使它们的名字不同。我们找到的所有文件都将被存储在一个字典中,散列作为键,文件的路径作为值:。
开始,和图书馆:
然后我们需要一个函数来计算给定文件的 MD5 散列。该函数接收文件的路径,并返回该文件的十六进制摘要:
讯享网
现在我们需要一个函数来扫描目录中的重复文件:
函数使用来遍历给定的目录。如果你需要一个更全面的指南,请看一下如何在 Python 中遍历目录树的文章。函数只返回文件名,所以我们使用来获取文件的完整路径。然后我们将得到文件的散列,并将其存储到字典中。
当完成遍历目录时,它返回一个包含重复文件的字典。如果我们要遍历几个目录,我们需要一个方法来合并两个字典:
讯享网
获取两个字典,遍历第二个字典,检查第一个字典中是否存在该键,如果存在,该方法将第二个字典中的值追加到第一个字典中的值。如果该键不存在,它将把它存储在第一个字典中。在方法的最后,第一个字典包含所有的信息。
为了能够从命令行运行这个脚本,我们需要接收文件夹作为参数,然后为每个文件夹调用:
函数验证给定的文件夹是否存在于文件系统中。要运行这个脚本,请使用。最后,我们需要一种打印结果的方法:
讯享网
将所有东西放在一起:
原文:https://www.pythoncentral.io/fun-with-python-function-parameters/
事实上,每种编程语言都有函数和过程,一种从程序的不同位置分离出可以多次调用的代码块的方法,以及一种向它们传递参数的方法。Python 也不例外,所以我们将快速浏览一下大多数语言都有的标准内容,然后看看 Python 提供的一些很酷的东西。
这是一个非常简单的函数:
讯享网
使用时,我们会得到以下内容:
该函数有 3 个位置参数(每个参数在被调用时获取传递给该函数的下一个值——获取第一个值(1),获取第二个值(2),依此类推)。
命名 Python 函数参数(带默认值)
Python 还支持命名的参数,这样当一个函数被调用时,参数可以通过名称显式赋值。这些通常用于实现默认值或可选值。例如:
讯享网
使用该函数可以得到以下结果:
在这个例子中,是可选的——如果在调用函数时没有指定,它将获得默认值。
潜在的 Python 函数参数问题
要记住的一点是,默认值是在函数编译时计算的,如果值是可变的,这是一个重要的区别。下面的行为可能不是我们想要的:
讯享网
使用该功能时:
发生这种情况是因为默认值(一个空列表)在函数编译时被求值一次,然后在每次调用函数时被重用。为了在每次调用中得到一个空列表,代码需要写成这样:
讯享网
使用该函数时,我们得到:
Python 函数参数顺序
与位置参数不同,命名参数的指定顺序无关紧要:
讯享网
使用时,我们会得到以下内容:
不同寻常的是,Python 还允许通过名称来指定位置参数:
讯享网
使用时,我们会得到以下内容:
这里有一个更复杂的例子:
讯享网
使用时,我们会得到以下内容:
这看起来确实令人困惑,但是理解它如何工作的关键是要认识到函数的参数列表是一个字典(一组键/值对)。Python 首先匹配位置参数,然后分配函数调用中指定的任何命名参数。
变量 Python 函数参数表
当您开始查看变量参数列表时,Python 的酷就真正开始了。您甚至可以在不知道将传入什么参数的情况下编写函数!
在下面的函数中, vals 参数前面的星号表示任何其他位置参数。
讯享网
使用该函数时,我们得到:
我们在函数调用中指定的第一个位置值被赋予函数中的第一个参数(),然后所有剩余的位置值被放入一个元组中并被分配给 val。然后我们遍历这些值,寻找任何小于临界值的值。
我们也可以用命名参数做同样的事情。下面 dict 参数前面的双星号表示任何其他命名的参数。这一次,Python 将把它们作为字典中的键/值对提供给我们。
讯享网
使用该函数时,我们得到:
请注意,在最后一个示例中,这些值并没有按照在函数调用中指定的顺序打印出来。这是因为这些额外命名的参数是在字典中传递的,字典是一个无序的数据结构。
一个真实世界的例子
那么,你会用这些做什么呢?例如,程序通常会从一个模板生成消息,该模板具有占位符,用于在运行时插入值。例如:
您好{name}。您的帐户余额为{1},您还有{2}可用点数。
下面的函数使用这样一个模板和一组参数来替换占位符。
讯享网
这就是它的作用:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/145916.html