day12 -- 函数递归、生成式、匿名函数和常用内置函数

目  录

一、函数递归

二、三元表达式、列表,字典生成式

三、匿名函数

四、常用内置函数

一、函数递归

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

函数递归的两个阶段:

  回溯:就是一次次的重复过程,在每一次重复时都会降低问题的复杂度,直到一个最终的条件。

  递推:就是往回推导的过程。

递归函数
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
"""
# 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)
示例
# 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)
二分查找法--递归函数
""""
三元表达式公式:
值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 就相当于初始值 第一个参数
"""
当初始值不存在的情况下,遵循以下规律:
第一次取两个值相加,得到的和与下一个元素相加
"""

 

原文地址:https://www.cnblogs.com/qinsungui921112/p/11176041.html