递归函数:在函数的内部自己调用自己,并且有退出函数的出口
def text(n:int) -> int:
'''
这是一个正整数返回阶乘的函数
:param n:
:return int:
'''
if n==1:
return n
return n*text(n-1)
print(text(6))
'''
通过调用text 函数给予一个int 类型的数字6,
首先n 进入第九行 n*text(n-1),
由text(n-1)再次进入text()函数,
此时n 为5,以此类推,直到n=1 进入if 模块,
不再进行向下套娃,由if 返回 1,上一阶的text(n-1)变为1,
执行 return 2*1,再次向上一阶返回,直到最上层的一阶,执行 return 6*120
120是由1*2*3*4*5 得到
'''
匿名函数:lambda
:如果一个函数有一个返回值,并且只有一句代码,可使用lambda 简化
lambda 参数列表 : 表达式
"""
lambda 表达式的参数可有可无
函数的参数在lambda 表达式中完全使用
lambda 表达式能接收任何数量的参数,但只能返回一个表达式的值
直接打印lambda 表达式,输出的是lambda的内存地址
"""
#使用匿名函数做判断
fn = lambda a,b: a if a >b else b
print(fn(1000,500))
'''
将1000传入值a,将500传入b,通过三元表达式判断 if a>b return a else return b
'''
高阶函数:函数作为参数传入,或者返回值是另外一个函数,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式
#高阶函数
def num_sum(a,b:int)->int:
'''
两数取后绝对值相加
:param a:
:param b:
:return:
'''
return abs(a)+abs(b)
print(num_sum(-4,-9)) #由于这种方法如果需求改了的话,需要修改源代码,需再次测试和调试,较麻烦所以可以传入函数一个函数,也就是所谓的高阶函数
def num_num2(a,b,i)->int:
'''
:param a:
:param b:
:param i 传入的函数名,如abs:
:return:
'''
return i(a)+i(b)
print(num_num2(-7,5,abs)) #个人认为,其实也只是采用了一种小聪明的做法
#第二种是由函数返回函数,不常用
def text(*args):
#由text() 函数传入数字后,再定义text1() 函数,由text1() 函数算这些数的总和(sum),再由text()返回text1 也就是text1()的函数名,加()即可调用,就算是不调用text1() 函数也是已经计算完成而没有输出
def text1():
return sum(args)
return text1
print(text(1,34,546,6))
print(text(2,543,213,4)()) #其实也是采用一种小聪明的做法
内置高阶函数
map函数:接收的是两个参数,一个是函数名,另一个是序列,功能是将序列中的数值作为函数的参数依据依次传入函数值中执行,再返回列表。返回值是迭代器对象,输出需重新转换
reduce函数:一个参数为函数,另一个参数为序列对象(如:list)。返回值为一个值而不是迭代器对象,故常用于叠加、叠乘等。来自 from functools import reduce 库中(python 内置库)
function:一个有两个参数的函数
sequence:是一个序列,是一些数据的集合。或者是一组数据,可迭代对象
initial:可选,初始参数
返回值:返回函数计算的结果
reduce()函数,使用function函数(有两个参数)先对集合中的sequence第1、2个元素进行操作,如果存在initial参数,则将会以sequence中的第一个元素和initial 作为参数,用作调用,得到的结果再与sequence中的下一个数据用function 函数运算,最后得到一个结果。
filter 函数:python 内建的filter()函数用于过滤序列,和map()类似,filter()也接收一个函数和一个序列;但不同的是filter()把传入的函数依次作用于每个元素,然后根据返回值Ture还是False决定元素的保留与丢弃
sorted 函数:python内置的sorted()函数就可以对list 进行排序 ;和序列中本身的sort 函数类似,格式为 sorted (列表,key=’以...为判断依据‘,reverse='Ture' or 'Flase')