匿名函数前言上次我们基本讲了函数的定义和简单使用,简单分析了Python中的基本函数和常用用法,下面我们就来一个稍远一点。它们也是菜鸟,我们不知道是否真的需要它们,但是了解函数和装饰器的执行顺序还是很有必要的。首先简单回顾一下:函数的定义:def函数名(参数):具体的函数语句块return[要返回的数据]函数的执行:#函数只在被调用时执行,函数可以多次执行name()局部变量vs.全局变量:不同的函数作用域不同()test2()localwant使用全局变量使用全局变量名局部和全局同名变量还是需要同时使用全局变量。deftest1():name='XXX'deftest2():#使用上一层的变量打印查看nonlocalnameprint(name)#在函数test1中调用并执行test2test2()test1()#直接调用test2会抛出一个exceptiontest2不是Define#test2()因为箭头里面有空格,Python也是按照这个格式判断作用域的,只能和红框一样在同级调用。一个函数返回另一个函数:deftest1():print("inthetest1")deftest2():print("inthetest2")returntest1()test2()为了把上面的代码解释清楚,让我们插入一个递归。递归的特点:递归就是调用自己必须有明确的结束条件,否则会造成栈溢出。每个递归问题都会减少。递归效率不高,但有时候用最经典的斐波那契契数数组确实好用。#斐波那契数列是这样的:1,1,2,3,5,8,13,21,34,55...deffabonacci(n):#结束条件ifn<=2:#因为前两个数他们都是1,所以当n小于等于2时,return1v=1returnv#如果大于2,就会调用自己,第n个斐波那契数等于n-1个数+n之和-2numberv=fabonacci(n-1)+fabonacci(n-2)returnvprint(fabonacci(6))importsys#打印当前递归深度,默认为1000print(sys.getrecursionlimit())#设置最大递归深度sys.setrecursionlimit(999999999)print(sys.getrecursionlimit())其实就是在一个函数内调用另一个函数,它会等待另一个函数执行完成,然后执行该函数到最后。。。递归不递归感觉都一样。。。所以,还是赶紧切入正题吧,代码的执行顺序是这样的。。。当然你也可以这样玩:deftest1():打印(“inthetest1”)deftest2():打印(“我nthetest2")#这里返回test1的内存地址returntest1test2()()#先执行test2(),返回test1的内存地址#加括号执行test1匿名函数使用lambda创建简单来说,匿名函数就是一个没有名字的简单函数。一个匿名函数只有一个表达式,返回表达式计算的值用如下所示的命令创建一个简单的匿名函数。格式lambda参数列表:expressionlambdanum1,num2:num1+num2用一个变量接收,就是保存的内存地址,加括号传入参数运行。func=lambdanum1,num2:num1+num2print(func(1,2))我用的编辑器是VSCode,发现了一个问题。在格式化代码的时候,我把匿名函数改成了函数……具体原因和细节不详。格式化前:格式化后:map映射(循环每个函数执行函数,并将结果保存到新列表)map(匿名函数,可迭代对象)map()处理序列中的每个元素,结果为一个可迭代对象与以前相同的数量和位置。li=[1,5,3,2,3]res=map(lambdax:x+1,li)print(type(res))#返回的地图对象print(list(res))filter判断filter()遍历For序列中的每个元素,如果得到的结果为True,则保留。people=['sb_laowang','sb_xiaozhang','sb_laozhang','xiaoliu']#将帅笔开头的对象保存为新对象res=filter(lambdax:x.startswith('sb'),people)print(type(res))print(list(res))reduce:合并序列fromfunctoolsimportreducenum_li=[1,2,3,4,5,6,7,8,9,10]str_li=list('hello')res_num=reduce(lambdax,y:x+y,num_li)res_str=reduce(lambdax,y:x+y,str_li)print(str_li)print(type(res_num),res_num)print(type(res_str),res_str)运行时第一次,x和y是前两个可迭代对象,x是之前积累的,y是第一个还没有积累的。说reduce(lambdax,y:x+y,num_li)这个,可以打个断点看看。第一次x=1,y=2第二次x=3,y=3第三次x=6,y=4第四次x=10,y=5...匿名函数的好处:简化代码没有名字,避免函数名冲突查看一个模块的所有方法:#print(dir(modulename))#例如:importtimeprint(dir(time))print(dir(list))提取数据结构:#可能有是这样的需求,一个人给你一个文件,读成文本,或者需要计算的公式,但是是字符串#如果是字典格式的{'name':'sb'},但是是文本temp1="{'name':'sb'}"print(temp1,type(temp1))temp2=eval(temp1)print(temp2,type(temp2))temp3="1+2"print(eval(temp3))#Note只能提取与要提取的格式相同的文本。摘要:本文以Python为基础,主要讲解递归的思想和匿名函数的相关知识,并举例说明了几种常用的匿名函数及其基本用法,如lambda、map、reduce、filter等,并简要说明了匿名函数的优点匿名函数。关于匿名函数,还有一点需要注意。匿名函数易于编写,适用于只有一个简单表达式的函数,避免函数名冲突的问题。下面的函数如果两个函数名冲突会覆盖上面函数的功能,比如:deffunc():print('aaa')deffunc():print('bbb')func()但是小编可以检测到两个同名函数,存在编辑异常。虽然可以正常运行,但显然不符合代码开发规范。没有名字的匿名函数肯定不会有重复的函数名。
