百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

如何编写快速且更惯用的 Python 代码

off999 2025-08-03 07:30 38 浏览 0 评论

Python因其可读性而受到称赞。 这使它成为一种很好的第一语言,也是脚本和原型设计的流行选择。

在这篇文章中,我们将研究一些可以使您的 Python 代码更具可读性和惯用性的技术。 我不仅仅是 python 专家,这些技巧对我编写好的 python 有很大帮助,我希望这些对你也有帮助。 如果您有更多想法,我们很乐意在下面的评论部分中讨论它们..


提示 1. 当重复设置和拆卸时,您应该使用上下文管理器,以便您可以使用 with 语句

每当使用涉及资源设置的文件和数据库等外部资源时,检查任何异常,然后最终关闭资源(拆除),而不是使用天真的使用尝试的天真方法,除了最后模式使用上下文管理器。


大多数情况下,当您使用数据库、锁和文件时,标准库会提供可以通过 with 语句使用的上下文管理器。 让我们举一个从文件读取的简单例子

# non pythonic waytry :
  file  = open("text.txt")
  lines = files.readlines()
except Exception as e:
  print(e)
finally :
  file.close()# pythonic way much concise, and less bug pronewith open('text.txt') as f :
    f.readlines()


如您所见,我们不再需要设置文件并关闭它。 这种方式不仅简短,而且可以正确传达业务逻辑。 我们不必自己进行设置和拆卸,这使代码不易出错

request 模块的 Session 类实现了 enter 和 exit 方法,当您需要在请求之间保留 cookie、想要向同一主机发出多个请求或只想保持 TCP 连接处于活动状态时,可以将其用作上下文管理器。

import requests
with requests.Session() as sess:
sess.request(method=method, url=url)


提示 2. 停止手动添加字符串,使用 str.join 代替。

字符串对象在 python 中是不可变的,任何连接操作都会创建一个新字符串,逐个字符复制旧字符串,然后附加要连接的新字符串。

假设我们有一个名称列表,我们需要将它们连接成一个用逗号分隔的字符串。

这样做的天真的方法是:

names = ["aabid","john","doe","mathew"]
new_string=""for name in names :   new_string.append(name+",")


虽然这种方法看起来很简单。 但是正如我在上面告诉你的那样,字符串在 python 中是不可变的,上面的算法有一个二次运行时,如果名称的长度变大,就会产生问题。

但别担心,有一种更好、更简单、更 Python 的方式可以通过线性运行时实现这一点,那就是 str.join()。

  • str.join() 将可迭代对象作为参数并返回一个字符串,该字符串是可迭代对象中所有字符串对象的串联。
names = ["aabid","john","doe","mathew"]new_string = ",".join(names)


Tip 3. 充分利用魔法方法(dunder methods)

如果您在 python 中使用过类。 您还可以使用 init() 方法来初始化类状态,这是一个 dunder 或魔法方法。 魔术方法有一个双下划线作为前缀作为后缀,这就是为什么它们也被称为 dunder 方法

Python 使用“魔法方法”这个词,因为这些方法真的为你的程序带来了魔法。 使用 Python 的魔法方法的最大优势之一是它们提供了一种简单的方法来使对象表现得像内置类型。 这意味着您可以避免执行基本运算符的丑陋、违反直觉和非标准的方式。

假设我们有一个 Stack 类(它实现了 Stack LIFO 数据结构),我们希望我们知道堆栈中的项目数或长度。 如果您来自 java 或任何其他语言。 我可能会考虑添加 getLength() 方法来实现相同的目的。

class Stack :    # basic  implementation
    ...    def getLength(self) :
        pass

实现非常简单,但我们的用户需要记住 getLength 函数。


有一种更 Pythonic 的方式来获取序列的长度,你知道它的 len() 。 要为我们的类实现 len() 方法,我们将使用 dunder len() 方法。 请记住,dunder 方法不应该直接从代码中调用,而是解释器在下面调用它们。 在这个内置 len() 。

class Stack :    # basic implementation    ...    def __len__(self) :        return len(self.items)foo = Stack()# now we can use len to check the no of items in Stack foolength = len(foo)


提示 4. 不要使用 @property 装饰器创建 getter 和 setter

假设您有一个类 Book,其中包含字段 author 和 name。 您希望该字段是只读的,这样您的用户就不会更改一本书的作者。

一种方法是将作者存储在私有变量中并定义方法 getAuthor() 来检索它。

# non pythonicclass Book :
    def __init__(self,name,author):
        self.name = name
        self.__author = author    def getAuthor(self) :
        return self.__author
book1 = Book("Clean Code" , "Uncle Bob" )book.getAuthor()# >> Uncle Bob

虽然上述工作完全正常。 但是有一个更好的方法,使用 @property 装饰器。


Python 为我们提供了一个内置的 @property 装饰器,它使 getter 和 setter 在面向对象编程中的使用变得更加容易。


默认情况下,用 @property 修饰的方法是只读的,可以使用 object.property 表示法访问

# pythonic way using @property decoratorsclass Book :
    def __init__(self,name,author):
        self.name = name
        self.__author = author    @property
    def author(self) :
        return self.__author
book1 = Book("Clean Code" , "Uncle Bob" )print(book.author)# >> Uncle Bob

这并没有在这里结束,如果将来需求发生变化,并且只有当作者的名称以“S”开头时才允许您改变作者怎么办(听起来很傻,但这是一个很好的例子)


非 Pythonic 方法是创建一个 setAuthor() 方法并验证其中的输入。 但是在 python 中有一个更好的方法,那就是 property.setter 装饰器,它允许你改变一个 property 。

class Book :
    def __init__(self,name,author):
        self.name = name
        self.__author = author    @property
    def author(self) :
        return self.__author    @author.setter
    def author(self,value):
        # business logic
        ....book1 = Book("Clean Code" , "Sebastian" )book.author# >> Sebastianbook.author = Seb


Tip 5. 使用 repr 获得漂亮的调试体验

根据官方文档,repr 用于计算对象的“官方”字符串表示,通常用于调试。

让我们创建一个 person 类并为其定义一个 repr 方法,该方法将返回对象的字符串表示形式。 理想情况下,表示应该是信息丰富的,并且可以用来重新创建具有相同值的对象。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age    def __repr__(self):
        rep = f'Person( "{self.name}" , {self.age}  )'
        return rep
# Let's make a Person object and print the results of repr()person = Person("John", 20)
print(person)#>>  Person("John", 20 )


提示 6. 正确使用自定义异常

在 python 中创建自定义异常非常容易。 但这并不意味着您应该在任何地方创建它们。

仅在遇到复杂错误时创建自定义异常。 就像假设你有一个购物车对象,它是一个结帐方法。 如果购物车是空的,你不希望结帐工作,所以在这里创建一个异常 CartEmpty 是有意义的。

不要在异常名称后面加上 Exception 。 我见过很多人(包括我)将他们的异常命名为 CartEmptyException。 这没有任何意义。 保持简单 CartEmpty 。

您不需要每次都自定义异常。 python中大约有137个异常。 利用这些。


提示 7. 不要害怕使用内置插件

Python 是一种功能强大的编程语言,具有许多内置功能,可让您用更少的代码完成更多工作。 例如,range() 函数允许您轻松创建数字列表,len() 函数返回字符串或列表的长度。

此外,Python 有许多库可用于简化数据分析和机器学习等任务。 例如,SciPy 库为线性代数、优化、集成等提供了模块。

Python 还拥有丰富的复杂数据结构集合,例如 heap、priory queues、dequeue、queue、orderedDict 等等。 与其重新发明轮子,不如尝试利用这些优势。 这些比您自己创建的方式更加优化和快速


提示 8. 使用 Comprehensions 代替循环。

列表推导式是一种创建列表的 Pythonic 方式。 它们比 for 循环更简洁易读,这就是为什么应该使用它们来代替原生 for 循环的原因。

列表推导的语法是:

  • [ if 条件下项目的表达式]

以下是创建 0 到 10 之间的偶数列表的列表推导示例:

[ x for x in range(10) if x%2==0]


Tip 9. 使用多变量赋值任意解包

Python 的多重赋值特性是大多数编程语言所缺乏的一个很好的特性。 在最简单的形式中,它看起来像这样:

a = b = "something"


这很好,因为它缩短并简化了代码。 但是,我很少使用它。 一个更实用的选择是将迭代解包成多个变量:

some_list = ["value1", "value2"]
first, second = some_list

这比使用索引为每个变量赋值更好


多变量赋值的另一个重要用例是在不使用临时变量的情况下交换变量。

# swapping a variable using a temporary  variablex= 10
y =20temp = x
x= y
y=tempprint(x)
# >> 20print(y)
# >>10# swapping variables using multiple assignmentx,y = 10,20x,y = y,x

该解决方案更加简洁易懂。


感谢您阅读到最后。 我很想听听您用来改进代码的技巧和技巧。

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: