Python2 倒计时,还不快来掌握 Python3 酷炫的新特性?| 原力计划


作者|云爬虫技术研究笔记

责编|郭芮

出品|CSDN博客

已经发布近一个月了,距离第一个版本发布也将超过10年了。相信很多人还是依旧在使用版本,想要迁移到最新版本却不知道怎么能够快速掌握其中最Amazing的方法。

下面这篇文章,我会给大家推荐3.0版本依赖最最新潮的函数和语法,让你们能够在Review代码时候“脱颖而出”!


前言

首先我们先来讲几个时间点:

正式停止维护时间2020年1月1日,距今还有1个多月


正式开始发布时间2019年10月14日,距今1个多月


从这两个数字我们可以看出,Python3这个大版本已经发展很长的时间了,而距离的结束也越来越近了。在距离停止维护的一年内,很多优秀开源项目都已经停止了对2.7的支持,例如到今年1月份,NumPy将停止支持Python2;到今年年末,Ipython、Cython和Pandas等等都将陆续停止支持Python2。

所以,为了响应号召,顺应趋势。我们慢慢的向去迁移,那我们如何能够快速的掌握版本的精髓呢?下面我们从几个有趣的新特性入手,这些特性或方法都是Python3各个版本中新加的,它们相比传统的Python方法,更容易解决实践中的一些问题。

所有的示例都是在的环境下编写的,每个特性示例都给出了其正常工作所需的最低的Python版本。

潮流特性

格式化字符串f-string(最低Python版本为3.6)

“如何格式化字符串”这个话题我想是每个开发者在接触一门新语言的时候都会去学习的语法,而在Python中格式化语法的方式大家通常都会偏向于【Format】或者【%S】这两种方法,操作如下:

print("Mynameis%s"%('phithon',))
print("Mynameis%(name)s"%{'name':'phithon'})
print("Mynameis{}".format("bob"))
print("Mynameis{name}".format(name="bob"))

而到了版本,推出了新的格式化字符串的灵活方法【f-string】,使用【f-string】编写的与上面功能相同的代码是这样的:

name="bob"
print(f"Mynameis{name}")

我们对比这几种格式化字符串的方法,可以发现相比于常见的字符串格式符【%S】或【Format】方法,【f-string】直接在占位符中插入变量显得更加方便,也更好理解,关于格式化速度方面可以参考这个博文()看看详细的解释。

路径管理库Pathlib(最低Python版本为3.4)

从上个特性可以看出【f-string】确实非常强大和美观,而在文件路径方面,Python遵循了他们的开发理念:万物皆是对象,所以他们把路径也单拎出来搞了一个路径对象库,也就是一个处理文件路径的抽象库【pathlib】。如果你不知道为什么应该使用【pathlib】,请参阅下面这篇TreyHunner编写的炒鸡棒的博文()以及它的后续版本。

下面我们对比同一案例的新旧两个版本Python的实现:

fromglobimportglob


file_contents=
forfilenameinglob('**/*.py',recursive=True):
withopen(filename)aspython_file:
file_(python_)
frompathlibimportPath

file_contents=[
_text()
().rglob('*.py')
]s')

如上所示,您可以read_text对Path对象使用方法和列表理解,将文件内容全部读入一个新列表中,相比于使用旧版本Python的实现,在语法和美观上无疑是更加出色!

类型提示Typehinting(最低Python版本为3.5)

编程语言有很多类型,静态编译型语言和动态解释型语言的对比是软件工程中一个热门的话题,几乎每个人对此有自己的看法。在静态语言中类型标注无疑是让人又爱又恨,爱的是编译速度加快,团队合作中准确了解函数方法的入参类型,恨的是Coding时极其繁琐的标注。不过,标注这种极其符合团队文化的操作还是在Python3中被引入,并且很快得到了人们的喜爱。

defprint_yes_or_no(codition:str)-bool:
pass

枚举(最低Python版本为3.4)

大家在写Java或者C语言的时候都会接触到枚举这个特性,枚举也是帮我们节省了很多时间,也让我们的代码更加美观。旧版本Python中大家想要实现枚举的话实现方法五花八门,“八仙过海,各显神通”,充分发挥了Python的动态语言特性。我们下面举些例子:

==1,==2=='three'
==0==1
_mapping['three']=='THREE'
带字符数字映射的,像C/C++
defenum(*keys):
returnnamedtuple('Enum',keys)(*range(len(keys)))



Duration:30.684099674224854s

我们看到,我们没用缓存装饰器的时候计算的时间是30秒左右,现在,我们可以使用「lru_cache」来优化它(这种优化技术被称为「memoization」)。通过这种优化,我们将执行时间从几秒降低到了几纳秒。

fromfunctoolsimportlru_cache
@lru_cache(maxsize=512)
deffib_memoization(number:int)-int:
ifnumber==0:
return0
ifnumber==1:
return1
returnfib_memoization(number-1)+fib_memoization(number-2)
start=
fib_memoization(40)
print(f'Duration:{}s')
中print函数不允许多个*操作
print(*[1,2,3],*[3,4])
File"stdin",line1
print(*[1,2,3],*[3,4])
^
SyntaxError:invalidsyntax
可以使用任意多个解包操作
print(*[1],*[2],3)
123
*range(4),4
(0,1,2,3,4)
[*range(4),4]
[0,1,2,3,4]
{*range(4),4}
{0,1,2,3,4}
{'x':1,**{'y':2}}
{'x':1,'y':2}

我们可以看到,解包这个操作也算的上Python中极其潮流的玩法了,耍的一手好解包,真的会秀翻全场啊!

Dataclass装饰器(最低Python版本为3.7)

引入了【dataclass】,新特性大大简化了定义类对象的代码量,代码简洁明晰。通过使用@dataclass装饰器来修饰类的设计,可以用来减少对样板代码的使用,因为装饰器会自动生成诸如「__init__」和「__repr__」这样的特殊方法。在官方的文档中,它们被描述为「带有缺省值的可变命名元组」。

fromdataclassesimportdataclass


@dataclass
classDataClassCard:
rank:str
suit:str




Q
True

而常规的类,按照之前的语法类似于这样:

classRegularCard
def__init__(self,rank,suit):
=rank
=suit
queen_of_hearts=RegularCard('Q','Hearts')
print(queen_of_)
print(queen_of_hearts)
print(queen_of_hearts==RegularCard('Q','Hearts'))
__main__.RegularCardobjectat0x7fb6eee35d30
可以将类的信息打印出来
return(f'{self.__class__.__name__}'
f'(rank={!r},suit={!r})')
conversioncharacter:expected's','r',or'a'


def__eq__(self,other):
#可以比较类是否相同(不考虑内存地址)
ifother.__class__isnotself.__class__:
returnNotImplemented
return(,)==(,)

隐式命名空间包(最低Python版本为3.3)

一种组织Python代码文件的方式是将它们封装在程序包中(包含一个「」的文件夹)。下面是官方文档提供的示例:

sound/Top-levelpackage
__init__.pyInitializethesoundpackage
formats/Subpackageforfileformatconversions
__init__.py






..
effects/Subpackageforsoundeffects
__init__.py




filters/Subpackageforfilters
__init__.py



在Python2中,上面每个文件夹都必须包含将文件夹转化为Python程序包的「」文件。在Python3中,随着隐式命名空间包的引入,这些文件不再是必须的了。

sound/Top-levelpackage
__init__.pyInitializethesoundpackage
formats/Subpackageforfileformatconversions







effects/Subpackageforsoundeffects




filters/Subpackageforfilters



正如有些人说的那样,这项工作并没有像这篇文章说的那么简单,官方文档「PEP420Specification」指出,常规的程序包仍然需要「」,把它从一个文件夹中删除会将该文件夹变成一个本地命名空间包,这会带来一些额外的限制。本地命名空间包的官方文档给出了一个很好的示例,并且明确指出了所有的限制。

总结

上面给出的几个很潮流的特性可能并不是很全,更多的还需要大家去探索符合自己和团队的玩法,这篇文章只是向大家展示一些比较好玩的Python新功能,掌握它可以帮助你写出更加Pythonic的代码。

声明:本文为CSDN博主「云爬虫技术研究笔记」的原创文章,版权归作者所有。

技术的道路一个人走着极为艰难?

一身的本领得不施展?

优质的文章得不到曝光?

别担心,

即刻起,CSDN将为你带来创新创造创变展现的大舞台,

扫描下方二维码,欢迎加入CSDN「原力计划」!

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐