递归函数

递归函数

函数的递归:函数在调用阶段直接或间接的又调用自身

# 补充知识
import sys
print(sys.getrecursionlimit())  # 查看python中最大递归次数,不是很准确
sys.setrecursionlimit(2000)  #可以自定义最大递归次数
# 实现递归调用,但是函数会无限制的递归下去,python解释器中有最大递归次数
def func(n):
    print('from func',n)
    func(n+1)  # 查看递归调用次数
func(1)
# 实现了递归调用,但是函数会无限制递归下去。
def index():
    print('from index')
    login()
    
def login():
    print('from login')
    index()
    
login()

递归的两个阶段

1,回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降。

直到有一个最终的结束条件。

2.递推:一次次往回推导的过程。

age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(1) = 18

age(n) = age(n-1) + 2  # n > 1
age(1) = 18  # n = 1
# 使用递归函数实现找出第一个人的年龄
def age(n):
    if n == 1:
        return 18
    return age(n-1)+2

res = age(5)
print(res)
# 将列表中的数字依次打印出来(循环的层数是你必须要考虑的的点)
s = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,]]]]]]]]]]]]]

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

get_num(s)

递归函数不要考虑循环的次数,只需要把握结束的条件即可。

# 补全函数语法的两种方式,一种是pass,一种是...。推荐使用pass
def index():
    # pass
    ...

利用递归实现二分法

算法:解决问题的高效率的方法

# 利用for循环找出num在列表中是否存在
l = [1,3,5,12,67,58,125,145,156,178,203,234,367,278,342,422]
num = 342
for i in l:
    if i ==num:
        print(f'find it {i}')
    else:
        print('没找到')

二分法

二分法:容器类型里面的数字必须有大小顺序

l = [1,3,5,12,67,58,125,145,156,178,203,234,367,278,342,422]
target_num = 666
def get_num(l,target_num):
    # 不在列表中
    if not l:
        print('你给的工资 这个任务怕是没法做')
        return
    # 获取列表中间的索引
    middle_index = len(l)//2
    print(l)
    # 判断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[:middle_index]
        # 再递归调用get_num函数
        get_num(num_left,target_num)

    else:
        print(f'find it {target_num}')

get_num(l,target_num)

三元表达式

# 三元表达式固定表达式,可以连续多个三元表达式
# 值1 if 条件 else 值2
#	条件成立 值1
#   条件不成立 值2

x = 99999
y = 999393993
res = x if x > y else y
print(res)  # 999393993

x = 1
y = 2
m = 3
n = 4
res = x if x > y else (m if m > n else n)
print(res)

is_free = input('请输入是否免费(y/n)')
is_free = '免费' if is_free == 'y'else '收费'
print(is_free)

username = input('username>>>>:')
res = 'NB'if username == 'jaosn' else '垃圾'
print(res)

列表生成式

l = ['tank','nick','oscar','sean']
l1 = []
for name in l:
    l1.append(f'{name}_sb')
    # l1.append('name_sb')  # 不推荐使用
print(l1)  # ['tank_sb', 'nick_sb', 'oscar_sb', 'sean_sb']

列表生成式

l = ['tank','nick','oscar','sean']

res = [f'{name}_DSB' for name in l ]
print(res)  # ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB']

l = ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB','jason']
res = [name for name in l if name.endswith('_DSB')]
print(res)  # ['tank_DSB', 'nick_DSB', 'oscar_DSB', 'sean_DSB']
# 先for循环依次取出列表里面的每一个元素
# 然后交由if判断,条件成立才会交给for循环前面的代码
# 如果条件不成立,当前的元素,直接舍弃

字典生成式

# 生成字典
l1 = ['name','password','hobby']
l2 = ['jason','123','DBJ','egon']
d = {}
for i,j in enumerate(l1):
    d[j] = l2[i]

print(d)  # {'name': 'jason', 'password': '123', 'hobby': 'DBJ'}

# 字典生成式
l1 = ['jason','123','read']
d = {i:j for i,j in enumerate(l1) if j!='123'}
print(d)  # {0: 'jason', 2: 'read'}
# 字典生成式中可以加if判断,条件成立,就会添加到字典中,否则就不会添加

# 集合生成式
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 0x05B81230>  就是一只老母鸡
for i in res1:
    print(i)  # 取出的鸡蛋 0,1,2,3,,5,6,7,8,9

匿名函数

匿名函数:没有名字的函数

匿名函数的特点:临时存在,用完就没了。

# 匿名函数lambda
res = (lambda x,y:x+y)(1,3)
print(res)  # 4

# 不是匿名函数
func = lambda x,y:x+y
print(func(1,3))  # 4

# lambda x,y:x+y
# :左边的相当于函数的形参
# :右边的相当于函数的返回值

匿名函数通常不会单独使用,是配合内置函数一起使用。

常用的内置函数

1,max(l,key=),min(l,key=)函数

l = [1,2,3,4,5]
print(max(l)) # 内部是基于for循环的

A-Z在ascii码中的序号是65-90
a-z在ascii码中的序号是977-122

d = {
    'egon':30000,
    'jason':888888,
    'nick':3000,
    'tank':1500,
}
def index(name):
    return d[name]
# 比较薪资,返回人名
print(max(d,key=lambda name:d[name]))  # jason
# lambda name:d[name] 将名字当做参数传入,返回的是以名字取到的薪资,比较的是薪资大小,最终返回的是人名
print(min(d,key=lambda name:d[name]))  # tank

map(func,iter)映射,将新的值与原来的值一一对应替换

l = [1,2,3,4,5,6]
print(list('hello'))
print(list(map(lambda x:x+5,l)))  # [6, 7, 8, 9, 10, 11]

zip(iter1,...) 拉链函数

l1 = [1,2]
l2 = ['jason','nick','tank']
l3 = ['a','b','c']
print(list(zip(l1,l2,l3)))  # [(1, 'jason', 'a'), (2, 'nick', 'b')]

zip()拉链函数,可以用来生成字典,

filter() 过滤

l = [1,2,3,4,5,6]
print(list(filter(lambda x:x!=3,l)))  # [1, 2, 4, 5, 6]

sorted() 排序

l = ['jason','egon','nick','tank']
print(sorted(l,reverse=True))  # ['tank', 'nick', 'jason', 'egon']

reduce() 缩减为一个值

from functools import reduce
l = [1,2,3,4,5,6]
print(reduce(lambda x,y:x+y,l,19))
# 当初始值不存在的情况下,按照下面的规律
# 第一次先获取两个元素 相加
# 之后每次获取一个与上一次相加的结果再相加

Never,Never,Never give up.
原文地址:https://www.cnblogs.com/zuihoudebieli/p/11182045.html