递归函数与高阶函数
#_author:Administrator
#date:2019/11/1
#1
def fun(*args):
print(args)
a=[1,2,3]
fun(*a)# (1, 2, 3)
print('--------------')
def fun1(**kwargs):
print(kwargs)
fun1(**{'name':'star'})#{'name': 'star'}直接传一个字典
#2.高阶函数
#(1)函数名是一个变量,可以进行赋值
#(2)函数名可以做为函数的参数,还可以作为函数的返回值
def f(n):
return n*n
def fun2(a,b,func):
return func(a)+func(b)
print(fun2(2,3,f))#13
print('---------------------')
def fu():
def f():
return 5
return f
m=fu()
print(m)#<function fu.<locals>.f at 0x03719738> 是一个函数对象地址
print(m())# 5
print('---------------------')
#3 递归函数
def jie(n):
if n==1:
return 1
return n*jie(n-1)
print(jie(5))# 120
print('---------------------')
#关于递归的特性:
#1.内部调用自身函数
#2.有一个结束条件
#递归可以解决的问题都可以用循环来解决
#递归在很多时候效率很低
#斐波那契数列
def fibo(n):
if n<=2:
return n
return fibo(n-1)+fibo(n-2)
print(fibo(8))#34
#0 1 1 2 3 5 8 13 21 34 55
print('---------------------')
def fibo1(n):
if n==0 or n==1:
return n
return fibo1(n-1)+fibo1(n-2)
print(fibo1(8))#21
#4.内置函数
print('---------------------')
print(all([1,2,3,'asd']))#True all()函数用于判断给定的可迭代参数 iterable中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
print(all([1,2,3,'asd','']))#False
print(divmod(8,3))#求 余数 和 模 (2, 2)
print(eval('3+4*6'))# 27 eval()可以帮我们做算术运算,也可以将一个字符串转换为字典
#重要的内置函数(1)filter 的功能是过滤掉序列中不符合函数条件的元素,当序列中要删减的元素可以用某些函数描述时,就应该想起filter函数。
str=['a','s','d','f']
def func(s):
if s!='d':
return s
ret=filter(func,str)
print(ret)#<filter object at 0x007809F0> ret是一个过滤器对象,也是一个迭代器对象
print(list(ret))#['a', 's', 'f']
print('------------------------')
#(2)map() 是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
list=['a','s','d','f']
def func(s):
return s+'star'
ret2=map(func,list)
print(ret2)#<map object at 0x03910B10>
print(list(ret2))#['astar', 'sstar', 'dstar', 'fstar']对字符串进行处理
#(3)reduce()要想调用此方法,前面加上from functools import reduce
#对一个序列进行压缩运算,得到一个值。但是reduce在python2的时候是内置函数,到了python3移到了functools模块,所以使用之前需要 from functools import reduce
#调用: reduce(function,iterable),其中function必须传入两个参数,iterable可以是列表或者元组
from functools import reduce
def add_1(x,y):
return x + y
print(reduce(add_1,[1,2,3,4,5,6,7,8,9]))#45 reduce()的结果就是一个值
print(reduce(add_1,range(1,101)))#5050
#(4)lambda-->匿名函数
def add_2(a,b):
return a+b
lambda x,y:x+y
#通过reduce函数加lambda表达式(匿名函数)求阶乘
from functools import reduce
print(reduce((lambda a,b:a*b),range(1,5)))#24
#通过map函数加lambda表达式(匿名函数)
squares=map(lambda x:x*x,range(9))
print(squares)#<map object at 0x01250D90>
print(list(squares))#[0, 1, 4, 9, 16, 25, 36, 49, 64]