函数的补充
一、函数的递归
函数在调用阶段直接或间接的又调用自身
递归分为两分阶段
1.回溯:
相当于一次次重复的过程,这个重复的过程由复杂化逐渐变为简单化,直到有一个最终的结束条件
2.速推:
一次次往回推倒的过程
例题1
age(5) = age(4) + 2 age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 1 age(1) = 20 根据题目推到出如下规律: age(n) = age(n-1) + 2 age(1) = 18 根据此规律使用递归函数 def age(n): if n == 1: # 结束条件 return 20 return age(n-1) + 2 age(5) res = age(5) print(age(5)) # 打印结果:28
例题2
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]] 此列表可以利用for循环来进行取值, 但是在l列表中可以看出,这是列表套列表, 列表内是整型和列表两个值 如果需要将里面的值取出,需要进行多次操作, 这样就会很麻烦。 for i in l: if type(i) == int: print(i) else: for type(item) in i: print(item) else: for type(j) in item: print(j) ...... 所以可以利用递归函数来取值,这样就会很方便。 def get_num(l): # 定义函数里的形参为l for i in l: # 利用for循环取列表l中的数值 if type(i) is int: # 如果取出来的值为整型 print(i) # 打印整型这个值 else: get_num(i) get_num(l) # 结果将l列表中的整型数值全部取出来 递归函数不需要考虑循环的次数,只需要把握结束条件
补充
如果想让一个函数正常执行,可以在代码中输入pass或者...(英文),推荐使用pass def index(): pass ... index()
二、算法之二分法
算法是什么?
算法是解决问题的高效方法
二分法:
容器类型里面的数字必须有大小顺序
l = [1,2,3,4,5,6,7,8,9,45,78,89,99] 1.利用for循环 num = 89 for i in l: if i == num: print('find it') 首先,需要找到列表l中89这个值, 那么可以利用for循环来找,但是for循环会在这个列表中一个个值拿出来比较, 这样的话,对于python解释器来讲就会很繁琐, 同样,也会有方便的方法来进行取值 2.利用函数递归 target_num = 89 def get_num(l,target_num): # 传入列表l和所需要找的值 middle_index = len(l) // 2 # 获取列表中间的索引 if target_num > l[middle_index]: # 判断target_num这个值是否大于l[middle_index]:索引的的值,如果大于,则切取列表右半部分 num_right = l[middle_index + 1:] # 因为切分顾头不顾尾,所以中间那个值不要,将它的索引加一就是右边的数字了 get_num(num_right,target_num) # 递归调用get_num函数 elif target_num <l[middle_index]: # 判断target_num的数字是否小于l[middle_index]边的数字,如果大于,则切取列表右半部分 num_left = l[0:middle_index] # 顾头不够尾,以索引0开头,中间那个值不要,切分左半部分 get_num(num_left,target_num) # 递归调用get_num函数 else: print('find it',target_num) # # 打印结果 get_num(l,target_num) # 调用函数
三、三元表达式
def my_max(x,y): if x > y: return x else: return y 这是使用函数来比较两个数的大小,但是利用函数表达式,一行代码就能够表达出来 x = 30 y = 10 res = x if x > y else y # 如果if后面的条件成立返回if前面的值 否则返回else后面的值 print(res) # 打印结果30
三元表达式固定表达式
值1 if 条件 else 值2
条件成立 值1
条件不成立 值2
注意
三元表达式的应用场景只推荐只有两种的情况的可能下使用
is_free = input('请输入是否免费(y/n)>>>:') is_free = '免费' if is_free == 'y' else '收费' print(is_free)
四、列表生成式
1.常用的方法 l = ['tank','nick','oscar','sean'] l1 = [] # 新建一个列表 for name in l: # 利用for循环取l列表中的值 l1.append('%s_sb'%name) # 将所需要的符号添加到名字后面,追加到l1列表中 print(l1) # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb'] 2.利用列表生成式 l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb'] res = ['%s_DSB'%name for name in l] print(res) # ['tank_sb_DSB', 'nick_sb_DSB', 'oscar_sb_DSB', 'sean_sb_DSB']
五、字典生成式
l1 = ['name','password','hobby'] l2 = ['jason','123','DBJ','egon'] d = {} # 创建新字典 for i,j in enumerate(l1): d[j] = l2[i] print(d) # ['tank_sb_DSB', 'nick_sb_DSB', 'oscar_sb_DSB', 'sean_sb_DSB']
六、匿名函数
没有名字的函数
特点:临时存在用完就没了
def my_sum(x,y): return x + y my_sum( ) # 在此调用即可 res = (lambda x,y:x+y)(1,2) print(res) # 3 :左边的相当于函数的形参 :右边的相当于函数的返回值 匿名函数通常不会单独使用,是配合内置函数一起使用
七、内置函数
map 映射 l = [1,2,3,4,5,6] print(list(map(lambda x:x+1,l))) # 基于for循环,列表里的每个值都加一,然后再用列表括起来,就可以得到需要的结果 zip 拉链 # 基于for循环 l1 = [1,2,] l2 = ['jason','egon','tank'] l3 = ['a','b','c'] print(list(zip(l1,l2,l3))) # [(1, 'jason', 'a'), (2, 'egon', 'b')] # 可以将列表1,2,3的值在列表里以元组的形式存在,它的打印结果是一一对应的,多一个少一个都不会报错 filter 筛选 l = [1,2,3,4,5,6] print(list(filter(lambda x:x!=2,l))) # 利用filter来进行筛选,匿名函数lanbda来进行判断,可以看出不等于2,所以不需要2这个值,打印结果为[1,3,4,5,6] sorted 排序 l = [1,5,9,3,4,6,7] print(sorted(l)) # [1, 3, 4, 5, 6, 7, 9] 默认是从小到大进行排序 reduce 需要在模块里面导 打印结果只会是一个值 from functools import reduce l = [1,2,3,4,5] 当没有初始值 print(reduce(lambda x,y:x+y,l)) # 会将列表中所有值相加,打印结果为15 当有初始值 print(reduce(lambda x,y:x+y,l,5)) #首先l列表中第一个值会与5这个初始值相加,然后依次与后面的数值相加