自从把精力投入到Cimidata(www.cimidata.com)的产品中,好像很久没有写原创文章了。人一旦懒惰,就会养成习惯。反之亦然。一个目标之所以难以坚持,很可能是目标太大了。我们有一个跑步团,每周坚持5公里,坚持了100天。如果环城是一天5公里,相信你很快就会放弃。而每周5公里,如果你在7天内的任何一天完成,你就达到了目标,所以你一直在坚持,甚至可以超额完成。后来,我决定坚持每周至少出一篇原创文章。来,互相监督1.reduce()reduce()是functools模块下的一个函数,它接收两个参数,一个是函数对象,一个是可迭代对象(比如list)。一个元素作用于函数做累加计算,最终得到一个值。看个例子就明白了#Createfunctiondefadd(a,b):result=a+bprint(f"{a}+{b}={result}")returnresultfromfunctoolsimportreduceresult=reduce(add,[1,2,3,4])print("result:",result)输出1+2=33+3=66+4=10result:10执行过程:取出list中的前两个数作为函数add的参数,第二次以最后一个函数add的返回值和列表的第三个数作为参数,以此类推,最后得到一个值。这就是reduce所做的。这有点像一种团结感。当然,如果只是计算list中元素的总和,就不需要用reduce来处理这么大的弯路了,直接用sum函数就可以解决。result=sum([1,2,3,4])如果是计算list中元素的乘积,python没有内置函数可以直接计算。这时候我们可以使用reduce来处理defmul(a,b):returna*bresult=reduce(mul,[1,2,3,4])print("Result:",result)outputresult:24或者使用lambdaanonymousfunctionresult=reduce(lambdaa,b:a*b,[1,2,3,4])甚至可以直接使用operator模块下的乘法运算符函数fromoperatorimportmulresult=reduce(mul,[1,2,3,4])print("result:",result)最后你会发现其实有很多解决方案,但是我们要记住python之禅中的那句话:应该有一个——最好只有一个——很明显方法来做到这一点。用最合适的方式做一件事2.split()split接收一个参数,用于将字符串拆分成一个列表,例如可以通过按空格切割英文字符串来统计字数,words="pythonisthebestprogramminglanguage"wordswords=words.split("")print(words)output['column1','column2','column3']3.enumerate()enumerate函数用于迭代列表等可迭代对象。它的使用场景一般出现在需要获取列表的下标位置时。我们知道可以直接使用for循环来迭代列表的时候,获取不到元素的下标位置,但是enumerate可以获取到,否则还得自己定义一个索引变量。words=['python','is','the','best','programming','language']index=0forwinwords:print(index,w)index+=10python1is2the3best4programming5language使用enumerate函数,处理更优雅forindex,winenumerate(words):print(index,w)0python1is2the3best4programming5language4。map()map是对应于reduce函数的一个函数,Google的map/reduce框架的思想其实就是借鉴了这两个函数。map函数用于通过函数处理一个列表,并将其映射成一个新的列表。例如,对列表的每个元素进行平方,将列表元素转换为字符串,得到一个新的列表。结果=地图(lambdax:str(x),[1,2,3,4])打印(列表(结果))结果=地图(lambdax:x*x,[1,2,3,4]))打印(list(result))output:['1','2','3','4'][1,4,9,16]另外,map函数也可以接受多个list参数,制作多个list可以合并成一个列表,比如将两个列表相同位置的元素相加得到一个新的列表defmerge(x,y):returnx+yresult=map(merge,[1,2,3],[3,2,1])print(list(result))outputs[4,4,4]5.getattr()getattr()返回对象属性对应的值,接受两个参数,第一个是对象,第二个是属性名,这个函数通常是用户动态的或者对象下某个属性的值,看例子:classFoo:def__init__(self):self.a=10foo=Foo()a=getattr(foo,"a")print(a)输出10你可能会问,我可以直接通过foo.a获取a属性的值吗?正常的情况是这样的,是的,如果你不知道要获取什么属性值,那么getattr就可以派上用场了。初学者可能还无法体验。当您尝试编写一些框架级别的代码时,您只需要记住有这样的功能可用。6.sliceslice是一个切片函数,你可能用过切片操作,通过切片得到列表的子集,例如:s=[1,2,3,4]>>>s[1:3]#获取列表s由1st和3rd之间的元素组成的子列表"1:3"是slice(1:3)函数的缩写。前者就像语法糖s=[1,2,3,4]print(s[slice(1,3)])实际应用中一般会用到,可以直接使用语法糖,不需要使用slice函数来切片,但你至少应该知道如何使用slice。7.sorted()sorted函数应该算是日常代码中的高频函数了。它用于对可迭代对象(如列表)进行排序。它不会改变原来列表的顺序,而是返回一个新的列表。默认情况下,nums=[4,5,6,3,1]print(sorted(nums))按升序输出[1,3,4,5,6]。如果要降序排列,需要指定第二个参数:reverse=Truenums=[4,5,6,3,1]print(sorted(nums,reverse=True))#[6,5,4,3,1]sorted函数的威力远不止于此,因为你还可以自定义排序规则。比如参与比较的是一个自定义类Student。我需要根据学生的年龄进行排序。这时候我们需要自定义排序因子函数defmy_sort_key(s):returns.ageclassStudent:def__init__(self,age):self.age=agedef__str__(self):returnf"Student({self.age})"s1=Student(12)s2=Student(2)s3=Student(30)new_list=(sorted([s1,s2,s3],key=my_sort_key))foriinnew_list:print(i)输出:Student(2)Student(12)学生(30)8。formatformat函数是字符串格式化最常用的函数,使用起来非常简单,但是自从f-string出现之后,format这个函数就逐渐被替代了,但是这个函数的应用场景还是可以的3.6之前见过。s="{}isfirstname"print(s.format("liu"))如果占位符很多,顺序不清楚,可以给每个占位符起个名字,这样就不会错过合适的位置s="{first_name}isfirstname"print(s.format(first_name="liu"))9.join()join也是一个常用的内置函数,它可以将指定的字符作为列表对象中元素之间的连接,转换为字符串。words=['python','is','the','best','programming','language']print("".join(words))#connectpythonisthebestprogramminglanguage10.typetype带空格我觉得python最多difficult我理解的一个内置函数。新手可能会认为type是用来检查对象的类型,例如:print(type(10))#
