递归是颇为高级的话题,它在Python中相对少见。然而,它是一项应该了解的有用的技术,因为它允许程序遍历拥有任意的、不可预知的形状的结构。递归甚至是简单循环和迭代的替换,尽管它不一定是最简单的或最高效的一种。 ![img](file:///C:\Users\ADMINI1\AppData\Local\Temp[5UQ[BL(6BS2JV6W}N6[%S.png)
https://zhidao.baidu.com/question/550718079.html
用递归求和 让我们来看一些例子。 要对一个数字列表(或者其他序列)求和,我们可以使用内置的sum函数,或者自己编写一个更加定制化的版本。这里是用递归编写的一个定制求和函数的示例:
def mysum(L):
if not L:
return 0
else:
return L[0] + mysum(L[1:]) #调用自身
print(mysum([1,2,3,4,5,6]))
第一次:L = [ 1, 2, 3, 4, 5, 6]
L[0] = 1 , l1 = L[1:] = [2, 3, 4, 5]
第二次:L = l1= [2, 3, 4, 5, 6]
L[0] = 2, L[1:] = [3, 4, 5, 6]
以此类推
在每一层,这个函数都递归地调用自己来计算列表剩余的值和
list = []
def fa(n):
if n==1:
return 1
if n==2:
return 1
else:
return fa(n-1)+fa(n-2)
for i in range(1,11):
list.append(fa(i))
print(list)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
lambda表达式
lambda的一般形式是关键字lambda,之后是一个或多个参数(与一个def头部内用括号括起来的参数列表极其相似),紧跟的是一个冒号,之后是一个表达式,即:
lambda para1,para2,......,paran:expression using paras
由lambda表达式所返回的函数对象与由def创建并赋值后的函数对象工作起来是完全一样的,但是lambda有一些不同之处让其在扮演特定的角色时很有用
lambda是一个表达式,而不是一个语句。因为这一点,lambda能够出现在Python语法不允许def出现的地方——例如,在一个列表常量中或者函数调用的参数中。此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性地赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。
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))
使用lambda表达式到相同的效果,通过明确的将结果赋值给一个变量名,之后就能通过这个变量名来调用这个函数
num = lambda x, y, z: x+y+z
print(num(2,3,4))
这里的num被赋值给一个lambda表达式创建的函数对象。这也就是def所完成的任务,只不过def的赋值是自动进行的
默认参数也就能够在lambda参数中使用,就像在def中使用一样
f= (lambda a="Tom " , b ="loves " , c="python ":a+b+c)
print(f())
print(f('liLei '))
print(f('AV钟 ','智商二百五 ','c '))
Tom loves python
liLei loves python
AV钟 智商二百五 c
## 高阶函数
高阶函数:把一个函数名,一实参的形式,传给这个函数的形参,这个函数就称为高阶函数
比如下面的形参c,对应的实参是一个函数名abs。
```python
#函数abs()的功能是取绝对值
def add(a,b,c):
return c(a)+c(b)
add_value = add(-9,1,abs)
print(add_value)
最正确的高阶函数解释
满足下面两个条件之一,就可称之为高阶函数:
实例1:
import time
def bar():
time.sleep(1)
print("函数")
def test1(func):
start_time = time.time()
func()
stop_time = time.time()
print("这个函数的运行时间是 %s"% (stop_time-start_time))
test1(bar)
函数
这个函数的运行时间是 1.0101444721221924
实例2:
import time
def bar():
time.sleep(1)
print("in the bar")
def test2(func):
print(func)
return func
bar = test2(bar)
bar()
<function bar at 0x0000012C20E21E18>
in the bar
例子:
x = [1,2,3,4,5]
y = filter(lambda x: x%2==0,x) #找出偶数
print(y)
print(list(y)) #py3之后filter函数返回的不在是列表而是迭代器,所以需要用list转换
<filter object at 0x0000013CB785B0B8>
[2, 4]
普通函数使用lambda
x = [1,2,3,4,5]
def is_odd(n):
return n%2==1
print(list(filter(is_odd,x)))
[1, 3, 5]
例子:
x = [1,2,3,4,5]
y = [2,3,4,5,6]
z = map(lambda x , y : x*y + 2, x, y)
print(z)
print(list(z))
<map object at 0x00000294A2A0B1D0>
[4, 8, 14, 22, 32]
普通函数:
def f(x,y):
return x*y+2
x = [1,2,3,4,5]
y = [2,3,4,5,6]
print(list(map(f,x,y)
注:map中如果传入的几个序列的长度不一,那么会一句最短的序列进行计算
功能
调用
例子:
from functools import reduce
y = [2,3,4,5,6]
z = reduce(lambda x,y: x+y, y)
print(z)
20
li = [1,2,3,4,5,6]
a=1*100000+2*10000+3*1000+4*100+5*10+6
print(a)
其计算原理:
先计算骰两个元素:f(2,3),结果为5;
再把结果和第三个元素计算:f(5,4),结果为9
再把结果和第四个元素计算:f(9,5),结果为14
再把结果和第五个元素计算:f(14,6),结果为20
由于没有更多的元素了,计算结束,返回结果为20
功能
调用
例子:
import numpy as np
import pandas as pd
a=np.random.randint(low=0,high=4,size=(3,5))
print(a)
data = pd.DataFrame(a)
print(data)
[[0 2 3 3 0]
[0 2 0 2 3]
[1 2 1 3 2]]
0 1 2 3 4
0 0 2 3 3 0
1 0 2 0 2 3
2 1 2 1 3 2
功能
调用
例子:
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipTest = zip(a,b)
print(zipTest)
print(list(zipTest))
print(list(zip(a,c)))
zipT = zip(a,b)
print(list(zip(*zipT)))
[(1, 4), (2, 5), (3, 6)]
[(1, 4), (2, 5), (3, 6)]
[(1, 2, 3), (4, 5, 6)]