标签:return 函数 递归 python 话题 print def lambda
python函数高级话题目录:
4.python中常见高阶函数
1.递归函数
递归是颇为高级的话题,它在Python中相对少见。然而,它是一项应该了解的有用的技术,因为它允许程序遍历拥有任意的、不可预知的形状的结构。递归甚至是简单循环和迭代的替换,尽管它不一定是最简单的或最高效的一种。
用递归求和
让我们来看一些例子。
要对一个数字列表(或者其他序列)求和,我们可以使用内置的sum函数,或者自己编写一个更加定制化的版本。这里是用递归编写的一个定制求和函数的示例:
def mysum(L): #print(L) if not L: return 0 else: return L[0]+mysum(L[1:])#调用自身 print(mysum([1,2,3,4,5,6]))
Fibonacci公式:
公式:f(x)=f(x-1)+f(x-2)
举例说明:
list=[] n=int(input("请输入:"))#因为input输出的是str类型,所以需要强转 def sums(n): if n==1: return 1 if n==2: return 1 else: return sums(n-1)+sums(n-2) for i in range(1,n+1): list.append(sums(i)) print(list)
在每一层,这个函数都递归地调用自己来计算列表剩余的值的和,这个和随后加到前面的一项中。当列表变为空的时候,递归循环结束并返回0。当像这样使用递归的时候,对函数调用的每一个打开的层级,在运行时调用堆栈上都有自己的一个函数本地作用域的副本,也就是说,这意味着L在每个层级都是不同的。如上注释部分的print(L),可以运行查看结果。
正如你所看到的,在每个递归层级上,要加和的列表变得越来越小,直到它变为空——递归循环结束。加和随着递归调用的展开而计算出来。
2.匿名函数lambda
lambda表达式
lambda的一般形式是关键字lambda,之后是一个或多个参数(与一个def头部内用括号括起来的参数列表极其相似),紧跟的是一个冒号,之后是一个表达式,即:
lambda para1, para2, ..…, paraN : expression using paras
由lambda表达式所返回的函数对象与由def创建并赋值后的函数对象工作起来是完全一样的,但是1ambda有一些不同之处让其在扮演特定的角色时很有用。
1.lambda是一个表达式,而不是一个语句。因为这一点,lambda能够出现在Python语法不允许def出现的地方——例如,在一个列表常量中或者函数调用的参数中。此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性地赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。
2.lambda的主体是一个单个的表达式,而不是一个代码块。这个lambda的主体简单得就好像放在def主体的return语句中的代码一样。简单地将结果写成一个顺畅的表达式,而不是明确的返回。因为它仅限于表达式,lambda通常要比def功能要小:你仅能够在lambda主体中封装有限的逻辑进去,连if这样的语句都不能够使用。这是有意设计的——它限制了程序的嵌套:lambda是一个为编写简单的函数而设计的,而def用来处理更大的任务。
除了这些差别,def和lambda都能够做同样种类的工作,例如:
def add(x,y,z): return x+y+z print(add(1,2,3)) #结果:6
利用lambda写的例子:
sm = lambda x,y,z : x+y+z print(sm(1,2,3),type(sm)) # 结果6 <class 'function'>
这里的sm被赋值给一个lambda表达式创建的函数对象,这里就是def所完成的任务,只不过def的赋值是自动进行的。
默认参数也能够在lambda参数中使用,就像在def中使用一样。
f=(lambda a='zs',b='ls',c='ww':a+b+c) print(f()) print(f('tom')) print(f('tom','love','zhangsan'))
以上运行结果:
zslsww tomlsww tomlovezhangsan
3.高阶函数
标签:return,函数,递归,python,话题,print,def,lambda 来源: https://www.cnblogs.com/lovews/p/10722996.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。