每当有我没注意到的特性,我都会愉快地记录下来。这不,我在过去几周了解了一些有趣的特性,比如StackOverflow上一些我不知道的特性。这些被低估和埋没的实用功能,真的值得拥有!函数divmod非常有用。它可以对两个数进行模除%运算,然后返回商和余数。例如:divmod(5,2)[Out]:(2,1)这个只是求2可以和5拟合的次数,这个数我们不用拆分,直接求商就可以了为2,余数为1。对于计算返回进程运行的时间(以小时、分钟和秒为单位)特别有用,如下所示:start=datetime.datetime.now()...#processcodegoesherend=datetime.datetime.now()#wegetthetotalruntimeinsecondsruntime=(结束-开始).seconds#wewillassume30000#howmanyhoursareinthesesecs,whataretheremainingsecs?hours,remainder=divmod(runtime,3600)#nowhowmanyminutesandsecondsareinourremainder?mins,secs=divmod(remainder,60)print("{:02d}:{:02d}:{:02d}".format(hours,mins,secs))[Out]:"08:00:08"casefold这是一个特别有趣的字符串方法,其功能类似于lower,但casefold试图更积极地标准化更广泛的字符。在大多数情况下,lower和casefold的行为相同,但有时它们不是:"?".casefold()#both?andσaretheGreeklettersigma[Out]:"σ"相反,使用lower:"?".lower()#however,lowerrecognizethemasdifferent[Out]:"?"[Out]:False这里,两个sigma都已经小写了。根据使用情况,它可能会按预期工作。但是,如果要比较两个等价的希腊词,一个使用σ,另一个使用?。虽然相同,但只有casefold允许我们准确地比较它们:“?ρμ?σ”==“?ρμ??”[Out]:False“?ρμ?σ”.lower()==“?ρμ??”.lower()[Out]:False“?ρμ?σ”。casefold()=="?ρμ??".casefold()[Out]:True*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]:
