zoukankan      html  css  js  c++  java
  • Python Day 15 递归、匿名函数、内置函数、高阶函数(map,reduce、filter)

      阅读目录

        内容回顾

        生成器的send方法

        递归

        匿名函数

        内置函数

      ##内容回顾

    #1.带参装饰器 - 自定义 | wraps
    
    def wrap(info)
        def outer1(func):
            from functools import wraps
            @wraps(func)
            def inner(*args, **kwargs):
                # 需要外界的参数
                return func(*args, **kwargs)
            return inner
        def outer2(func):
            def inner(*args, **kwargs):
                # 需要外界的参数
                return func(*args, **kwargs)
            return inner
        if info == '1':
            return outer1
        return outer2
        
    # outer = wrap('1')
    # @outer
    @wrap('1')
    def fn():pass
    
    
    #2.可迭代对象:有__iter__()方法的对象,并且调用__iter__()方法得到迭代器对象
    
    #3.迭代器对象:有__next__()方法的对象,并且调用__next__()方法从前往后逐一取值
    # 不依赖索引取值,但必须从前往后依次取值(无法获取索引,也无法计算长度)
    
    #4.for循环迭代器
    1)得到操作对象的迭代器对象
    2)通过__next__()进行取值
    3)自动处理StopIteration异常,结束循环
    
    #5.枚举对象:为被迭代的对象添加迭代索引
    
    #6.生成器:语法同函数,内部包含yield关键字,函数名() 不是函数调用,而是得到生成器对象 -> 就是自定义的迭代器对象
    
    
    with open('abc.txt', 'r', encode='utf-8') as f:
        for line in f:
            pass
        
    def fn():
        # ...
        yield 1
        # ...
        yield 2
    obj = fn()
    res = next(obj) # 1
    fn().__next__() # 1
    fn().__next__() # 1
    fn().__next__() # 1

      ##生成器的send方法

    # send的工作原理
    # 1.send发生信息给当前停止的yield,所以在send之前就可以发送个send(None)值,或者使用next(obj)方法
    # 2.再去调用__next__()方法,生成器接着往下指向,返回下一个yield值并停止
    
    # 案例:
    persons = ['张三', '李四', '王五', '赵六', '钱七']
    
    def order(persons):
        for i in range(len(persons)):
            if i == 0:
                print('%s在面试' % persons[0])
            else:
                print('%s叫%s在面试' % (name, persons[i]))
            print('%s面试完毕' % persons[i])
            name = yield persons[i]
    
    obj = order(persons)
    for i in range(len(persons)):
        if i == 0:
            p = obj.__next__()
        else:
            p = obj.send(p)
        print('=============================')

      ##递归

    # 递归:
    # 函数直接或间接调用本身,都称之为递归
    # 回溯:找寻答案的过程
    # 递推:推出结果的过程
    
    # 前提条件:
    # 1.递归必须有出口
    # 2.递归回溯递推的条件一定有规律
    
    
    # 案例一:获得第 count 个人的年纪
    def get_age(count):
        if count == 1:
            return 58
        # 第 九...一 个人 - 2
        age = get_age(count - 1) - 2
        return age
    
    age = get_age(3)
    print(age)
    
    
    # 案例二:求n的阶乘  5! = 5 * 4 * 3 * 2 * 1 = 120
    # 5! = 5 * 4!
    # 4! = 4 * 3!
    # 3! = 3 * 2!
    # 2! = 2 * 1!
    # 1! = 1
    def jiecheng(n):
        if n == 1 or n == 0:
            return 1
        ji = n * jiecheng(n - 1)
        return ji
    res = jiecheng(5)
    print(res)

      ##匿名函数

    def fn(*args, **kwargs):
        # 函数体
        return '返回值'
    
    # 匿名函数:
    # 1.匿名函数没有函数名
    # 2.匿名函数的关键字采用lambda
    # 3.关键字 lambda 与标识函数功能体 : 之间一定是参数,所以省略()
    # 4.匿名还是没有函数体,只有返回值,所以函数体和返回值的return关键字都省略了
    
    lambda *args, **kwargs: '返回值'
    
    # 注意:
    # 1.参数的使用和有名函数一样,六种形参都支持
    # 2.返回值必须明确成一个值,可以为单个值对象,也可以为一个容器对象
    # 3.用变量接收,该变量就存放了匿名函数的函数地址
    #       -- 函数又有名字了,用完也不能被回收了,匿名函数匿名也没意义了
    a = lambda *args, **kwargs: '返回值1', '返回值2' print(a) # (<function <lambda> at 0x0000022D0B7E88C8>, '返回值2') # 返回值1 print(a[0]()) # 正确返回两个值: 主动构成成容器类型 lambda *args, **kwargs: ('返回值1', '返回值2')

      ##内置函数

    #max和min内置函数
    # max结合内置函数来使用
    # max:工作原理
    # 1.max内部会遍历iter,将遍历结果一一传给lambda的参数x
    # 2.依据lambda的返回值作为比较条件,得到最大条件下的那个遍历值
    # 3.对外返回最大的遍历值
    max(iter, lambda x: x)
    
    
    # min工作原理一样,得到的是最小值
    
    #示例:
    print(max(10, 2000, 300, 5))
    print(max('azbd'))
    
    dic = {
        'owen': (1, 88888),
        'zero': (2, 66666),
        'tom': (3, 77777),
    }
    
    def fn(k):
        print(k)
        # return k
        # return dic[k][0]
        return dic[k][1]
    res = max(dic, key=fn)
    print('====================')
    print(res)
    
    def max(iter, fn)
        for v in iter:
            res = fn(v)
            # 用res作为比较对象
        return 用fn提供的返回值作为比较对象,得到最大的v
    
    
    # max结合匿名函数
    dic = {
        'owen': (1, 88888),
        'zero': (2, 66666),
        'tom': (3, 77777),
    }
    print(max(dic, key=lambda k: dic[k][1]))  # 求薪资最大的人
    print(max(dic, key=lambda k: dic[k][0]))  # 求员工号最大的人
    print(max(dic, key=lambda k: k))  # 求名字最大
    print('=====================')
    # min
    print(min(dic, key=lambda k: dic[k][1]))  # 求薪资最小的人
    print(min(dic, key=lambda k: dic[k][0]))  # 求员工号最小的人
    print(min(dic, key=lambda k: k))  # 求名字最小
    # map:映射  把一个列表按照我们自定义的映射规则映射成一个新的列表
    # def fn(x):
    #     return x * 2
    # res = map(fn, [3, 1, 4, 2, 5])
    # print(list(res))
    
    dic = {
        'owen': 3,
        'zero': 5
    }
    res = map(lambda k: (k, dic[k] * 2), dic)
    print(list(res))  # [('owen', 6), ('zero', 10)]
    # for v in res:
    #     print(v)
    # names=['alex','lxx','wpx','yxx']
    # res = map(lambda name:name+'dSB',names)
    # print(list(res))
    # reduce:合并 把多个值合并成一个结果
    from functools import reduce
    res
    = reduce(lambda x, y: x + y, [3, 1, 2, 4, 5]) # 所以元素的和
    print(res)
    res
    = reduce(lambda x, y: x * y, [3, 1, 2, 4, 5]) # 所有元素的积
    print(res)
    print(sum([3, 1, 2, 4, 5]))

    #filter 过滤
    从一个列表中过滤出符合我们过滤的值,工作原理:相当于for循环取出每一个人名,然后传给匿名函数,将调用匿名函数返回值位True的结果留下来
    # names=['alex_sb','lxx_sb','wpx','yxx']
    # res=filter(lambda name:name.endswith('sb'),names)
    # print(list(res))
    # 1.与类型相关的
    # list() str() ord() chr() bool() int() ...
    
    print(ord('A'))
    print(chr(97))
    
    # 2.进制转化
    print(bin(10))  # 1010
    print(oct(10))  # 12
    print(hex(10))  # a
    
    print(0b1111)  # 15
    print(0o10)  # 8
    print(0x11)  # 17
    from functools import reduce
    
    # 3.常用操作类的
    # range() len() iter() next() enumerate() id() type() print() input() open()
    
    # 4.原义字符串
    print(r'a
    b')
    print(ascii('a
    b'))
    print(repr('a
    b'))
    
    
    # 5.数学相关运算
    # abs() sum() max() min() pow() sorted()
    print(abs(-1))
    print(pow(2, 3))  # 2**3
    print(pow(2, 3, 3))  # 2**3%3
    
    dic = {
        'owen': (1, 88888),
        'zero': (2, 66666),
        'tom': (3, 77777),
    }
    res = sorted(dic, key=lambda k: dic[k][1])
    print(res)  # ['zero', 'tom', 'owen']
    
    res = sorted(dic, key=lambda k: dic[k][1], reverse=True)
    print(res)  # ['owen', 'tom', 'zero']
    
    
    # 6.获取帮助
    # help(dict)
    
    # 7.执行字符串: eval() exec()
    
    # 8.反射:getattr() setattr() delattr() hasattr()
    
    # 9.面向对象的装饰器:classmethod() staticmethod()
    
    # 10.面向对象的其他:super() globals() locals()
    print(globals())
    
    def fn():
        a = 10
        b = 20
        def inner(): pass
        print(globals())
        print(locals())
    
    fn()
  • 相关阅读:
    python 实现单链表
    java解压缩zip
    关于 ElesticSearch 安装
    spring boot 与 spring cloud 关系
    Java并发编程:深入剖析ThreadLocal
    mybatis like 的坑
    JMeter 压力测试使用CSV参数
    IntelliJ IDEA创建多模块依赖项目
    关于IntelliJ IDEA删除项目
    switchhost -- 切换host的工具
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/10798125.html
Copyright © 2011-2022 走看看