day12 -- 函数递归、生成式、匿名函数和常用内置函数
2019-07-12 14:52 在上海的日子里 阅读(227) 评论(0) 编辑 收藏 举报目 录
一、函数递归
二、三元表达式、列表,字典生成式
三、匿名函数
四、常用内置函数
一、函数递归
函数的递归:函数在调用阶段直接或间接的又调用自己。
函数递归的两个阶段:
回溯:就是一次次的重复过程,在每一次重复时都会降低问题的复杂度,直到一个最终的条件。
递推:就是往回推导的过程。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
递归函数 def age(n): if n == 1: # 必须要有结束条件 return 18 return age(n-1) + 2 res = age(5) print(res)
递归函数不需要考虑循环的次数,只需要考虑终止的条件即可。
算法:就是使程序高效率执行的方法。
示例:二分查找法--使用递归函数
空函数函数体的替代方法:
def index(): # pass # 第一种顶替方式(推荐使用pass) # ... # 第二种顶替方式
二、三元表达式、列表,字典生成式
三元表达式固定公式:
"""" 三元表达式公式: 值1 if 条件 值2 条件成立 值1 条件不成立 值2 """
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] def get_num(x): for i in x: # 这里边的X指得是get_num 里面的形参,所以两者要对应 if type(i) is int: print(i) else: get_num(i) get_num(l)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# list = [1,3,5,12,57,89,101,103,147,167,179,189,345] def get_num(x,y): mid = len(y) // 2 # 中间位置索引 if x > y[mid]: r_li = y[mid+1:] get_num(x,r_li) # 函数无论何时在何处调用都要看有没有添加参数 elif x < y[mid]: l_li = y[0:mid] get_num(x,l_li) else: print('find it! %s'%x) get_num(189,list)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
"""" 三元表达式公式: 值1 if 条件 值2 # 条件成立 值1 # 条件不成立 值2 # """ # 三元表达式的应用场景:只在有两种选择的情况下使用 choice = input('请输入你的选择y/n:') res = '收费!' if choice == 'y' else '不收费' print(res)
列表生成式
# 列表生成式练习 ''' 需求:将列表中的人名按照“_sb”的格式进行修改 l = ['tank','nick','oscar','sean'] ''' l = ['tank','nick','oscar','sean'] new_l = [] # 方法1:for循环 for i in l: new_l.append('%s_sb'%i) print(new_l) # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']
''' 需求2:将列表['tank_sb', 'nick_sb', 'oscar_nb', 'sean_sb']后缀为‘_nb’的字符串去掉 ''' li = ['tank_sb', 'nick_sb', 'oscar_nb', 'sean_sb'] res = [name for name in li if name.endswith('_sb')] ''' 列表生成式:就是for循环,将元素提到for循环前面来了 首先进行for循环,将取出的元素放到if条件里去做判断,如果条件成立就返回给for循环前面的变量 否则直接舍弃。。。 ''' print(res)
字典生成式
''' l1 = ['name','password','hobby'] l2 = ['jason','123','DBJ'] 需求:将以上两个列表生成字典形式 ''' l1 = ['name','password','hobby'] l2 = ['jason','123','DBJ'] # 利用关键字enumerate 枚举法 d = {} for i,j in enumerate(l1): print(i,j) d[j] = l2[i] print(d)
# 字典生成式 l2 = ['jason','123','DBJ'] res = {i:j for i,j in enumerate(l2)} print(res) # {0: 'jason', 1: '123', 2: 'DBJ'} d = {i:j for i,j in enumerate(l2) if j != '123'} # 字典生成式与三元表达式 print(d)
注意:当字典生成器或列表生成器与三元表达式合用的时候,注意不能加else。for循环会与else搞混。
集合生成器
l1 = ['jason','123','read'] d = {i:j for i,j in enumerate(l1) if j != '123'} print(d) # {0: 'jason', 2: 'read'}
res = {i for i in range(10) if i != 4} print(res) # {0, 1, 2, 3, 5, 6, 7, 8, 9} res1 = (i for i in range(10) if i != 4) # 这样写不是元组生成式 而是生成器表达式 print(res1) # <generator object <genexpr> at 0x0082D8D0> for i in res1: print(i,end=" ") # 0 1 2 3 5 6 7 8 9
三、匿名函数
''' 匿名函数:没有名字的函数,临时启用的函数用完就没有了 多用于内置函数里面 '''
示例:求和函数
#示例:求和函数 def sum(x,y): return x+y res = sum(1,2) print(res) # 3 #用匿名函数实现 res = (lambda x,y:x+y)(1,2) print(res) # 3 res = lambda x,y:x+y print(res)
''' 匿名函数总结: 左边的相当于函数形参;右边的相当于函数返回值; 匿名函数一般不单独使用,一般会和内置函数一起。 '''
四、常用内置函数
""" 常用内置函数 map zip filter sorted reduce """
# map li = [1,2,3,4,5,6] print(list(map(lambda x:x+5,li))) # lambda 对li进行for循环,取出元素进行return x+5的操作。 str = 'erqw' print(list(str)) # ['e', 'r', 'q', 'w'] 由结果可知,list本质就是for循环。
# zip li1 = ['jason','tank','sean'] li2 = [1,2,3] li3 = ['绳子','尺子','笔','饭盒'] # 多出来的饭盒因为没有对应的关系,所以被舍去 print(list(zip(li1,li2,li3))) # 基于for循环 # [('jason', 1, '绳子'), ('tank', 2, '尺子'), ('sean', 3, '笔')]
# filter li = [1,2,3,4,5,6] # 去掉li中的6 print(list(filter(lambda x: x != 4,li))) # [1, 2, 3, 5, 6]
# sorted # 默认是从小到大排序 li = ['tank','jason','egon','sean'] print(sorted(li)) # ['egon', 'jason', 'sean', 'tank'] # 添加参数reverse ,变成从大到小 print(sorted(li,reverse=True)) # ['tank', 'sean', 'jason', 'egon']
# reduce from functools import reduce li = [1,2,3,4,5] print(reduce(lambda x,y: x+y ,li,10)) # 10 就相当于初始值 第一个参数 """ 当初始值不存在的情况下,遵循以下规律: 第一次取两个值相加,得到的和与下一个元素相加 """