Chapter5function[toc]函数中的一切都可以看作python中的对象,包括函数deffunction_try():'''itisfuncitontrydoc'''print('function_trydoc')if__name__=="__main__":#__doc__属性用于生成对象的帮助文本print(function_try.__doc__)#__name__是输出具体的函数名print(function_try.__name__)我们也可以将函数名赋给一个变量,以变量的形式访问。deffunction_try():'''itisfuncitontrydoc'''print('function_trydoc')if__name__=="__main__":fun=function_try#__doc__属性用于生成对象的帮助文本print(fun.__doc__)#__name__是输出具体的函数名。print(fun.__name__)函数也可以通过参数传递给另一个函数。deffunction_try():'''itisfuncitontrydoc'''print('function_trydoc')deffunction_try1(func):print(func.__doc__)print(func.__name__)func()if__name__=="__main__":fun=function_tryfunction_try1(fun)高阶函数接受函数作为参数,或者返回函数作为结果的函数是高阶函数mapfunctiondefcube(x):returnx*xdata=map(cube,range(1,11))print(list(data))#添加listdefadd_num(n):returnn+1print(list(map(add_num,range(1,6))))并查看更多示例:result=['1','2','3']print(list(map(int,result)))#[1,2,3]#你也可以使用列表理解print([int(i)foriinresult])t=((1,'a'),(2,'b'))print(type(t))print(dict(t))print(dict((y,x)forx,yint))#map方法#print(dict(map(None,t)))#这个python3已经废弃了print(dict(map(reversed,t)))过滤函数过滤是根据第一个参数是true还是false来判断筛选。在下面的例子中,过滤掉大于3的值。s=[1,2,3,4,5]print(list(filter(lambdax:x>3,s)))#[4,5]reduce函数是将累加的参数应用到函数中。这就像我们要从1到100进行评估。代码如下所示。效果等同于sum(range(100))#python3已经把reduce移到了functools模块fromfunctoolsimportreducefromoperatorimportaddprint(reduce(add,range(100)))lambdafunction这是Python支持的一个有趣的语法,它允许您在一行中快速定义最少的函数示例:g=lambdax:x*2print(g(3))#等同于以下表达式print((lambdax:x*2)(3))D={'jack':23,'rose':21,'flank':22}value_sort=sorted(D.items(),key=lambdad:d[1])#值排序print(value_sort)#[('rose',21),('flank',22),('jack',23)]key_sort=sorted(D.items(),key=lambdad:d[0])#按键排序(key)打印(key_sort)#[('flank',22),('jack',23),('rose',21)]key_reverse=sorted(D.items(),key=lambdad:d[0],reverse=True)#key(key)降序print(key_reverse)#[('rose',21),('jack',23),('flank',22)]#value(value)降序value_reverse=排序(D.items(),key=lambdad:d[1],reverse=True)打印(value_reverse)#[('jack',23),('flank',22),('rose',21)]pythonlambda在python中使用lambda创建匿名函数,用def创建的方法有名字。除了表面的方法名,pythonlambda和def还有什么区别?1pythonlambda会创建一个函数对象,但不会将这个函数对象赋给一个标识符,而def会将函数对象赋值给一个变量2pythonlambda只是一个表达式,而def是一个语句。下面是pythonlambda的格式,看起来好精简。lambdax:打印xlambda表达式在“:”之后只能有一个表达式。也就是说在def中,能用return返回的也可以放在lambda后面,不能用return返回的不能定义在pythonlambda后面。因此,lambdas中不能使用if或for或print等语句,lambdas一般只用于定义简单的函数。这里有几个pythonlambda的例子。单参数:g=lambdax:x*2print(g(3))#结果为62多参数:m=lambdax,y,z:(x-y)*zprint(m(3,1,2))#结果为4sortedsorted函数返回一个排序后的列表,原来的fruits列表没有改变fruits=['strawberry','fig','apple','cherry','rasberry','banana']ret=sorted(fruits,key=len)print('beforesorted%s'%fruits)#beforesorted['strawberry','fig','apple','cherry','rasberry','banana']print('aftersorted%s'%ret)#aftersorted['fig','apple','cherry','banana','rasberry','strawberry']和它非常相似,见下面的例子:a=[5,4,3,2,1]sorted(a)#在不影响a本身结构的情况下,将a从大到小排序print("a=",a)#a=[5,4,3,2,1]a.sort()#将a从小到大排序,影响a本身的结构print(a)#[1,2,3,4,5]b=a.sort()print("b=",b)#b=Nonec=['aa','bb','BB','CC','zz']print(sorted(c))#按list中每个字母的ascii码元素从小到大排序#如果要从大到小,请使用sorted(b,reverse=True)#['BB','CC','aa','bb','zz']__call__方法是早先引入的,用于将函数视为对象。那么我们可以像调用函数一样调用类吗?答案是肯定的。我们只需要重写类classfunction_try(object)中的__call__:def__init__(self,value):self.data=valuedef__call__(self,*args,**kwargs):print('functiontrywascalled')forainargs:print(a)if__name__=="__main__":f=function_try(3)f('hello','world')除了__doc__,__name__这些函数还有很多属性。您可以使用dir(func)方法查看函数注释。Python3提供了在函数声明中将元数据附加到参数和返回值的语法。Python不检查、强制执行或验证。不要做#deftest(text,max_len=5):#下面是python3新的写法deftest(text:str,max_len:'int>0'=5)->str:iflen(text)>max_len:return"OK"text="helloworld"#print(len(text))a=test(text)print(a,type(a))print(test.__annotations__)#{'text':
