python函数应用

内容概要

  • 递归函数
  • 算法之二分法
  • 三元表达式
  • 列表生成器
  • 字典生成器
  • 枚举
  • 匿名函数

内容详细

一、递归函数

'''递归:函数在运行的过程中,直接或者间接调用了自身'''

1、递推:一层层往下推导答案,函数代码的复杂程度一定要随着递推不断减小
2、回溯:依据最后的结论往后推导出最初想要的答案
函数一定要由结束条件,并返回值

# 递推年龄 伪代码
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18

def get_age(n):
    if n == 1:
        return 18
    return get_age(n - 1) + 2


print(get_age(5))  # 26

# 打印列表里的所有数字
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, ]]]]]]]]]
# 1、循环列表里面的值,如果是数字则打印,不是数字则再次循环
# 2、注意这是个重复循环,而且每次循环的对象都不一样,所以用函数
# 3、当for循环循环一个空列表的时候会自动正常结束,相当于递归函数的结束条件

def get_int(l):
    for i in l:
        if type(i) is int:
            print(i)
        else:
            get_int(i)
get_int(l)

# 官网表示:python默认的最大递归深度为1000次
# import sys
# print(sys.getrecursionlimit())
# print(sys.setrecursionlimit(2000))

二、算法之二分法

# 什么是算法?
	解决问题的高效方法


# 在一个元素极多的有序列表里面判断一个数字是否存在
# 正常做法,for循环整个列表,比对数字,知道找到为止,但如果数据太庞大,会导致代码运行过久
# 使用二分法,利用索引找到列表中间的数字,与要找的数字比对大小,如果小了,目标数字则在中间数字的右边,切片获取右边的列表元素,再次用中间值比对,依次类推,知道找到目标数字

list1 = [1, 3, 4, 5, 6, 7, 8, 9, 11, 22, 24, 35, 55, 66, 77, 88, 99, 100, 233, 566, 788, 888]


def get_num(target_number, list):
    index = len(list) // 2

    if list1[index] > target_number:
        l_left = list1[:index]  # 注意这里是取mid_num中间数的索引值
        get_num(target_number, l_left)
    elif list1[index] < target_number:
        l_right = list1[index + 1:]
        get_num(target_number, l_right)
    else:
        print('找到了', target_number)


get_num(7, list1)

'''
二分法的缺陷:如果要查找的元素在开头,那么还没有依次查找的效率高
'''

三、三元表达式

# 当一段代码的输出只有两种结果的时候可以用三元表达式精简代码
def func(a, b):
    if a > b:
        print(a)
    else:
        print(b)


def func1(a, b):
    print(a if a > b else b)

func1(5, 8)  # 8

'''
条件成立采用if前面的值 if 条件 else 条件不成立采用else后面的值 
'''

四、列表生成式

# 为列表中的每个字符串加上'_DSB'
list = ['elijah', 'jason', 'kevin', 'tony']
# list1['%s_DSB' % i for i in list if i != 'jason']  # 错误示范
res = ['%s_DSB' % i for i in list]  # 注意不要用错列表生成器的赋值方式
print(res)  # ['elijah_DSB', 'jason_DSB', 'kevin_DSB', 'tony_DSB']

# 在生成的过程中去掉jason
res1 = [f'{i}_DSB' for i in list if i != 'jason']  # if 后的语句如果条件成立则添加进列表
print(res1)  # ['elijah_DSB', 'kevin_DSB', 'tony_DSB']

五、枚举

# enumerate
list = ['elijah', 'switch', 'zelda']

# enumerate(list) --> [(0, 'elijah'), (1, 'switch'), (2, 'zelda')]
for i, j in enumerate(list):
    print(i, j)
'''
enumerate(list)
	针对该方法使用for循环取值,每次会产生两个结果
		第一个是从0开始的数字
		第二个是被循环对象里面的元素
	还可以通过start来控制起始位置
'''

image

六、字典生成器

# 把下面两个列表生成一个字典
list1 = ['elijah', 'switch', 'zelda']
list2 = [2000000, 4500, 500]

res = {j: list2[i] for i, j in enumerate(list1)}

print(res)

七、匿名函数

# 匿名函数关键字  lambda
'''
语法格式
	lambda 形参:返回值
'''

lambda x(形参):x**2(返回值)
# 使用
print((lambda x:x**2)(8))  # 64
# 或者把匿名函数赋值给一个变量名
res = lambda x:x**2
res(3)

# 匿名函数一般只是配合其他函数一起使用,没有函数名
# map()  映射
list1 = [1, 3, 4, 5, 6, 7]
print(map(lambda x: x ** 2, list1))  # <map object at 0x00000265145DA588>
print(list(map(lambda x: x ** 2, list1)))  # [1, 9, 16, 25, 36, 49]
posted @ 2021-11-18 17:40  elijah_li  阅读(68)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中