十一、函数递归,算法二分法,三元表达式,列表字典生成式,匿名函数,内置函数

一、函数递归:

 函数的递归:函数在调用阶段直接或间接的又调用自身
 递归分为两个阶段
1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降
直到有一个最终的结束条件
2.递推:一次次往回推导的过程
3.递归函数在运行过程中一定要有出口,否则会无限循环下去
# 1.求4以内的和:
def sum_numbers(num):
    if num == 1:
        return 1
    return num + sum_numbers(num - 1)

    # 递归特点:函数内部自己调用自己:必须要有出口


nums = sum_numbers(4)
print(nums)
2.求age(1)=18,求age(5)
2 def age(n):
3     if n == 1:  # 必须要有结束条件
4         return 18
5     return age(n-1) + 2
6 res = age(5)
7 print(res)

二、算法二分法

  先将一个容器类型,分割一半看是否大于或者小于,然后分割出来,进行运算

# 算法:解决问题的高效率的方法
l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
# num = 345
# for i in l:
#     if num == i:
#         print('find it')

# 二分法:容器类型里面的数字必须有大小顺序
target_num = 666
def get_num(l,target_num):
    if not l:
        print('你给的工资 这个任务怕是没法做')
        return
    # 获取列表中间的索引
    print(l)
    middle_index = len(l) // 2
    # 判断target_num跟middle_index对应的数字的大小
    if target_num > l[middle_index]:
        # 切取列表右半部分
        num_right = l[middle_index + 1:]
        # 再递归调用get_num函数
        get_num(num_right,target_num)
    elif target_num < l[middle_index]:
        # 切取列表左半部分
        num_left = l[0:middle_index]
        # 再递归调用get_num函数
        get_num(num_left, target_num)
    else:
        print('find it',target_num)

get_num(l,target_num)
View Code

三、三元表达式

如:a=5 ,b =6,比较两个数大小

res = a if a>b else b  等同于   

if a>b:

  print(a)

else:

  print(b)

四、列表生成式

需求:把列表l里面字符串都添加_sb
 1. 第一种方法:
    l = ['tank','nick','oscar','sean']
# l1 = []
# for name in l:
#     l1.append('%s_sb'%name)
#     # l1.append(name + '_sb')  # 不推荐使用
# print(1)
#['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']

2.第二种方法:
    res =[%s_sb %name for name in l ]
    print(l)
#需求:将尾号有_sb都打印出来
l = ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb','jason_NB']
res =[name for name in l if endswith("_sb")]
# ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']

五.字典生成式

需求将下面两个列表合成字典
第一种方法:
l1 = ['name', 'password', 'hobby']
l2 = ['jason', '123', 'DBJ', 'egon']

d = {}
for i, j in enumerate(l1):
    d[j] = l2[i]   # i 是索引编号,j是l1列表所有值,然后添加到字典
print(d)
字典生成式方法:

l1 = ['jason','123','read']
d = {i:j for i,j in enumerate(l1) if j != '123'}
print(d)

六.匿名函数

# 匿名函数
"""没有名字的函数
匿名函数的特点:临时存在用完就没了
"""
def my_sum(x,y):
    return x + y

# res = (lambda x,y:x+y)(1,2)
# print(res)
# func = lambda x,y:x+y
# print(func(1,2))

# :左边的相当于函数的形参
# :右边的相当于函数的返回值
# 匿名函数通常不会单独使用,是配合内置函数一起使用,并且只能适合单一函数

七、内置函数

1.max(a,key)通常计算容器类型里面值大小

l = [1,2,3,4,5]
print(max(l)) # 内部是基于for循环的 最大值
d = {
    'egon':30000,
    'jason':88888888888,
    'nick':3000,
    'tank':1000
}

print(max(d,key=lambda name:d[name]))  max(参数,key键) 当输入key是比较的是字典值大小

比较薪资 返回人名
print(min(d,key=lambda name:d[name]))

2.常用内置函数  

 map zip filter sorted reduce
# 1.map  映射 将某个函数功能逐一添加到容器里面
l = [1,2,3,4,5,6]
# print(list('hello'))
print(list(map(lambda x:x+5,l)))  # 基于for循环
#2. 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')]
3. filter(func,lst)函数用于过滤序列,过滤掉不符合条件的元素,返回一个filter对象。如果需要转换成列表,则可以使用list()来转换

# 需求: 求1-10之间的奇数
lis1t1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# .定义函数求奇数
def func(x):
    return x % 2 == 1

# .调用filter()函数
result = filter(func, lis1t1)
print(list(result))
# [1, 3, 5, 7, 9]
4. reduce(func,lst),其中func必须要有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。
list1 = [1, 2, 3, 4, 5, 6]
# .导入模块
import functools


# .定义函数功能
def func(a, b):
    return a + b


result = functools.reduce(func, list1)
print(result)
# 21
# 5.sorted(self,reverse = True或False) 正常是升序
l = [1,2,3,4,5,6,7]
print(sorted(l,reverse=True)# 4.sorted(self,reverse = True或False) 正常是升序
reverse=False 是逆置

 



 

posted @ 2019-07-12 21:02  凯帅  阅读(157)  评论(0编辑  收藏  举报