ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归、匿名函数及列表、字典生成式

2021-11-19 08:31:55  阅读:122  来源: 互联网

标签:name 递归 res 生成式 list 列表 print new 字典


递归、匿名函数及列表、字典生成式

image

1、递归函数

# 1、递归函数
# 递归函数就是函数在执行的时候直接或间接的调用函数本身的函数
'''递归函数遵循以下两个原则
    1、递推:一步步往下推导出结论,且每推导一次,距离所要追求的结果的距离越近,复杂度都要稍微有所下降
    2、回溯:从推导得到的结果再一步步回传,直到的得到自己需要的结果
    且递归一定要有结束条件
'''


# 练习 1
# 五个同学,第一个比第二个大2岁,第二个比第三个大2岁,依次类推,第五个同学20岁,求第一位同学的年龄
# 首先定义一个函数
# def get_age(n):
#     # 先定义第五个同学是20岁
#     if n == 5:
#         return 20
#     # 从第一位开始,每个同学都比后面大两岁
#     return get_age(n+1)+2
# 
# res = get_age(1)
# print(res)
# 练习 2
# 用倒序的方式打印列表里的每一个元素
list = [1,2,3,4,5,6]
count = 5
def index(a):
    if a < 0:
        return
    print(list[a])
    a -= 1
    index(a)
index(count)
# 练习 3 计算age1
# age1 = age2 + 1
# age2 = age3 + 2
# age3 = age4 + 3
# age4 = age5 + 4
# age5 = 20
# 求age1
def get_age(n, a):
    if n == 5:
        return 20
    a += 1
    return get_age(n + 1, a) + a


res = get_age(1, 0)
print(res)
# 练习 4 把下列列表里的每一个值打印出来,组成新的列表
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, ]]]]]]]]]]]]]]
# # 定义一个空列表,用于接收元素
new_list = []
# 定义一个函数,打印出列表里的每一个元素
def get_element(list):
    # 先循环列表里的每一个值
    for line in list:
        # 判断元素的数据类型
        if type(line) is int:
            new_list.append(line)
        else:
            get_element(line)
    return new_list

res = get_element(l)
print(res)
# 练习 5 生成斐波那契数列
# 定义一个函数用来生成斐波那契数列
def feibo_naqi(n):
    if n <= 1:
        return n
    else:
        return (feibo_naqi(n-1)+feibo_naqi(n-2))

# 定义一个空列表用来接受斐波那契数列
feibo_list = []
# 获取用户想要生成的数列个数
numbers = input('输入你想生成的数列个数:').strip()  # 去除用户输入内容的首尾特殊字符
# 把用户的输入转换成整型
numbers = int(numbers)
# 对用户输入进行判断
if numbers < 0:
    # 如果用户输入的值小于O,则提示用户重新输入
    print('请输入正数')
else:
    # 如果输入的是正数,则打印个题标
    print('斐波那契数列',end='')
    # 利用for循环获取斐波那契函数生成的数据
    for i in range(numbers):
        feibo_list.append(feibo_naqi(i))
    print(feibo_list)

image

2、算法之二分法

# 算法
# 所谓算法就是解决问题的高效方法
'''二分法
    二分法的使用
    当我们在一个很庞大的数据里找一个我们想要的数据值的时候,采用二分法,先把整个数据分为两部分
    把左边最大的值和我们要找的值进行比较,若是大于要找的值,则把左边部分再分成两份以此类推
    使用二分法的前提是,所要查找的数据源必须是有序的
'''
# 练习,利用二分法从一个列表里找到一个我们想要的值
digit_list = [12, 23, 34, 45, 56, 67, 78, 89, 90, 123, 234, 345, 567, 789, 899]


# 从上述列表中找到234
# 先定义一个函数方便我们找到我们想要的值
def find_digit(l,n):
    # 先判断列表是否为空
    if len(l) == 0:
        print('列表为空')
        return
    middle_index = len(l)//2
    if n > l[middle_index]:
        right_list = list(l[middle_index+1:])
        print(right_list)
        return find_digit(right_list,n)
    elif n < l[middle_index]:
        left_list = list(l[:middle_index])
        print(left_list)
        return find_digit(left_list,n)
    else:
        print('找到了')
        return n

res = find_digit(digit_list,234)
print(res)

image

3、三元表达式

# 三元表达式
# 所谓的三元表达式就是当结果是二选一的情况时,利用三元表达式可以大大减少代码量
# 语法结构
'''
if 条件成立时的结果 if 条件 else if条件不成立时返回的结果
'''


res = '欢迎光临' if int(input('请输入你的选择:')) == 1 else '欢迎下次再来'
print(res)

'''
三元表达式一般尽量不要嵌套,会让代码看起来很难理解
'''
print('欢迎光临') if int(input(':')) == 1 else print('下次再来哦')

image

4、列表、字典生成式

# 列表生成式
# 列表生成式是为了快速生成一个新的列表
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
# 现要求在列表里的每个元素后面加上'_nb',但是列表内元素顺序不变,且元素用列表存储
# 方法一:
# 建立一个空列表,把修改后的元素添加到空列表里
new_list = []
# for循环取列表的每一个索引
for i in range(len(name_list)):
    # 把修改后的元素添加到列表里
    new_list.append('%s_nb' % name_list[i])
# 打印列表
print(new_list)
# 方法二:
# 列表生成式
# 语法结构
'''
变量名 = [i,for i in 列表名 if 条件]
列表生成式的先后执行顺序是:
先循环从列表里取出一个元素,然后再根据if后面的条件判断,把取出的元素拿出来,
循环执行上面的步骤,直到把列表里的所有元素取完为止,然后把拿出来的元素用中括号括起来
!切记,列表生成式里不能加else判断语句,因为有for+else和if+else两种,解释器会混淆,所以,不能加else条件
'''
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
n = [f'{i}_nb' for i in name_list if i != 'jason']
print(n)
# 字典生成式
# 字典生成式是为了快速的生成一个字典
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
# 把上述列表加上对应的k值生成字典
# 方法一:
# 先建立一个空的字典,通过循环列表里的索引把元素添加到字典里
new_dic = {}
for i in range(len(name_list)):
    # 把元素添加到字典里
    new_dic[i] = name_list[i]
# 打印新的字典
print(new_dic)
# 方法二:枚举
# 字典生成式
# 语法结构
'''
enumerate(name_list)
针对该方法循环取值,每次都会产生两个结果
1、默认会从0开始生成数字
2、返回被循环列表里的值
变量名 = {k值:v值 for k v in enumerate(name_list)if 条件}

'''
name_list = ['jason', 'jenny', 'john', 'tony', 'tom']
new_dic = {k:v for k,v in enumerate(name_list) if v != 'jason'}
print(new_dic)
# 迭代器
tup = (i for i,j in enumerate(name_list))
print(tup)

image

5、匿名函数

# 匿名函数
# 所谓匿名函数就是没有名字的函数
# 语法结构
'''
lambda 形参:返回值
匿名函数一般不单独使用,常常是和其他函数连用
'''
res = lambda x: x**2
print(res)

l = [1,2,3,4,5,6,7,8,9]
# 把列表里的每一个值都平方后放进一个新的列表里
# 方法一:
new_list = []
def index(n):
    for i in n:
        new_list.append(i**2)
    return new_list


res = index(l)
print(res)  # [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 方法二:
# 匿名函数
# 映射函数 map()
'''
映射函数把列表里的每一个值当成实参传给匿名函数,最后生成一个列表
'''
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda x: x ** 2, l)))  # [1, 4, 9, 16, 25, 36, 49, 64, 81]

image

标签:name,递归,res,生成式,list,列表,print,new,字典
来源: https://www.cnblogs.com/PyLy/p/15575401.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有