Python课程回顾(day14)
匿名函数
1.什么是匿名函数?
我们都知道,使用def+函数名的函数体是可以通过函数名加括号直接调用的,那么使用def定义的函数就称之为有名函数,那么匿名函数顾名思义就是没有名字的函数。
即匿名函数就是在定义时就相当于只产生一个变量的值而没有绑定任何名字的函数,所以只能在定义时使用一次就会被回收。
2.为什么要有匿名函数?
既然知道了匿名函数的特点,那么我们要用的就是匿名函数的这个特点,就是当我们写的某一个功能只需要在定义时运行一次就不再需要它的情况下,这种情况我们就应该使用匿名函数!但大多数情况下匿名函数是与其他函数配合使用完成功能的!
3.如何使用匿名函数?
应用1:匿名函数的基本定义
res = (lambda x,y:x+y)(1,2) print(res) 在lambda后直接传入参数 冒号后边直接跟进函数体代码 传入参数赋值给一个变量即可执行调用
应用2:配合max函数将字典内最大的value所对应的key取出
salaies = {'egon':3000, 'alex':10000000, 'yyh':100000, 'klf':2000}
print(max(salaies,key=lambda k:salaies[k])) # 将max换成min即可取出最小值
|字典的key |配合匿名函数 |传入字典的value|
应用3:配合sorted函数将字典内value从小到大进行排序,返回所对应的人名
salaies = {'egon':3000, 'alex':10000000, 'yyh':100000, 'klf':2000} def func(k): return salaies[k] print(sorted(salaies,key=lambda k:salaies[k])) #只是将max换成sorted即可 在末尾加入revers=True即代表发转排序
应用4:配合map完成将列表内的值添加dsb功能
l1 = ['ryc','lyp','yc','rzh'] l2 = [i+'dsb' for i in l1] #使用列表生成式将原列表内的值加上dsb res = map(lambda x:x+'dsb',l1) print(list(res)) #在python2中可以直接打印res,在python3中则会将map的返回值变为迭代器对象,所以要加list
应用5:配合reduce完成迭代相加
res = 0 for i in range(101): res += i 使用for循环完成相加 print(res) print(sum([i for i in range(101)])) 使用sum与列表生成式完成相加 from functools import reduce python2中自带reduce,python3中则需要导入 使用reduce与lamdba完成相加 print(reduce(lambda x, y: x + y, [i for i in range(101)])) reduce在python3中其实是有三个参数的,就是默认值,若不指定默认值的情况下 reduce会将for循环内取出的第一个值当作初始值
应用6:配合filter完成过滤掉列表内末尾不是sb的值
names = ['egon_sb', 'alex_sb', 'yyh_sb', 'klf'] new_name = [] for name in names: if name.endswith('sb'): new_name.append(name) 使用for循环完成 print(new_name) l1 = [name for name in names if name.endswith('sb')] 使用列表生成式完成 print(l1) res = filter(lambda name:name.endswith('sb'), names) 使用filter完成 print(list(res)) 加list原因等同map
函数递归
1.什么是函数递归?
函数递归,其实本身就是一个循环,准确的来说是函数嵌套调用的一种特殊形式,它特殊在调用一个函数的过程中,直接或者间接的又调用了函数的本身,这就是函数递归
2.为什么要有函数递归?
既然函数递归也是一种循环,那么理论上来说其实函数递归可以做的事情,我们之前学过的while循环都可以做,那么我们为什么还要使用递归呢?那肯定就是在某些情况之下使用递归要远远比使用while循环更加简便的!
3.如何使用函数递归?
在使用递归之前一定要满足两个原则:
⑴:每进入下一层递归,问题的规模必须要有所减少,不能进入一种死循环状态
⑵:要有一个明确结束递归的条件或者要有进入下一层递归的条件,要在某个条件成立之后结束递归
递归必然的两个阶段:
⑴:回溯:即在不满足或没有解决问题之前的一种循环,在遵循递归两个原则的基础上进行的过程就叫做回溯。
⑵:递推:在满足条件或解决问题之后,往上一层层的结束掉函数的过程就叫做递推。
递归练习1:使用递归取出列表L中的所有数字
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]] def akm(l): for item in l: 从列表内依次取值,因为是列表内一层层的嵌套,所以每个列表可以看出都是有两个值,一个是数字,一个是列表 if type(item) is list: 判断类型是否是列表 akm(item) 使用递归再次进行循环判断 else: print(item) 若从列表中取出的不是列表就打印 akm(l)
递归扩展之‘二分法’取值:【二分法是算法的一种,而算法则是用于高校解决问题的思路】
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9] 从列表内找到你想找到的值,若列表内的值较多的情况下,使用for循环则会过多占用内存资源 def beanry_search(find_num,nums): 使用二分法递归取值则会大大降低内存占用 print(nums) if len(nums) == 0: print('no excits') 若列表的长度为0,则代表列表内没有找到该值 return mid_index = len(nums) // 2 先将列表内最中间的值的索引找出 <--------------------- if find_num > nums[mid_index]: 判断要找的值是否大于中间的那个值 ↑ nums = nums[mid_index+1:] 成立之后形成新列表 新列表是中间值的右半部分列表 ↑ beanry_search(find_num,nums) 使用递归再次运行函数体功能 -------------------------↑ elif find_num < nums[mid_index]: 判断要找的值是否小于中间的那个值 ↑ nums = nums[:mid_index] 成立之后形成新列表 新列表是中间值的左半部分列表 ↑ beanry_search(find_num,nums) 使用递归再次运行函数体功能 -------------------------- else: print('is here!')
def beanry_search(7,nums)
面向过程编程
所谓面向过程编程不是要教你具体怎么去写程序,而是要让你知道,在你编写一个程序或功能的时候,大脑里要时时刻刻想着这个程序的一个过程,通俗来讲就是每一步要干什么,那么基于这个过程的前提下,你编写的程序只要语法上不出现错误,基本很快就可以实现,至少你最底层的逻辑思维不会太乱。所以我们以后在写功能或程序时,一定要先把要编写的功能的过程思考或写一遍,比如我们的用户认证功能:
首先我们要接收用户输入
然后我们进行检验(格式,存不存在,密码是否匹配)
然后成功后干什么,失败后干什么
再细一点失败之后是否要找回密码
找密码要怎么去找
大概就是这样的流程。
总的来说就是我们需要在编写程序之前要先用心思考,不仅要思考过程,也要基于平时我们所接触的各种类似功能的信息进行添加功能之类的。