当前位置: 首页 > 科技观察

Python 2.7终结于7个月后,这是你需要了解的3.X炫酷新特性

时间:2023-03-12 19:29:48 科技观察

Python2.7结束7个月后,这里是你需要了解的3.X酷炫新特性截至5月19日上午10点,Python2.7将结束......在此期间,许多优秀的开源项目和库都停止了支持2.7。例如,到今年1月,NumPy将停止支持Python2;到今年年底,Ipython、Cython、Pandas等都将陆续停止对Python2的支持。虽然我们都在迁移到3.X,但许多人编写的Python3代码看起来仍然像Python2,只是有一些括号或API更改。在本文中,作者将展示Python3.X的一些激动人心的新特性。这些特性或方法是Python3的每个版本中新加入的,在实践中它们比传统的Python方法更容易解决一些问题。所有示例都是用Python3.7编写的,每个功能示例都提供了正常工作所需的最新版本的Python。格式化字符串f-string(***Pythonversion3.6)在任何编程语言中,都离不开字符串。为了清楚起见,您需要一种结构化的方式来处理字符串。大多数使用Python的人会更喜欢使用“格式”方法。user="JaneDoe"action="buy"log_message='User{}hasloggedinanddidanaction{}.'.format(user,action)print(log_message)#UserJaneDoehasloggedinanddidanactionbuy。除了“格式化”之外,Python3还提供了一种通过“f-string”灵活的方法来进行字符串插值。使用“f-string”编写的功能与上面相同的代码是这样的:与常见的字符串格式化字符%s或格式化方法相比,直接在占位符中插入变量更方便、更容易理解f-strings。路径管理库Pathlib(***Python版本3.4)f-strings非常强大,但一些字符串(如文件路径)有自己的库,可以更轻松地操作它们。Python3提供了一个抽象库“pathlib”来处理文件路径。如果您不知道为什么要使用pathlib,请参考TreyHunner撰写的以下博文:“https://treyhunner.com/2018/12/why-you-should-be-using-pathlib/”frompathlibimportPathroot=Path('post_sub_folder')print(root)#post_sub_folderpath=root/'happy_user'#Makethepathabsoluteprint(path.resolve())#/home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/usersub_folder它表明我们可以直接对路径的字符串进行“/”操作,进行绝对地址和相对地址的转换。TypehintingTypehinting(***Pythonversion3.5)静态类型和动态类型是软件工程中的热门话题,几乎每个人都有自己的看法。什么时候写哪种类型由读者决定,所以你至少需要知道Python3支持类型提示。defsentence_has_animal(sentence:str)->bool:return"animal"insentencesentence_has_animal("Donaldhadafarmwithoutanimals")#Trueenumeration(***Pythonversion3.4)Python3支持通过“Enum”类编写枚举的简单方法。枚举是一种封装常量列表的便捷方式,因此这些列表不会在没有非常结构化的情况下随机散布在您的代码中。fromenumimportEnum,autoclassMonster(Enum):ZOMBIE=auto()WARRIOR=auto()BEAR=auto()print(Monster.ZOMBIE)#Monster.ZOMBIE枚举是符号名(成员)的集合,与唯一的常量值相关联绑定在一起。在一个枚举中,可以通过标识来比较成员,也可以遍历枚举本身。参考:https://docs.python.org/3/library/enum.htmlformonsterinMonster:print(monster)#Monster.ZOMBIE#Monster.WARRIOR#Monster.BEAR原生LRU缓存(***Python版本为3.2)目前,几乎所有级别的软件和硬件都需要缓存。Python3使用LRU(最近最少使用算法)缓存作为一个名为“lru_cache”的装饰器,使得缓存的使用变得非常简单。下面是一个简单的斐波那契函数,我们知道使用缓存将有助于计算这个函数,因为它会递归多次执行相同的工作。importtimedefib(number:int)->int:ifnumber==0:return0ifnumber==1:return1返回fib(number-1)+fib(number-2)start=time.time()fib(40)print(f'Duration:{time.time()-start}s')#Duration:30.684099674224854s现在,我们可以使用“lru_cache”对其进行优化(这种优化技术称为“memoization”)。通过这种优化,我们将执行时间从数秒减少到纳秒。fromfunctoolsimportlru_cache@lru_cache(maxsize=512)defib_memoization(number:int)->int:ifnumber==0:return0ifnumber==1:return1返回fib_memoization(number-1)+fib_memoization(number-2)start=time.time()fib_memoization(40)print(f'Duration:{time.time()-start}s')#Duration:6.866455078125e-05sExtendediterableobjectunpacking(***Pythonversion3.0)对于这个特性,代码说明了一切。参考:https://www.python.org/dev/peps/pep-3132/head,*body,tail=range(5)print(head,body,tail)#0[1,2,3]4py,文件名,*cmds="python3.7script.py-n5-l15".split()打印(py)打印(文件名)打印(cmds)#python3.7#script.py#['-n','5','-l','15']first,_,third,*_=range(10)print(first,third)#02数据类装饰器(***Python版本为3.7)Python3引入“数据类”,它们没有太多限制,可以用来减少样板代码的使用,因为装饰器会自动生成特殊方法,如“__init__()”和“__repr()__”。在官方文档中,它们被描述为“具有默认值的可变命名元组”。classArmor:def__init__(self,armor:float,description:str,level:int=1):self.armor=armorself.level=levelself.description=descriptiondefpower(self)->float:returnsself.armor*self.levelarmor=Armor(5.2,"Commonarmor.",2)armor.power()#10.4print(armor)#<__main__.Armorobjectat0x7fc4800e2cf8使用“Dataclass”实现相同的Armor类。fromdataclassesimportdataclass@dataclassclassArmor:armor:floatdescription:strlevel:int=1defpower(self)->float:returnself.armor*self.levelarmor=Armor(5.2,"Commonarmor.",2)armor.power()#10.4print(armor)#Armor(armor=5.2,description='Commonarmor.',level=2)隐式命名空间包(***Python版本3.3)组织Python代码文件的一种方法是将它们包装在包中(包含一个“__init__.py”文件夹)。下面是官方文档提供的例子。sound/Top-levelpackage__init__.pyInitializethesoundpackageformats/Subpackageforfileformatconversions__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/Subpackageforsoundeffects__init__.pyecho.pysurround.pyreverse.py...过滤器/过滤器子包__init__.pyequalizer.pyequalizer.pyreverse.py...py...在Python2中,上述每个文件夹都必须包含一个“__init__.py”文件,该文件将文件夹转换为Python包。在Python3中,随着隐式命名空间包的引入,这些文件不再是必需的。sound/Top-levelpackage__init__.pyInitializethesoundpackageformats/Subpackageforfileformatconversionswavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/Subpackageforsoundeffectsecho.pysurround.pyreverse.py...filters/Subpackageforfiltersequalizer.pyaravokequalizer.py...正如人们所说,这项工作并不像这篇文章说的那么简单,官方文档“PEP420Specification”指出常规包仍然需要“__init__.py”,从文件夹中删除它会删除这个文件夹成为本地命名空间包,这会增加一些额外的限制。本地命名空间包的官方文档给出了一个很好的例子,并清楚地说明了所有限制。结论与Internet上的几乎所有技术列表一样,本文给出的列表并不完整。希望本文至少向您展示了一些以前未知的Python3功能,这些功能将帮助您编写更清晰、更直观的代码。***,本文给出的所有代码都可以在作者的GitHub上找到: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/【本文为专栏《机器之心》原文翻译,微信♂《机器之心(id:almosthuman2014)》】点此查看该作者更多好文