递归函数
<1>什么是递归函数
通过前面的学习知道一个函数可以调用其他函数。
如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。
<2>递归函数的作用
举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n
解决办法1:使用循环来完成
def cal(num):
result,i =
1,
1
while i <= num:
result *= i
i+=
1
return result
print(cal(
3))
看阶乘的规律
1! = 1
2! = 2 × 1 = 2 × 1!
3! = 3 × 2 × 1 = 3 × 2!
4! = 4 × 3 × 2 × 1 = 4 × 3!
...
n! = n × (n-1)!
解决办法2:使用递归来实现
def factorial(num):
result =
1
if num ==
1:
return
1
result = num * factorial(num -
1)
return result
print(cal(
3))
原理
匿名函数
用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
lambda函数的语法只包含一个语句,如下:
lambda
参数列表: 运算表达式
如下实例:
sum =
lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print(
"Value of total : %d" % sum(
10,
20 ))
print(
"Value of total : %d" % sum(
20,
20 ))
以上实例输出结果:
Value of total :
30
Value of total :
40
Lambda函数能接收任何数量的参数但只能返回一个表达式的值
匿名函数可以执行任意表达式(甚至print函数),但是一般认为表达式应该有一个计算结果供返回使用。
python在编写一些执行脚本的时候可以使用lambda,这样可以接受定义函数的过程,比如写一个简单的脚本管理服务器。
应用场合
函数作为参数传递
>>> def fun(a, b, opt):... print(
"a = " % a)
... print(
"b = " % b)
... print(
"result =" % opt(a, b))
...
>>> add =
lambda x,y:x+y
>>> fun(
1,
2, add)
# 把 add 作为实参传递
a =
1
b =
2
result =
3
练习:
有一个列表
students = [
{
'name':
'zhangsan',
'age':
18,
'score':
92},
{
'name':
'lisi',
'age':
20,
'score':
90},
{
'name':
'wangwu',
'age':
19,
'score':
95},
{
'name':
'jerry',
'age':
21,
'score':
98},
{
'name':
'chris',
'age':
17,
'score':
100},
]
要求,对上述列表里的数据按照score进行升序排序。
Python中使用函数作为参数的内置函数和类:
函数名或类名 | 功能 | 参数描述 |
sorted函数 | 用来将一个无序列表进行排序 | 函数参数的返回值规定按照元素的哪个属性进行排序 |
filter类 | 用来过滤一个列表里符合规定的所有元素,得到的结果是一个迭代器 | 函数参数的返回值指定元素满足的过滤条件 |
map类 | 将列表里的每一项数据都执行相同的操作,得到的结果是一个迭代器 | 函数参数用来指定列表里元素所执行的操作 |
reduce函数 | 对一个序列进行压缩运算,得到一个值。python3以后,这个方法被移到了functools模块 | 函数参数用来指定元素按照哪种方式合并 |
高阶函数
在Python中,函数其实也是一种数据类型。
def test():
return
'hello world'
print(type(test))
# <class 'function'>
函数对应的数据类型是 function
,可以把它当做是一种复杂的数据类型。
既然同样都是一种数据类型,我们就可以把它当做数字或者字符串来处理。
定义一个变量指向函数
在Python中,我们还可以定义一个变量,让它来指向一个函数,相当于给函数起了一个别名。
def test():
return
'hello wrold'
fun = test
# 定义了一个变量fun,让它指向了 test 这个函数
print(fun())
# 使用fun()可以直接调用test这个函数
print(id(fun))
# 1819677672040
print(id(test))
# 1819677672040
注意:在定义一个变量表示一个函数时,函数后面不能加括号!加括号表示的是调用这个函数。
def test():
return
'hello world'
result = test()
# 这种写法是调用test函数,并把函数的返回值赋值给result变量
print(result())
# 这里会报错 TypeError: 'str' object is not callable
fun = test
# 这种写法是给test函数起了一个别名,注意,这里的test后面不能加()
fun()
# 可以使用别名调用这个函数
高阶函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,同样,我们还可以把一个函数当做另一个函数的返回值。这种函数的使用方式我们称之为高阶函数。
函数做为另一个函数的参数
def test(age,action):
if age <
18:
print(
'您还没满十八岁,请退出')
action()
# 把参数action直接当做一个函数来调用
def smoke():
print(
'我已经年满十八岁了,我想抽烟')
my_action = smoke
# 定义一个变量my_action,让它指向smoke函数
test(
21, my_action)
# 将my_action传给 test 函数作为它的参数
test(
21,smoke)
# 还可以不再定义一个新的变量,直接传入函数名
函数作为另一个函数的返回值
def test():
print('我是test函数里输入的内容')
def demo():
print('我是demo里输入的内容')
return test # test 函数作为demo函数的返回值
result = demo() # 我是demo里输入的内容 调用 demo 函数,把demo函数的返回值赋值给 result
print(type(result)) # <class 'function'> result 的类型是一个函数
result() # 我是demo里输入的内容 我是test函数里输入的内容 既然result是一个函数,那么就可以直接使用() 调用这个函数
demo()() # 我是demo里输入的内容 我是test函数里输入的内容