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

4个鲜为人知的Python特性,正确使用

时间:2023-03-13 03:02:45 科技观察

不知道你有没有和我一样的习惯:当我学习Python的新特性,或者发现别人不知道某个特性时,我一般都会记录下来。在过去的几周里,我了解了一些有趣的特性——例如,我在StackOverflow上不知道的东西。以下是其中一些功能及其介绍。divmod这是一个非常有用的函数。函数的作用是:对两个数进行模除%运算,然后返回商和余数。例如:divmod(5,2)[Out]:(2,1)这个只是求2可以和5拟合的次数,这个数我们不用拆分,直接求商就可以了为2,余数为1。这对于计算返回的进程运行所需的时间特别有用。就像这样:start=datetime.datetime.now()...#流程代码end=datetime.datetime.now()#获取总运行时间(秒)runtime=(end-start).seconds#假设是30000#那几秒是多少小时,还剩多少秒?hours,remainder=divmod(runtime,3600)#现在还剩多少时间?mins,secs=divmod(remainder,60)print("{:02d}:{:02d}:{:02d}".format(hours,mins,secs))[Out]:"08:00:08"*args,**kwargs有时,您可能会注意到函数定义包含这两个参数,例如deffunc(x,y,*args,**kwargs)。它们实际上是非常简单的函数。两者都允许我们将多个值传递给一个函数,然后将这些值打包到一个生成器中。关于是否将列表/生成器传递给标准参数,结果类似于:deffunc(values):forxinvalues:print(x,end="")func([1,2,3])[Out]:'123'现在让我们使用*args-而不是将它们全部包含在列表中,我们应该将每个值作为一个新参数传递。deffunc(*values):forxinvalues:print(x,end="")func(1,2,3)[Out]:123注意我们不需要输入*args,只需要输入*values。由于单个星号*,它被定义为*args,而不管我们使用的变量名是什么。*args只是根据我们传递给函数的参数创建一个元组。**kwargs创建字典。因此,我们可以像这样使用名称、关键字参数:deffunc(**values):forxinvalues:print(f"{x}:{values[x]}")func(x=1,y=2,z=3)[Out]:x:1y:2z:3同样,我们可以随意调用变量,在本例中我们使用**values。使用双引号将其定义为**kwargs。列表理解这绝对是Python最有用的功能之一,对于理解表达式至关重要。最常见的是列表理解,我相信你们中的绝大多数人都看过以下内容:vals=[1,2,3,4,5][i**2foriinvals][Out]:[1,4,9,16,25]但我们并不仅限于这些方括号。我们可以用几乎完全相同的语法定义一个生成器表达式:(i**2foriinvals)[Out]:at0x7f0281730fc0>当然,生成器中的每个元素只有在调用时才会输出,我们可以使用list()这样做:list((i**2foriinvals))[Out]:[1,4,9,16,25]只需对语法稍作改动,我们甚至可以使用字典理解来构建字典:{i:i**2foriinvals}[Out]:{1:1,2:4,3:9,4:16,5:25}casefold这是一个特别有趣的字符串方法,它的功能类似于降低。然而,casefold试图更积极地标准化更广泛的字符。在大多数情况下,小写和大写的折叠行为相同,但有时它们并非如此:"?".casefold()#?和σ都是希腊字母sigma[Out]:Low:"?".lower()#然而,较低的认为它们不同[Out]:"?"[Out]:False在这里,两个sigma都已经小写了。根据使用情况,它可能会按预期工作。但是,如果我们要比较两个等价的希腊词,一个使用σ,另一个使用?。虽然相同,但只有casefold允许我们准确地比较它们:“?ρμ?σ”==“?ρμ??”[Out]:Falsecasefold()=="?ρμ??".casefold()[Out]:True希望你能从这篇文章中有所收获,尤其是divmod和casefold是非常有趣的功能,我最近刚体验过。