1,递归
递归不是函数,而是一种思想。
>>> def fib(n):
if n==0:
return 0
elif n==1:
return 1
else:
return fib(n-1)+fib(n-2)
>>> fib(3)
2
>>> fib(10)
55
fib(n-1)+fib(n-2)就是又调用了这个函数自己,实现递归。
2,特殊函数
Python是支持多种范型的语言,可以进行所谓的函数式编程,其突出体现在有这么几个函数:
filter、map、reduce、lambda、yield
1)
lambda
lambda函数是一个只用一行就能解决问题的函数
>>> def add(x):
x+=3
return x
>>> numbers = range(10)
>>> numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> new_numbers=[]
>>> for i in numbers:
new_numbers.append(add(i))
>>> new_numbers
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
在这个例子中,add()只是一个中间操作。
但是,我们可以用lambda这个函数替代add(x):
>>> lam =
lambda
x:x+3
>>> n2=[]
>>> for i in numbers:
n2.append(lam(i))
>>> n2
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
这里的lam就相当于add(x),请对应一下,这一行lambda x:x+3就完成add(x)的三行,特别是最后返回值。
还可以这样用:
>>> g=
lambda
x,y:x+y
>>> g(2,3)
5
通过上面的例子,总结一下lambda函数的使用方法:
在lambda后面直接跟变量。
变量后面是冒号。
冒号后面是表达式,表达式计算结果就是本函数的返回值。
用一个式子表示:
lambda arg1, arg2, ...argN : expression using arguments
2)
map
>>> numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> add
<function add at 0x03172AB0>
>>>
map
(add,numbers) #只引用函数名称add即可
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>>
map
(lambda x:x+3,numbers) #用lambda也可以
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
map()是Python的一个内置函数,它的基本样式是:
map(func, seq)
func是一个函数,seq是一个序列对象。在执行的时候,序列对象中的每个元素,按照从左到右的顺序依次被取出来,塞入到func函数里面,并将func的返回值依次存到一个列表中。
>>> numbers
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> def aa(x):
return x**2
>>> map(aa,numbers)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3)
reduce
>>>
reduce
(lambda x,y:x+y,[1,2,3,4,5])
15
>>>
reduce
(lambda x,y:x+y,[1,2,3])
6
对比一下map()的运算,能更理解reduce()。Map()是上下运算,reduce()是横着逐个元素进行运算。
有两个list,a=[1,2,3],b=[4,5,6],计算:a[0]*b[0]+a[1]*b[1]+...的结果
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> zip(a,b)
[(1, 4), (2, 5), (3, 6)]
>>>
sum
(x*y for x,y in zip(a,b))
32
>>>
reduce
(
lambda
x,y:x+y,
map
(lambda x,y:x*y,a,b))
32
4)
filter
filter的中文含义是“过滤器”,在Python中,它起到了过滤器的作用。
>>> numbers = range(-5,5)
>>> numbers
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
>>> filter(lambda x:x>0,numbers)
[1, 2, 3, 4]
>>> [x for x in numbers if x>0]
[1, 2, 3, 4]
>>> filter(lambda x : x!='l','hello')
'heo'
这些函数在性能上可能没有多大效果,但是在代码简洁性上还是起很大作用的