Python 开发中有哪些高级技巧

供稿:hz-xin.com     日期:2025-01-14
Python 开发中有哪些高级技巧

技巧没有大用, 关系是思想与概念。 学得越多,技巧忘记得越多, 简单的深刻的道理则会陪伴你一生。

我自己在python中,如果说技巧,就是教程上说的,list的那些用法, dict, defaultdict, collection, set, array, numpy, blist, event, socket, cython, __init__, __all__, __doc__, keyerror还有些常用的库。 这些标准教程上的东西,你学会了,给自己帮助很大。 也都是技巧 。

偶尔用一用lambda, map, filter, zip就足够了。 可以缩小代码量。

多用multiprocess少用thread和threading。 有时间可以研究一下stackless python, twist,它的思想很受启发。 tornado, django, jinja2等都需要学一下,简单实用,强大。

最近流行的openstack也要看一下。zope这东西太古老了,如果你真有时间还是可以借鉴一下。
python2, python3都要学习。 不能一味抵制python3, 其中有很多好的思想。


GIL不是不可逾越的。


如果喜欢windows就学一学win32 api, 反之QT, wxwindows, gtk都可以看一看。 html5, node.js, javascript, bootstrap都是好的GUI工具。 要想快速开发, 很失望的说,只有在windows平台下可以找到可视化的快速开发工具。 C#, delphi, 都是很难超越的东西。

python用得人多, 用好的人也多。 但是水准高,思想又好,编程也强大,可以创造性的做产品的人不多。 相反,模仿别人, 借鉴其它的库,拿来主义,这是python的特点。 swig这个东西学一学。

以后你还会依赖其它的语言,需要的时候就多学一学其它的语言,甚至 ruby也是必要的。 java, c++, haskell, go, lua, javascript, php, scala.

但是有一天,python一定会衍生出不一样的版本。越超所有的语言,我相信。 但是不是最近。 这些所有的语言都没有挑战性。新的语言会带来新的设计模式。

我列出来几个,不知道算不算高级技巧,但是我个人觉得非常有用。

1. 善用迭代器

迭代器在很多语言里面都
有,而在 Python
里适当的场景用迭代器会非常的“爽”。一来因为迭代器每次产生一个对象,适当使用能有效节省内存;二来它能达到部分“延迟计算”的效果。除此以外,因为
Generator (yield 关键字)和 Generator Expression 的存在,有时候使用迭代器能提升代码可读性。


例,itertools.islice((calculate_for_value(v) for v in values), 0, 12) 能够只在
[0, 12) 范围内计算,而且是延迟计算的,即迭代到了那个对象才去计算。又如 any(i % 3 == 0 for i in
numbers) 能够找出 numbers 里第一个能被 3 整除的值,因为里面是个 Generator
Expression(迭代器的一种),所以找出以后 any 函数就会立即返回,并不需要对整个 numbers 列表计算 i % 3。

顺带推荐下这个库 erikrose/more-itertools ,里面包含了很多实用的迭代器函数,是对标准库 itertools 的一个很不错的补充。

2. 善用描述符(Descriptor)

Python
的描述符是对“属性”的抽象,一个描述符定义成类属性以后,能够控制这个类的实例上同名实例属性的 get、set、delete 行为,比
__getattr__ 这样的实例级 magic method 有更细的粒度,并且更容易复用。这个文档有简单的描述 Descriptor HowTo Guide ,可见 Python 的“实例方法”、@property 全由它实现,一些第三方库也有用到(例如 SQLAlchemy 的 Column、WTForms 的 Field 乃至 Python 3.4 新增的 enum.Enum 类型)。

利用描述符特性,可以在业务代码中实现一些非常方便的定制,例如可以自己实现一个能缓存返回值的 cached_property(也可以不用自己实现,直接用 Werkzeug 的)。

3. 尽量不要用反射技巧去 fight with language

我个人的一个观点:用一门编程语言就应该入乡随俗,fight with language 的事情不要做太多为好。因为闭门造的轮子很难造圆,更何况站在语言使用者的层面去和语言的设计搏击实在很不自量力。


题问的是“高级技巧”,那么对于一个动态语言,反射当然算高级技巧的。可是我见过一些利用 Python 的反射来扫描出一些包中所有 .py
文件然后自动 import 包下的所有模块的。且不说这个做法破坏了 Python “模块即是命名空间” 和 lazy import
的设定,光是从“正确性”来说就有一堆问题。这个做法仅仅考虑到了模块文件系统中的场景,没考虑到可能模块在一个 zip
中的情况。就算再增强一下实现,考虑上 zip 的 import,那 Python 还有 PEP 302 定义的 Import Hook 用法呢,被这样一 hack 就完全没法用了。这种 fight with language 的做法很难去做到真正的“正确”。

所以我觉得还有一个 Python 的技巧就是想使用“高级技巧”的时候谨慎地考虑使用。静
下来想想自己是不是在 fight with language 了,如果是的话,建议停手。要不就入乡随俗,要不就认真考虑一下 Python
是不是真的有值得去改进的地方。后者是需要经过很多深思熟虑的,不是 10 分钟的想法就够。如果后者的回答真的是“是”,我想可能正确的做法是写一个
PEP 然后和社区讨论,看能否将改进直接施于 Python 未来的版本之上,而不是在自己的代码里用一个看似高级技巧实是丑陋的 hack
的实现来对抗语言本身。

我列出来几个,不知道算不算高级技巧,但是我个人觉得非常有用。

1. 善用迭代器

迭代器在很多语言里面都有,而在 Python里适当的场景用迭代器会非常的“爽”。一来因为迭代器每次产生一个对象,适当使用能有效节省内存;二来它能达到部分“延迟计算”的效果。除此以外,因为 Generator (yield 关键字)和 Generator Expression 的存在,有时候使用迭代器能提升代码可读性。

举例,itertools.islice((calculate_for_value(v) for v in values), 0, 12) 能够只在
[0, 12) 范围内计算,而且是延迟计算的,即迭代到了那个对象才去计算。又如 any(i % 3 == 0 for i in
numbers) 能够找出 numbers 里第一个能被 3 整除的值,因为里面是个 Generator
Expression(迭代器的一种),所以找出以后 any 函数就会立即返回,并不需要对整个 numbers 列表计算 i % 3。

顺带推荐下这个库 erikrose/more-itertools ,里面包含了很多实用的迭代器函数,是对标准库 itertools 的一个很不错的补充。

2. 善用描述符(Descriptor)

Python 的描述符是对“属性”的抽象,一个描述符定义成类属性以后,能够控制这个类的实例上同名实例属性的 get、set、delete 行为,比 __getattr__ 这样的实例级 magic method 有更细的粒度,并且更容易复用。这个文档有简单的描述 Descriptor HowTo Guide ,可见 Python 的“实例方法”、@property 全由它实现,一些第三方库也有用到(例如 SQLAlchemy 的 Column、WTForms 的 Field 乃至 Python 3.4 新增的 enum.Enum 类型)。

利用描述符特性,可以在业务代码中实现一些非常方便的定制,例如可以自己实现一个能缓存返回值的 cached_property(也可以不用自己实现,直接用 Werkzeug 的)。

3. 尽量不要用反射技巧去 fight with language

我个人的一个观点:用一门编程语言就应该入乡随俗,fight with language 的事情不要做太多为好。因为闭门造的轮子很难造圆,更何况站在语言使用者的层面去和语言的设计搏击实在很不自量力。

问题问的是“高级技巧”,那么对于一个动态语言,反射当然算高级技巧的。可是我见过一些利用 Python 的反射来扫描出一些包中所有 .py 文件然后自动 import 包下的所有模块的。且不说这个做法破坏了 Python “模块即是命名空间” 和 lazy import 的设定,光是从“正确性”来说就有一堆问题。这个做法仅仅考虑到了模块文件系统中的场景,没考虑到可能模块在一个 zip 中的情况。就算再增强一下实现,考虑上 zip 的 import,那 Python 还有 PEP 302 定义的 Import Hook 用法呢,被这样一 hack 就完全没法用了。这种 fight with language 的做法很难去做到真正的“正确”。

所以我觉得还有一个 Python 的技巧就是想使用“高级技巧”的时候谨慎地考虑使用。静下来想想自己是不是在 fight with language 了,如果是的话,建议停手。要不就入乡随俗,要不就认真考虑一下 Python 是不是真的有值得去改进的地方。后者是需要经过很多深思熟虑的,不是 10 分钟的想法就够。如果后者的回答真的是“是”,我想可能正确的做法是写一个 PEP 然后和社区讨论,看能否将改进直接施于 Python 未来的版本之上,而不是在自己的代码里用一个看似高级技巧实是丑陋的 hack 的实现来对抗语言本身。

-------------------------------------------------------------------------------

其他的一些 Python 特色的技巧,例如 decorator、contextmanager 等,因为各路 Python 开发者基本都很熟悉,我就没列出来了。

-------------------------------------------------------------------------------

掌握Python输入输出:从键盘到文件的全面指南
2. 文件操作的舞台文件操作在Python中占据重要地位。使用open()函数,我们可以打开文件,进行读写操作。例如,读取文件内容:with open('example.txt', 'r') as file:,内容被读取并显示;写入文本到新文件,如with open('output.txt', 'w') as file:,"这是写入的文本。"。文件操作的高级技巧...

深入解析与应用:Python中XML的高效处理技巧
不论你的需求是解析网络上获取的XML数据、生成XML格式的配置文件,还是处理复杂的XML文档,本文都将为你提供必要的知识和技巧。我们的目标是让读者能够在实际开发中灵活运用这些技术,有效地解决实际问题。接下来,让我们从XML的基础知识开始,逐步深入到具体的处理技巧中。XML基础知识回顾在深入探讨Python中...

学python最想要提升的是哪些地方
当然,爬虫过程中也会经历一些绝望啊,比如被网站封IP、比如各种奇怪的验证码、userAgent访问限制、各种动态加载等等。遇到这些反爬虫的手段,当然还需要一些高级的技巧来应对,常规的比如访问频率控制、使用代理IP池、抓包、验证码的OCR处理等等。往往网站在高效开发和反爬虫之间会偏向前者,这也为爬虫提供了...

深入解析与应用:Python中XML的高效处理技巧
不论是网络获取的XML数据解析,配置文件生成,还是复杂XML文档处理,本文将提供必要的知识和技巧,让读者在实际开发中灵活运用这些技术,有效解决实际问题。接下来,我们从XML基础知识开始,逐步深入到Python处理XML数据的技术和方法。XML基础知识回顾 在深入探讨Python中XML数据处理之前,回顾XML基础结构和特性将...

Python pandas 使用技巧大全(收藏!)
Python pandas 使用技巧大全Pandas是数据分析的强大工具,其特点深受开发者Wes McKinney在《利用Python进行数据分析》一书中的阐述。本文将带你深入理解并掌握Pandas的常用技巧,从数据导入导出到高级操作。数据处理基础首先,熟悉Jupyter环境,通过优化运算加速Pandas的处理。在数据预处理环节,能快速合并多个Excel...

Python中的with语句和上下文管理器
通过本文的介绍,深入了解了with语句的原理、基本用法以及高级用法,并探讨了with语句在文件读写、数据库连接和网络请求等方面的实际应用场景。with语句是Python中一种强大且方便的资源管理工具,可以有效避免资源泄漏和手动管理的烦恼,是Python开发中的重要技巧之一。通过合理利用with语句,可以优雅地管理各种...

毕业生必看Python爬虫上手技巧
Python快速上手的7大技巧 Python快速上手爬虫的7大技巧 1、基本抓取网页 get方法 post方法 2、使用代理IP 在开发爬虫过程中经常会遇到IP被封掉的情况,这时就需要用到 代理IP;在urllib 2包中有Proxy Handler类, 通过此类可以设置代理 访问网页,如下代码片段:3、Cookies处理 cookies是某些网站为了辨别...

python中有哪些你觉得超级牛的模块?
rich模块中的Console对象提供了丰富的函数,如print函数,允许用户在项目中任意位置使用rich提供的功能。四、Rich Inspect rich的inspect方法可以查看Python对象的详细信息。例如,对函数、模块和字典进行inspect:此外,rich还提供了许多工具,如日志、进度条、表格、树状图的渲染。基于rich开发的软件、程序也...

从基础到高级:全面探索Python的*args和**kwargs
接下来,我们将深入探讨*args和**kwargs的用法与技巧,包括基本用法、高级应用和具体场景。args的用法与技巧*args允许函数接收任意数量的位置参数,这些参数被存储为元组。它特别适用于处理不确定数量的输入参数。通过*args,开发者可以创建通用函数或API,适应不同数量的输入。示例代码 pythondef example_...

python数据结构的知识点有哪些?
使用Python》、《Python数据分析基础》、《Python算法基础:数据结构与算法分析》和《Python高级编程(第2版)》。掌握Python数据结构的知识,对于提高编程技能、优化算法设计以及在机器学习等领域应用具有重要意义。Python的高效数据操作能力使其在众多技术领域中大放异彩,学习这一主题对开发者而言不可或缺。