社区
教程
Wiki
注册
登录
创作新主题
社区所有版块导航
Python
python开源
Django
Python
DjangoApp
pycharm
DATA
docker
Elasticsearch
分享
问与答
闲聊
招聘
翻译
创业
分享发现
分享创造
求职
区块链
支付之战
aigc
aigc
chatgpt
WEB开发
linux
MongoDB
Redis
DATABASE
NGINX
其他Web框架
web工具
zookeeper
tornado
NoSql
Bootstrap
js
peewee
Git
bottle
IE
MQ
Jquery
机器学习
机器学习算法
Python88.com
反馈
公告
社区推广
产品
短视频
印度
印度
一周十大热门主题
Docker for macOS版因失误导致被苹果拦截 附手动解决办法
【[1.3k星]DockerHub:国内Docker镜像源加速神-20250111141021
本周推荐的5个火火火的Github开源项目!
我常用几个实用的Python爬虫库,收藏~
机器人超级周:量产ChatGPT时刻已至
基于放射组学的机器学习术前预测临床 IA 期纯实性非小细胞肺癌的生存结局
完整课表出炉,开课倒计时2天!第三期运筹优化求解器/LLM决策科学/Python数据分析及在业界实际...
每月 GitHub 探索|9 款宝藏级开源项目,引领技术新潮流
新声年会将于本周四举行,长短剧、AIGC等4场圆桌5场演讲
地理荐书 | 《基于Python的GIS空间分析》
关注
Py学习
»
Python
5 个Python高级特性,让你成为Python高手
大数据文摘
• 1 年前 • 575 次点击
大数据文摘授权转载自数据派THU
作者:Bex T.
翻译:赵鉴开
校对:李洪君
你已经使用 Python 编程了一段时间,编写脚本并解决各种问题。是你的水平出色吗?你可能只是在不知不觉中利用了Python的高级特性。
从闭包(closure)到上下文管理器(context managers),本文给出一个Python高级特性的列表。你或许会发现,“我一直在使用它!”。
即使这些东西对你来说是新的,这份出色的列表也可以将你的技术提升到一个新的水平。
一、作用域
高级 Python 编程的一个关键方面是深入熟悉作用域的概念。
作用域定义了 Python 解释器在程序中查找名称(它可以指代任何东西,变量、函数或类)定义的顺序。Python 作用域遵循 LEGB 规则(本地、闭包、全局和内置作用域)。根据规则,当您访问一个名称时,解释器将按顺序在局部、封闭、全局和内置作用域中查找它。
让我们看一些例子来更好地理解每个层级。
例1:本地作用域
此处只在func函数中局部定义了x,在脚本的其他位置无法访问到x的定义。
例2:闭包作用域
闭包定义域介于局部定义和全局定义之间,是嵌套函数中出现的作用域。在上述例子中,x在outer_func函数本地定义,但嵌套其中的inner_func函数仍然可以访问到x变量。但需要注意,inner_func对于x变量只有只读权限,即使重新为x赋值也只在inner_func内部产生作用,在outer_func函数中x的赋值并不会改变。
(参考:https://qiwsir.github.io/2021/11/03/python-builtins-first/)
例3:全局作用域
此处,变量x和函数func都在全局定义,此二者可以在脚本的任何位置被访问。但如果要在更小的作用域修改全局变量,需要用global关键字指定全局变量,示例如下。
例4:内置作用域
内置作用域包括所有不需要显式导入语句的已定义的库、类、函数和变量。例如Python中的内置函数:print, len, range等;以及内置变量:str, int, float等。
二、函数闭包
作用域的定义决定了函数的闭包特性。默认情况下,函数运行完后会并不会有返回值,这意味着函数占用的内存都会被抹去 。
上面,我们将值3赋给x,但函数在执行后忘记了它。如果我们不想让它忘记x的值呢?
这就是函数闭包发挥作用的地方。通过在某个内部函数的封闭范围内定义变量,即使在函数返回之后,也可以将其存储在内部函数的内存中。
下面是一个简单的示例函数,用于计算它被执行的次数。
根据Python规则,我们应该在第一次执行后失去count变量。但由于它在内部函数的闭包中定义,它将一直保留在那里,直到关闭会话为止。
三、装饰器
除了count变量,函数闭包还有更多重要作用,其中之一是创建装饰器。装饰器是一种嵌套函数,可以添加到其他函数以增强甚至修改它们的行为。
如下所示,我们创建了一个缓存装饰器,它记住了函数的每个位置参数和关键字参数的状态。
stateful_function装饰器可以添加到需要在相同参数上重复使用的计算密集型函数中。例如,下面的斐波那契递归函数会返回序列中的第n个数字,如果我们调用刚才的装饰器,代码和结果如下:
第1000位数字仅耗时不到2秒!
如果我们不使用装饰器呢?就用第40位数字小试牛刀。
计算第40个数就用了21秒,在没有缓存的情况下,计算第1000个数字将花费几天时间。
四、生成器
生成器是Python中功能强大的构造,可以高效地处理大量数据。假设你有一个10GB的日志文件,记录了某个软件崩溃时的情况。为了找出问题所在,你必须在Python中高效地对其进行筛选。
最糟糕的方法是读取整个文件,但由于你一行一行地查看日志,所以不需要一次性读取全部10GB的数据,只需一次读取一小部分。这就是你可以使用生成器的地方
在上面,我们定义了一个生成器,每次只迭代日志文件中的1024行,因此最后的for循环非常高效。在for循环的每次迭代中,内存中只有1024行文件,先前的块在内存中用完即弃,而其余的块只在需要时加载。
生成器的另一个特性是能够使用next函数一次生成一个元素,即使是在循环之外。下面,我们将定义一个快速生成斐波那契数列的函数。
要创建生成器,只需调用一次该函数并在生成的对象上调用next函数。
五、上下文管理器
您一定已经使用上下文管理器很长时间了。它们允许开发人员有效地管理资源,如文件、数据库和网络连接。它们自动打开和关闭资源,从而生成清晰且无错误的代码。
但是,使用上下文管理器和编写自己的上下文管理器之间有很大的区别。如果处理得当,它们允许您在原始功能的基础上抽象出大量样板代码。
一个常见的自定义上下文管理器的例子是计时器,代码如下:
上面,我们定义了一个TimerContextManager类,它将作为未来的上下文管理器。它的__enter__方法定义了使用with关键字进入上下文时发生的情况。在本例中,__enter__方法 用于启动计时器;在__exit__中,我们离开上下文,停止计时器,并报告经过的时间。
以下是一个更复杂的示例,它可以锁定资源,使它们一次只能被一个进程使用。
原文标题:
5 Signs You've Become an Advanced Pythonista Without Even Realizing It
原文链接:
https://towardsdatascience.com/5-signs-youve-become-an-advanced-pythonista-without-even-realizing-it-2b1dd7ef57f3
编辑:黄继彦
校对:程安乐
点「在看」的人都变好看了哦!
Python社区是高质量的Python/Django开发社区
本文地址:
http://www.python88.com/topic/153150
575 次点击
登录后回复