Python基础之day05-强化练习

Python基础之day05-强化练习


代码仓库地址: https://gitee.com/andox_yj/python

一、递归函数

  1. 介绍:如果一个函数在内部调用自己本身的话,这个函数就是递归函数。

  2. 注意:递归函数一般有终止条件,不然会一直嵌套调用下去,最多嵌套调用996次后程序就会报错

  3. 递归函数调用过程
    在这里插入图片描述

    # 一、递归用法
    def function(num):
        # 2.结束条件
        if num < 10:
            print(num)
            # 3.调用自己
            function(num + 1)
    
    # 1.函数入口
    function(1)
    
    
    # 二、递归应用:计算阶乘
    def calNum(num):
        if num >= 1:
            result = num * calNum(num - 1)
        else:
            result = 1
        return result
    
    ret = calNum(3)
    print(ret)  # 6
    

二、eval函数

  1. eval函数介绍:用来执行一个字符串表达式,并返回表达式的值。
    注意:
    • 只会解析一层,既如果这个字符串里有变量的值依然是字符串,则会报错。
    • 如果字符串里的变量没有定义,则会报错。
  2. 表达式介绍:由值、变量和操作符(或叫运算符)的组合,单独的值或变量也是表达式。例如:a=10; a * 3
  3. 代码示例
    # 1、将str01里的a解析成变量后再运算。
    a = 10 + 5
    str01 = 'a + 20'
    print(str01)  # <class 'str'> a + 20
    print(eval(str01))  # <class 'int'> 35
    
    # 2、如果需要单独解析变量b,则需要在str01表达式中再添加一个eval来解析b
    b = "10 + 5"
    str01 = 'eval(b) + 20'
    print(str01)  # <class 'str'> eval(b) + 20
    print(eval(str01))  # <class 'int'> 35
    
    # 3、将字符串转成对应类型数据
    list01 = '[1, 2, 3]'
    dict01 = '{"name": "zhang", "age": "18"}'
    num = '10'
    float01 = '10.1'
    print(type(eval(list01)))  # <class 'list'>
    print(type(eval(dict01)))  # <class 'dict'>
    print(type(eval(num)))  # <class 'int'>
    print(type(eval(float01)))  # <class 'float'>
    
    # 4.拼接变量名取值
    aa = "as"
    bb = "df"
    asdf = 10
    print(eval(aa + bb))  # 10
    

三、lambda匿名函数

  1. 介绍:用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。
  2. 代码示例
    # 用法:变量名 = lambda [arg1 [,arg2,.....argn]]:expression
    # 1、lambda用法
    sum = lambda arg1, arg2: arg1 + arg2
    # 将lambda函数赋值给sum,当使用sum时需要传递参数
    print("Value of total : %s" % sum(10, 20))
    print("Value of total : %s" % sum(20, 20))
    
    
    # 2、lambda排序字符串
    str01 = ['foo', 'card', 'bar', 'aaaa', 'abab']
    # key接收一个函数,并将列表中的每个元素作为参数传入该函数,函数返回值与每个元素对应后,sort根据返回值对元素进行排序。
    # lambda将每个字符串的每个字符转成列表再用set集合去重,len计算长度后返回sort进行排序
    str01.sort(key=lambda x: len(set(list(x))))
    print(str01)  # ['aaaa', 'foo', 'abab', 'bar', 'card']
    
    
    # 3、lambda排序二维列表
    list01 = [[1, 7], [1, 5], [2, 4], [1, 1]]
    # 按照一维来排序
    list01.sort()
    print(list01)  # [[1, 1], [1, 5], [1, 7], [2, 4]]
    # 按照二维来排序,key接收一个函数,并将列表中的每个元素作为参数传入该函数,lambda 返回每个参数的第二个值给sort排序
    list01.sort(key=lambda x: x[1])
    print(list01)  # [[1, 1], [2, 4], [1, 5], [1, 7]]
    
    
    # 4、lambda排序字典
    students = [
        {"name": "zhangsan", "age": 18},
        {"name": "lisi", "age": 19},
        {"name": "wangwu", "age": 17}
    ]
    # 将字典的key或者value返回给sort进行排序
    students.sort(key=lambda x: x["name"])
    print(students)  # [{'name': 'lisi', 'age': 19}, {'name': 'wangwu', 'age': 17}, {'name': 'zhangsan', 'age': 18}]
    
    
    # 5、lambda+filter对列表过滤
    numbers_list = [2, 6, 8, 10, 11, 4, 12, 7, 13, 17, 0, 3, 21]
    # filter返回一个filter对象,可用列表接收这个对象存放每个过滤出来的元素
    # filter接收一个函数,一个可迭代对象,将每个元素传入函数里面过滤。
    filtered_list = list(filter(lambda num: (num > 7), numbers_list))
    print(filtered_list)  # [8, 10, 11, 12, 13, 17, 21]
    

四、range函数

  1. 介绍:range函数根据传入的整数范围参数,生成一个迭代器,既装有赠书的列表
  2. 代码示例
    # 使用:range(start, stop[, step])
    # 1、默认从0开始到结束值
    a = list(range(5))
    print(a)  # [0, 1, 2, 3, 4]
    
    # 2、包括开始值不包括结束值
    b = list(range(1, 6))
    print(b)  # [1, 2, 3, 4, 5]
    
    # 3、给定步长
    c = list(range(0, 10, 2))
    print(c)  # [0, 2, 4, 6, 8]
    
    # 4、倒序输出,需要指定步长为-1
    b = list(range(3, -3, -1))
    print(b)  # [3, 2, 1, 0, -1, -2]
    
    # 5、在for循环中使用
    for e in range(10):
        print(e)
    

五、列表、字典、集合、元祖推导式

  1. 介绍:推导式是根据一组数据序列,逐条经过处理后,生成一个新的数据序列,其可对每个数据添加条件判断后再处理。
  2. 代码示例
    """
    列表推导式 [表达式 for 变量 in 列表 [if 条件] ]
    字典推导式 {key:value for key in 列表 [if 条件] }
    集合推导式 {表达式 for 变量 in 列表 [if 条件] }
    元祖推导式 (表达式 for 变量 in 列表 [if 条件] )
    """
    # ################# 1、列表推导式 ####################
    # 原始列表值
    old_list = [1, 2, 3, 4, 5]
    
    # 不带if的列表推导式
    new_list = [i + 1 for i in old_list]
    print(new_list)  # [2, 3, 4, 5, 6]
    
    # 带if的列表推导式,既先判断条件满足后再进行处理。
    new_list_if = [str(i) for i in old_list if i > 2]
    print(new_list_if)  # ['3', '4', '5']
    
    # 两个for循环
    list_2 = [(x, y) for x in range(3) for y in range(2)]
    print(list_2)  # [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
    
    # 三个for循环
    list_3 = [(x, y, z) for x in range(3) for y in range(2) for z in range(1)]
    print(list_3)  # [(0, 0, 0), (0, 1, 0), (1, 0, 0), (1, 1, 0), (2, 0, 0), (2, 1, 0)]
    
    # 三个for循环加if
    list_3_if = [(x, y, z) for x in range(3) for y in range(2) for z in range(1) if y == 1]
    print(list_3_if)  # [(0, 1, 0), (1, 1, 0), (2, 1, 0)]
    # 以上等同于下面这种写法:
    list_3_if = []
    for x in range(3):
        for y in range(2):
            for z in range(1):
                if y == 1:
                    list_3_if.append((x, y, z))
    print(list_3_if)  # [(0, 1, 0), (1, 1, 0), (2, 1, 0)]
    
    # 列表推导式案例:计算30以内可以被3整除的整数
    multiples = [i for i in range(30) if i % 3 == 0]
    print(multiples)  # [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
    
    # ################# 2、字典推导式 ####################
    # 原始列表值
    old_list = ['Google', 'Python', 'Mac']
    old_dict = {'name': "张三", 'age': '18', 'gender': "man"}
    
    # 不带if的字典推导式
    new_dict = {key: len(key) for key in old_list}
    print(new_dict)  # {'Google': 6, 'Python': 6, 'Mac': 3}
    # 如果直接循环字典,输出的是字典的key
    new_dict = {key: len(value) for key, value in old_dict.items()}
    print(new_dict)  # {'name': 2, 'age': 2, 'gender': 3}
    
    # 带if的字典推导式
    new_dict = {key: eval(value) + 1 for key, value in old_dict.items() if key == "age"}
    print(new_dict)  # {'age': 19}
    
    # ################# 3、集合推导式 ####################
    # 既元素没有重复,包裹在大括号中
    square = {i ** 2 for i in (1, 2, 3, 4, 5)}
    print(square)  # {1, 4, 9, 16, 25}
    
    # 集合案例1:字符串去重
    set_srt = {s for s in 'asdlvabsdfasdf'}
    print(set_srt)  # {'l', 's', 'f', 'b', 'd', 'a', 'v'}
    print(type(set_srt))  # <class 'set'>
    
    # 集合案例2:输出不是abc的字符,且不重复,
    set_srt = {s for s in 'asdlvabsdfasdf' if s not in 'abc'}
    print(set_srt)  # {'v', 'l', 's', 'f', 'd'}
    print(type(set_srt))  # <class 'set'>
    
    # ################# 4、元素推导式 ####################
    new_tuple = (x for x in range(1, 10))  # 返回的是生成器对象
    # 使用 tuple() 函数,可以直接将生成器对象转换成元组
    print(tuple(new_tuple))  # (1, 2, 3, 4, 5, 6, 7, 8, 9)
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值