七、函数作用域
name = '可乐'
def foo():
name = '雪碧'
def bar():
name = '芬达'
def st():
print(name)
return st
return bar
a = foo()
print(a) #bar内存地址
b = a()
print(b) #st内存地址
c = b() #芬达
foo()()() #芬达
八、匿名函数:不需要显示指定函数:lambda x(形式参数):x+1(函数的返回值)
# 1
def foo(x):
return x+1
a = foo(5)
print(a) #6
a1 = lambda x:x+1
print(a1(5)) #6
# 2
name = 'alex'
b = lambda x:x+'_aa'
print(b(name)) #alex_aa
# 3
c = lambda x,y,z:(x+1,y+2,z+3)
print(c(1,2,3)) #(2,4,6)
九、函数式编程:函数式=编程语言定义的函数+数学意义的函数。这种函数内对象是永恒不变的的,要么参数是函数,要么返回值是函数。没有for和while循环,所有的循环都由递归去实现;无变量的赋值(既不用变量去保存状态),无赋值即不改变。
特征:1)不可变形;2)第一类对象;3)尾调用优化(尾递归)
# 1)非函数式
a = 1
def foo():
global a
a += 1
return a
foo()
print(a) #2
# 2)函数式
n = 1
def bar(n):
return n+1
print(bar(2)) #3
1、高阶函数:满足两个特征任意一个即为高阶函数
1)把函数当做参数传给另一个函数
def foo(n):
print(n)
def bar(name):
print('i am %s',name)
foo(bar('可乐')) #i am 可乐
#None
2)、返回值中包含函数
def foo():
print('this is 01')
def bar():
print('this is 02')
return foo
bar()() #this is 02
#this is 01
def test():
print('this is 03')
return test #与return test()递归不同的是只要不调用return不执行,而递归直接执行
test()() #this is 02
#this is 02
3)尾调用:在函数的最后一步调用另外一个函数(不一定是函数的最后一行)
# 1、非尾递归
def foo(sue):
if len(sue)==1:
return sue[0]
head,*gail=sue
return head+foo(tail)
print(foo(range(100)))
# 2、尾递归调用
def foo(sue):
print(sue)
if len(sue)==1:
return sue[0]
first,second,*args=sue
sue[0] = firse+second
sue.pop(1)
return foo(1)
x = foo([i for i in range(10)])
print(x)
2、map函数(内置函数)(依次处理列表中元素,返回结果为一个列表,该列表元素个数及位置与原来一致)
# 1)初级
num1 = [1,2,3]
def add_one(x)
return x+1
#lambda x:x+1
def reduce(x):
return x-1
#lambda x:x-1
def pingfang(x):
return x**2
#lambda x:x**2
def map_test(funce,array):
ret = []
for i in array:
res = funce(i)
ret.append(res)
return ret
print(map_test(add_one,num1)) #[2,3,4]
# 2)化简
def map_test(funce,array)
ret = []
for i in array:
res = funce(i)
ret.append(res)
return ret
print(map_test(lambda x:x+1,num1)) #[2,3,4]
#终极版本
print(list(map(lambda x:x+1,num1))) #[2,3,4]
print(list(map(add_one,num1))) #[2,3,4]
3、filter函数(对序列进行筛选得出筛选结果得到True则留下)
futer = ['ke_name','bb_name','haa']
def panduan(n):
return not n.endwith('name')
#lambda n:not n.endwith('name')
def filter_test(func,array):
ret = []
for i in array:
if func(i):
ret.append(i)
return ret
print(filter_test(lambda n:not n.endwith('name'),futer)) #['haa']
#终极版本
print(list(filter(lambda n:not n.endwith('name'),futer))) #['haa']
4、reduce函数(对列‘列表’函数进行处理最终合并为一个结果)
num2 = [1,2,3,4]
def mulit(x,y):
return x*y
#lambda x,y:x*y
def reduce_test(func,array,init=None)
if init is None: #对初始值进行判断
res = array.pop[0]
else:
res = init
for i in array:
res = func(res,i)
return res
print(reduce_test(ambda x,y:x*y,num2)) #24
print(reduce_test(ambda x,y:x*y,num2,10)) #240
#终极版本
form functools import reduce #对reduce函数进行导入
num3 = [1,3,5]
print(reduce(ambda x,y:x+y,num)) #9
print(reduce(ambda x,y:x+y,num,8)) #17
十、内置函数