Python-函数-作用域、匿名函数、函数式编程、内置函数

七、函数作用域

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

十、内置函数
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值