当前位置: 首页 > 编程日记 > 正文

@程序员,Python 3还有哪些未Get的潜藏技能?| 技术头条

640?wx_fmt=jpeg


作者 | Vinko Kodžoman

翻译 | Monanfei

编辑 | 阿司匹林,Rachel


【导读】在 Python 3 推出后,人们开始逐步将基于Python 2 的代码迁移至 Python 3 。但在迁移过程中,很多代码都未能使用到 Python 3 提供的新功能。本文作者介绍了相关功能的介绍,包括字符串格式化处理、文件路径处理、类型提示、内置 LRU 缓存等等,帮助大家更好地利用 Python 3 书写代码。


由于 Python 2 即将退出历史的舞台,许多人都开始将 Python 2 的代码转换为 Python 3 ,但在这一修改过程中,人们似乎只是多加了几个括号,大多数人并没有注意到 Python 3 中激动人心的新功能。本文将介绍 Python 3 中一些有趣的功能,希望这些功能能够帮助大家更加轻松的解决一些问题。


注:文中的代码示例基于 Python 3.7 编写,为方便使用,在每个功能后面都列出了该功能所需的最低 Python 版本。


f-strings (3.6+)


对任何一种编程语言来说,字符串处理是一项很重要的内容,字符串处理往往是很多程序的基础部分。由于人工处理字符串非常繁琐,我们更希望用一种结构化的方法来处理它们。在 Python 中,我们一般使用 format 来进行结构化字符串处理,如下所示:


user = "Jane Doe"	
action = "buy"	log_message = 'User {} has logged in and did an action {}.'.format(	user,	action	
)	print(log_message)	
# User Jane Doe has logged in and did an action bu


除了 format 之外, Python 3 还提供了一个更加灵活的方法来处理字符串,那就是 f-string 。如下所示,我们用 f-string 来和实现上面代码相同的功能:


user = "Jane Doe"	
action = "buy"	log_message = f'User {user} has logged in and did an action {action}.'	
print(log_message)	
# User Jane Doe has logged in and did an action buy.


Pathlib (3.4+)


如果需要处理文件路径,我们可以使用 Python 3 中的 pathlib 库,使对文件路径的操作更加便捷。如果你对 pathlib 存在疑惑,可以参考这篇文章。下面提供了一个代码示例:


from pathlib import Path	root = Path('post_sub_folder')	
print(root)	
# post_sub_folder	path = root / 'happy_user'	
# Make the path absolute	
print(path.resolve())	
# /home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/post_sub_folder/happy_user


类型提示 (3.5+)


静态类型与动态类型是软件工程中的一个热门话题,Python 3 提供了支持 type hinting(类型提示)的方法,下面提供了一个示例:


def sentence_has_animal(sentence: str) -> bool:	return "animal" in sentence	
sentence_has_animal("Donald had a farm without animals")	# True


枚举 (3.4+)


Python 3 中的 Enum 类支持枚举功能,可以使我们的程序变得更加简洁。 Enum 是一种便捷的变量列表的打包方式,使用该方法能够避免多个变量在代码各处分布,使代码显得杂乱无章。


from enum import Enum, auto	class Monster(Enum):	ZOMBIE = auto()	WARRIOR = auto()	BEAR = auto()	print(Monster.ZOMBIE)	
# Monster.ZOMBIE

枚举是一个符号集合,每个符号都和唯一的变量对应。通过使用枚举,我们可以通过符号标识来比较各个成员,我们还可以对枚举本身进行迭代。


https://docs.python.org/3/library/enum.html


for monster in Monster:	print(monster)	# Monster.ZOMBIE	
# Monster.WARRIOR	
# Monster.BEAR


内置的 LRU 缓存 (3.2+)


在现如今使用的硬件和软件中,缓存无所不在。Python 3 通过 lru_cache 来使用 LRU (Least Recently Used) 缓存。


下面的代码定义了一个斐波拉契函数,由于该函数的运算需要多次递归,每次递归都会执行相同的工作,因此使用缓存能够加速它的计算。


import time	def fib(number: int) -> int:	if number == 0: return 0	if number == 1: return 1	return fib(number-1) + fib(number-2)	start = time.time()	
fib(40)	
print(f'Duration: {time.time() - start}s')	
# Duration: 30.684099674224854s


我们可以使用 lru_cache 来优化该运算。这种优化极技术称为 memoization ,它能够把执行时间从几秒缩减到几纳秒。


from functools import lru_cache	@lru_cache(maxsize=512)	
def fib_memoization(number: int) -> int:	if number == 0: return 0	if number == 1: return 1	return fib_memoization(number-1) + fib_memoization(number-2)	start = time.time()	
fib_memoization(40)	
print(f'Duration: {time.time() - start}s')	# Duration: 6.866455078125e-05s


扩展的可迭代解析功能(3.0+)


这里不做详细解释,直接贴出示例代码,具体解决可以参考这篇文档。


head, *body, tail = range(5)	
print(head, body, tail)	
# 0 [1, 2, 3] 4	py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split()	
print(py)	
print(filename)	
print(cmds)	
# python3.7	
# script.py	
# ['-n', '5', '-l', '15']	first, _, third, *_ = range(10)	
print(first, third)	
# 0 


数据类(3.7+)


Python 3 引入了数据类 (data class)。其装饰器会自动生成特征方法,例如 __init__() 和 __repr()__,这能够帮助减少样本代码的数量。在官方文档中,它们被称作 “具有默认值的可变命名元组” 。


class Armor:	def __init__(self, armor: float, description: str, level: int = 1):	self.armor = armor	self.level = level	self.description = description	def power(self) -> float:	return self.armor * self.level	armor = Armor(5.2, "Common armor.", 2)	
armor.power()	
# 10.4	print(armor)	
# <__main__.Armor object at 0x7fc4800e2cf8>


接来下我们使用数据类来实现上面的代码:


from dataclasses import dataclass	@dataclass	
class Armor:	armor: float	description: str	level: int = 1	def power(self) -> float:	return self.armor * self.level	armor = Armor(5.2, "Common armor.", 2)	
armor.power()	
# 10.4	print(armor)	
# Armor(armor=5.2, description='Common armor.', level=2


隐式命名空间包(3.3+)


构建Python代码有很多方法,其中一种就是在包(packages)中进行构建(即包含一个 __init__.py 文件的文件夹)。以下示例由 Python 的官方文档提供:


sound/                          Top-level package	__init__.py               Initialize the sound package	formats/                  Subpackage for file format conversions	__init__.py	wavread.py	wavwrite.py	aiffread.py	aiffwrite.py	auread.py	auwrite.py	...	effects/                  Subpackage for sound effects	__init__.py	echo.py	surround.py	reverse.py	...	filters/                  Subpackage for filters	__init__.py	equalizer.py	vocoder.py	karaoke.py	...


在 Python 2 中,上面的每个文件夹都必须有一个 __init__.py 文件,该文件用于将其所在文件夹转化为 Python 包。然而在 Python 3 中,通过使用隐式命名空间包(Implicit Namespace Package:https://www.python.org/dev/peps/pep-0420/),这些文件就不再需要了。


sound/                          Top-level package	__init__.py               Initialize the sound package	formats/                  Subpackage for file format conversions	wavread.py	wavwrite.py	aiffread.py	aiffwrite.py	auread.py	auwrite.py	...	effects/                  Subpackage for sound effects	echo.py	surround.py	reverse.py	...	filters/                  Subpackage for filters	equalizer.py	vocoder.py	karaoke.py	...


注:官方文档PEP 420 Specification 指出,对于一些常规的包,__init__.py 仍然是需要的 ,如果将该文件删除,就会把该 Python 包变成一个本地的命名空间包,这将会产生一些额外的限制,具体可以参考这篇文档。



Python3 中的新功能远远不止如此,大家可以进一步进行探索。本文列出的内容只是一些实用的功能,希望能够对大家有所帮助。


文中的代码链接:

https://github.com/Weenkus/DataWhatNow-Codes/blob/master/things_you_are_probably_not_using_in_python_3_but_should/python%203%20examples.ipynb


原文链接:

https://datawhatnow.com/things-you-are-probably-not-using-in-python-3-but-should/ 


(*本文由Python大本营编译,转载请联系微信1092722531)


CTA核心技术及应用峰会


5月25-27日,由中国IT社区CSDN与数字经济人才发展中心联合主办的第一届CTA核心技术及应用峰会将在杭州国际博览中心隆重召开,峰会将围绕人工智能领域,邀请技术领航者,与开发者共同探讨机器学习和知识图谱的前沿研究及应用。


更多重磅嘉宾请识别海报二维码查看点击阅读原文即刻抢购。添加小助手微信15101014297,备注“CTA”,了解票务以及会务详情。


640?wx_fmt=jpeg


推荐阅读

  • “搞垮” 微博服务器?每天上亿条用户推送是如何做到的

  • 百度宣布:搜索业务总裁向海龙离职,另回购10亿美元股份

  • AI画家——毕业设计大杀器之Flask

  • 干货 | 超实用的PyTorch常用代码段合集

  • 60K!刚面完Python!这个被Oracle裁掉的程序员求职刷爆全网!

  • 厉害!女学生偷师男子学校,变身区块链开发工程师

  • 真壕!腾讯员工平均月薪 7 万!

  • 如何使用「番茄法」高效的写算法题?

  • 深扒! 币安被盗的7074.18枚比特币去哪了?

  • 这家公司的 IoT ,你可千万别低估!


640?wx_fmt=png

点击阅读原文,了解CTA核心技术及应用峰会

相关文章:

【Qt】QtCreator中配置clang-format

1、安装clang-format sudo apt install clang-format2、添加插件Beautifier 在QtCreator–>Help–>About Plugins…中添加插件Beautifer,添加后要重启QtCreator ClangCodeModel是否需要不清楚?反正我添加了 3、配置Clang Format 在Tools --> Options…–>Beau…

DVWA提示Unable to connect to the database.

因为数据库更换了默认端口&#xff0c;所以得在DVWA也进行相应的设置&#xff0c;但是设置的位置错了&#xff0c;导致一直连接不上数据库。 后面看到注释才发现是这个设置仅限PostgreSQL/PGSQL使用&#xff0c;至于Mysql更换端口以后直接设置在server地址后面即可。 刷新一下&…

LINQ to SQL语句之 Count/Sum/Min/Max/Avg

Count/Sum/Min/Max/Avg操作符 适用场景&#xff1a;统计数据吧&#xff0c;比如统计一些数据的个数&#xff0c;求和&#xff0c;最小值&#xff0c;最大值&#xff0c;平均数。 Count 说明&#xff1a;返回集合中的元素个数&#xff0c;返回INT类型&#xff1b;不延迟。生成SQ…

【Qt】Qt再学习(十):鼠标拖拽(dragdrop)QGraphicsItem示例

1、QGraphicsItem实现拖拽源 实现方法,继承QGraphicsItem,重载鼠标按下、移动、释放事件处理函数 class ColorItem : public QGraphicsItem {... protected:void mousePressEvent(QGraphicsSceneMouseEvent *event) override;void mouseMoveEvent(QGraphicsSceneMouseEvent…

Java并发 -- JMM

文章基于jdk1.7&#xff0c;通过学习《Java并发编程的艺术》&#xff0c;对Java内存模型的理解 并发编程模型的两个关键问题 线程之间如何通信线程之间如何同步上面所说的线程指的是并发执行的活动实体。 线程之间的通信机制有两种&#xff1a;共享内存和消息传递 在共享内存的…

开源!mathAI手写拍照自动能解高数题,还不快试试?

作者 | 红色石头转载自 AI有道&#xff08;id&#xff1a;redstonewill)让我们不妨先来盘点下从 2016 年起过去三年间 Google I/O 开发者大会亮相的重磅 AI 产品&#xff1a;深度好玩&#xff01;文章开始红色石头先在草稿纸上写一道高数微积分题目给大家看看如何求解&#xf…

黄聪:IE6下用控制图片最大显示尺寸

div img { max-width:600px; width:600px; width:expression(document.body.clientWidth>600?"600px":"auto");overflow:hidden; } ◎ max-width:600px; 在IE7、FF等其他非IE浏览器下最大宽度为600px。但在IE6中无效。 ◎ width:600px; 在所有浏览器中…

漫画:有趣的海盗问题 (完整版)

————— 第二天 —————海盗分金币问题&#xff1a;有5个海盗&#xff0c;获得了100枚金币&#xff0c;于是他们要商量一个方法来分配金币。商议方式如下&#xff1a;1. 由5个海盗轮流提出分配方案。2. 如果超过半数海盗&#xff08;包括提出者&#xff09;同意该方案&…

【Qt】error: undefined reference to `vtable for MainWindow‘

1、问题描述 在写一个demo时,想尽量简单,就把MainWindow类的定义和实现都写在main.cpp中,结果编译时报错: main.cpp:-1: error: undefined reference to `vtable for MainWindow :-1: error: collect2.exe: error: ld returned 1 exit status2、原因分析 错误信息vtable…

Sql Server:创建用户并指定该用户只能看指定的视图

1&#xff0c;在sql server中选择好要操作的数据库2,--当前数据库创建角色 exec sp_addrole seeview--创建了一个数据库角色&#xff0c;名称为:[seeview]3,--分配视图权限 GRANT SELECT ON veiw TO [角色] --指定视图列表 指定seeview这个角色可以查看的视图表名称&#xff1…

10 款可以找回删除文件的好软件

电脑突然死机或者断电&#xff0c;硬盘数据丢失?U盘重要文件不小心删掉了? 电脑中毒,文件丢失或无法读取? 系统突然崩溃,重要文件丢失?使用计算机最怕的就是象以上这些突如其来的灾难性故障导致重要数据的丢失&#xff0c;误操作、计算机病毒的***和软、硬件故障等天灾人祸…

万万没想到,逛B站也能学编程了

作者 | 徐麟&#xff0c;某互联网公司数据分析狮转载自 | 数据森麟&#xff08;id&#xff1a;shujusenlin&#xff09;前言很多人提到B站&#xff0c;首先想到的就会是二次元或者鬼畜&#xff0c;上个月&#xff0c;我们公众号也发表了一篇关于B站鬼畜视频的文章&#xff1a;《…

【Qt】Qt再学习(十一):图形视图框架(Graphics View Framework)的一个小demo

1、简介 使用的主要类:QGraphicsTextItem、QGraphicsScene、QGraphicsView。 QGraphicsTextItem继承自QGraphicsObject,而QGraphicsObject继承自QObject和QGraphicsItem; QGraphicsItem可以是2D曲面上的图形项目,例如线条,矩形,文本甚至自定义项目,本例中演示的文本QGr…

国产海翼号水下滑翔机首次应用于北极科考

中国第九次北极科学考察队7月28日在白令海公海区域成功布放我国自主研发的“海翼”号水下滑翔机。这是我国自主研发的水下滑翔机首次在白令海布放&#xff0c;也是首次应用于中国北极科考。 北京时间28日5时23分&#xff0c;考察队队员们将“海翼”号水下滑翔机缓缓送入海中。在…

高性能网站性能优化与系统架构(ZT)

转载请保留出处&#xff1a;俊麟 Michael’s blog (http://space.itpub.net/7311285/viewspace-97) 我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;又在MOP处理过大型社区猫扑大杂烩的架构升级等工作&#xff0c;同时自…

非常全面的AutoML资源,看这个就够了!

整理 | Rachel责编 | 琥珀出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;深度学习的发展促进了相关应用的涌现。但是&#xff0c;深度学习模型往往具有非常大的参数搜索空间&#xff0c;为了保证模型的效果&#xff0c;经常需要机器学习专家耗费大量的时…

【Qt】Qt再学习(十二):QGraphicsItem

1、简介 QGraphicsItem是用于场景QGraphicsScene中在所有图形项的基类,它是一个纯虚类,不能直接使用。子类化QGraphicsItem后,需要重新实现图形项的几何形状、碰撞检测、绘画实现、事件处理。 常用图形项: 类名图形项QGraphicsEllipseItem椭圆QGraphicsLineItem直线QGrap…

一堆乱七八糟绝不正经的排序算法

原文 索引 猴子排序 钻石排序&#xff08;戴蒙德排序&#xff09; 恶魔排序 珠排序 地精排序&#xff08;怂货排序&#xff09; 智能设计排序 1. 猴子排序 &#xff08;提供者cy1306110516&#xff09; 猴子排序的思想源自于著名的无限猴子定理。 既然猴子们能敲出《哈姆雷…

好久没有更新了!

好久没有更新博客了&#xff0c;主要是因为本人在从事信息化监理行业&#xff0c;遇到了困惑的事情&#xff0c;不时地在问自己&#xff0c;选择这个行业&#xff0c;对吗&#xff1f; 从事这个行业&#xff0c;已经换了两家公司&#xff0c;对于信息化监理事业却秉承不同的理念…

多人开发情况下的字符串本地化

项目开发中&#xff0c;独立开发的还是少数。经常会有多人开发的情况&#xff0c;这种情况&#xff0c;如果多人同时操作本地化文件&#xff0c;极有可能会存在冲突。另一方面&#xff0c;我们又不希望自己的本地化文件受到对方的污染&#xff0c;也就是说&#xff0c;我们不希…

【Ubuntu】制作usb启动盘安装ubuntu18.04时报错:“failed to load ldlinux.c32”

1、问题描述 使用UltraISO制作ubuntu18.04操作系统的usb启动盘后&#xff0c;按照时报错&#xff1a; failed to load ldlinux.c32ubuntu16.04、ubuntu14.04没有遇到这个问题。 2、原因 未知 3、解决方法 参考博客 https://blog.csdn.net/tnaig/article/details/81139887…

清华AI学堂班:姚期智担任首席教授,2019年首批招收30人

整理 | 琥珀出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;清华流传一句话&#xff0c;半国英才聚清华&#xff0c;而清华一半英才在“姚班”。据不完全统计&#xff0c;自 2005 年开班至今&#xff0c;“姚班”已有10位毕业生进入学界执教斯坦福大学、普…

php函数get_magic_quotes_gpc详解

2019独角兽企业重金招聘Python工程师标准>>> set_magic_quotes_runtime是用来设置PHP 环境配置的变量 magic_quotes_runtime 值。 0-关闭 1-打开 程序中检测状态用get_magic_quotes_runtime,返回 0 表示关闭本功能&#xff1b;返回 1 表示本功能打开。若magic_quote…

掌声送给TensorFlow 2.0!用Keras搭建一个CNN | 入门教程

作者 | Himanshu Rawlani译者 | Monanfei&#xff0c;责编 | 琥珀出品 | AI科技大本营&#xff08;id&#xff1a;rgznai100&#xff09;2019 年 3 月 6 日&#xff0c;谷歌在 TensorFlow 开发者年度峰会上发布了最新版的 TensorFlow 框架 TensorFlow2.0 。新版本对 TensorFlow…

【Qt】Qt再学习(十四):QGraphicsView

1、简介 QGraphicsView提供显示QGraphicsScene的功能,它继承自QAbstractScrollArea,因此它还是一个带滚动条的窗口,这样可以实现只场景的一部分。还可以创建多个QGraphicsView来显示同一个QGraphicsScene,类似 QTableView、QTreeView和QListView的显示,官方专业的描述是“…

6月27日任务 配置Tomcat监听80端口、配置Tomcat虚拟主机、Tomcat日志

2019独角兽企业重金招聘Python工程师标准>>> 16.4 配置Tomcat监听80端口 1. vim /usr/local/tomcat/conf/server.xml Connector port"8080" protocol"HTTP/1.1" 修改为Connector port"80" protocol"HTTP/1.1" 2. /usr/loca…

Excel导入SQL数据库完整代码

protected void studentload_Click(object sender, EventArgs e){//批量添加学生信息SqlConnection conn DB.dataBaseConn();//链接数据库conn.Open();try{string fileurl typename(studentFileUpload);//调用typename方法取得excel文件路径DataSet ds new DataSet();//取得…

33关Python游戏,测试你的爬虫能力到底及格不?

作者 | 苏克1900责编 | 胡巍巍转载自高级农民工&#xff08;ID: Mocun6&#xff09;最近在网上看到一个非常有意思的 Python 游戏通关网站&#xff0c;一共有 33 关&#xff0c;每一关都需要利用 Python 知识解题找到答案&#xff0c;然后进入下一关。很考验对 Python 的综合掌…

【Qt】Qt再学习(十五):关于paintEvent、QPainter学习这一个demo就够了

1、描述 关于绘画事件paintEvent和绘制类QPainter的使用,推荐参考QtCreator中自带的示例basicdrawing。通过这个例子就能掌握QPainter的所有基本用法。下面是这个例子的几张截图:

HTTP缓存——304与200 from cache

个人博客原文地址 HTTP与缓存相关的字段 1. 通用字段 字段名称释义Cache-Control控制缓存具体的行为PragmaHTTP1.0时的遗留字段&#xff0c;当值为"no-cache"时强制验证缓存Date创建报文的日期时间(启发式缓存阶段所用)2. response字段 字段名称释义ETag服务器生成资…