Python学习日记(10)函数的返回值详解和高阶函数
文章目录
函数
函数返回值详解
多个return语句
函数中可以包含多个return
,但是在执行过程中,只要一个return
被执行到,那么这个函数就执行完毕。
当函数被设计成具有判断选择功能,函数会根据不同的return
返回不同的值,但还是只有一个return
被执行。
def create_nums(num):
print("---1---")
if num == 100:
print("---2---")
return num+1 # 函数中下面的代码不会被执行,因为return除了能够将数据返回之外,还有一个隐藏的功能:结束函数
else:
print("---3---")
return num+2
print("---4---")
result1 = create_nums(100)
print(result1) # 打印101
result2 = create_nums(200)
print(result2) # 打印202
一个return返回多个值
那么,当一个函数需要向调用者传递多个运行结果,就需要一种设置多个变量去接收返回值。
def divid(a, b):
shang = a//b
yushu = a%b
return shang, yushu #默认是元组
result = divid(5, 2)
print(result) # 输出(2, 1)
return
的返回值类型可以是元组、列表、字典等,只要是能存储多个数据的类型,就可以一次性返回多个值。
如果return
后面有多个数据,那么默认以元组类型进行存储。
对返回值进行拆包
def get_my_info():
high = 178
weight = 100
age = 18
return high, weight, age # 函数返回三个数据,会自动打包为元组
# result = get_my_info() # result 接收到一个元组
# print(result)
my_high, my_weight, my_age = get_my_info() # 直接把元组拆分为三个变量来使用,更加方便
print(my_high)
print(my_weight)
print(my_age)
- 对具有多个值的
return
进行拆包时,需注意变量的数量和要拆的数据的个数相同,否则程序会报异常;
函数参数详解
缺省参数
缺省参数指在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会替代默认参数。
def printinfo(name, age=35): # age就是一个缺省参数
# 打印任何传入的字符串
print("name: %s" % name)
print("age %d" % age)
# 调用printinfo函数
printinfo(name="miki") # 在函数执行过程中 age取默认值35
printinfo(age=9 ,name="miki")
不定长参数
有时可能需要一个函数的参数能处理比当初声明时更多的参数,这种类型的参数就是不定长参数,声明时不会命名。
基本语法:
def functionname([formal_args,] *args, **kwargs):
"""函数_文档字符串"""
function_suite
return [expression]
注意: 在函数声明中,加了*
号的变量args会存放所有未命名的变量参数,args为元组。而加了**
的变量kwargs会存放命名参数,形如key=value
这类的参数,kwarges为字典。
参数的排序
缺省参数一定位于正常参数后面,如果具有多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args的后面, 但如果有*kwargs的话,*kwargs必须是最后的
递归函数
函数的内部可以调用函数,当函数内部调用自身时,这个函数就是递归函数。
递归函数处理阶乘:
经典递归问题:实现费波纳希数列:
def sum_rubbit(m):
if m == 1 or m == 2:
return 1
else:
return sum_rubbit(m - 1) + sum_rubbit(m - 2)
print(sum_rubbit(12))
输出结果:
144
匿名函数
使用lambda
关键字能创建小型匿名函数,这种函数省略了用def
声明函数的标准步骤。
匿名函数**(lambda) **一般应用于函数式编程中,举个简单例子也许比较好理解,对于一个列表,要求大于3的元素。
过程式编程:
>>> L1 = [1,2,3,4,5]
>>> L2 = []
>>> for i in L1:
if i>3:
L2.append(i)
>>> L2
[4, 5]
函数式编程
>>> def func(x): return x>3 # 在函数中完成
>>> filter(func,[1,2,3,4,5])
[4, 5]
lambda
可以让程序更加简洁,函数一次性使用,所以不需定义函数名,可节省内存中的变量定义空间。
匿名函数的规则:
- 一般就是一行表达式,所以必须要有返回值;
- 不能使用return;
- 可以没有数,也可以有多个参数。
高阶函数
在python中,函数也是一种数据类型function
,可把它看为一个复杂的数据类型。
高阶函数是在Python中一个非常有用的功能函数,所谓高阶函数就是一个函数可以用来接收另一个函数作为参数,这样的函数叫做高阶函数。
def test():
print('hello python')
print(type(test))
输出结果:
<class 'function'>
定义变量指向函数
既然函数是一个数据类型,那么可以使用变量对其进行接收,相当于为这个函数起了一个别名。
def test():
return 'hello wrold'
fun = test # 定义了一个变量fun,让它指向了 test 这个函数
print(fun()) # 使用fun()可以直接调用test这个函数
print(id(fun)) # 1819677672040
print(id(test)) # 1819677672040
输出结果:
hello wrold
2475923025568
2475923025568
需要注意,在定义一个变量表示函数时,函数后面不可以加()
。
函数做为另一个函数的参数
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函数里输入的内容
result = demo() # 我是demo里输入的内容 调用 demo 函数,把demo函数的返回值赋值给 result
print(type(result)) # <class ‘function’> result 的类型是一个函数
result() # 我是demo里输入的内容 我是test函数里输入的内容 既然result是一个函数,那么就可以直接使用() 调用这个函数
demo()() # 我是demo里输入的内容 我是test函数里输入的内容