zoukankan      html  css  js  c++  java
  • python基础6—(高阶,匿名,偏)函数 | 装饰器

    这里比较的高级了, 学到这里感觉有点意思,但是也看到了和其他语言相通点

     高阶函数  可以把别的函数作为参数传入的函数叫高阶函数
    def add(x, y, f):
        return f(x) + f(y)
    add(-5, 6, abs)         # 11
    
    # 匿名函数  python使用lambda来创建匿名函数  
    sum = lambda arg1, arg2 : arg1 + arg2
    sum(10, 20) # 30 
    
    # reduce 内建函数是个二元操作函数, 用来将一个数据集合所有数据进行二元操作
    # 先对集合第1,2 个数据进行func()操作,得到的结果与第三个数据用func()运行,如此最后得到一个结果
    # 顾名思义就是reduce将一个list缩成一个值
    from functools import reduce
    l = [1,2,3,4,5]
    print(reduce(lambda x, y: x-y , 1))
    # x 开始的时候赋值为10, 然后依次
    print(reduce(lambda x, y: x-y, l, 10))
    
    # map 应用于每一个可迭代的项返回一个结果list,map函数会把每一个参数都以相应的处理函数进行迭代处理
    # 本质就是将原有的list根据lambda法则变成另一个list
    l = [1, 2, 3]
    new_list = list(map(lambda i: i+1, l))
    # 变成了 [2, 3, 4]
    
    l2 = [4, 5, 6]
    new_list = list(map(lambda x, y : x + y, l, l2)) 
    # 变成了 [5, 7, 9]
    
    # filter 对序列进行过滤处理 
    l = [100, 20, 24, 50, 110]
    new = list(filter(lambda x : x < 50 , l))
    # [20, 24]
    
    # 装饰器  和测试方法中的@before @test @end 类似  可以带参 和 多个装饰器 
    # 简单来说,你处理一个方法时需要统一做某件事
    from functools import wraps
    
    def makeHtmlTag(tag, *args, **kwds):
          def real_decorator(fn):             # fn is hello()
                css_class = " class='{0}'".format(kwds["css_class"]) 
                if "css_class" in kwds else ""
                def wrapped(*args, **kwds):
                      return "<" + tag + css_class + ">" + fn(*args, **kwds) + "</"+tag+">"
                return wrapped
          return real_decorator
    
    @makeHtmlTag(tag="b", css_class="bold_css")
    @makeHtmlTag(tag="i", css_class="italic_css")
    def hello():
        return "hello world"
     
    print(hello())
    # <b class='bold_css'><i class='italic_css'>Hello World</i></h>
    # 这里包了俩层 b为最外面的那层,i为中间层
    
    # 高效率的递归  这里有个问题就是输入60会超过整数范围从而报错
    from functools import wraps
    from datetime import  datetime
    def memo(fn):
          cache= {}
          miss= object()
    
          @wraps(fn)
          def wrapper(*args):
                result = cache.get(args, miss)
                if result is miss:
                      result = fn(*args)
                      cache[args] = result
                return result
          return wrapper
    
    @memo
    def fib(n):
          if n<2:
                return n
          return fib(n-1) + fib(n-2)
    
    start = datetime.now()
    print(fib(40))          # 102334155
    end = datetime.now()
    print((end - start).microseconds)   # 71061
    
    def fib2(n):
          if n<2:
                return n
          return fib2(n-1) + fib2(n-2)
    start1 = datetime.now()
    print(fib2(40))         # 102334155
    end1 = datetime.now()
    print((end1 - start1).microseconds)  # 641741
    
          
    
    
    # 偏函数 只设置一部分参数
    int('123455')            # 默认转化为10进制
    int('123456', base 8)                      # 8进制
    int('123456', base 16)                            # 16进制
    
    # 为了方便不需要每次都输入多少进制的值
    def int2(x, base=2):
        return int(x, base)
    
    # 借助functools.partial来创建一个偏函数
    import functools
    int2 = functools.partial(int, base=2)
    print(int2('1000000'))
    
    # 传字典可以默认参数
    kw = {'base': 2}
    print(int('10010', **kw))
    
    # 传list
    args = (10, 5, 6, 7)
    print(max(*args))
  • 相关阅读:
    【二分】Pair of Topics
    【Windows】制作登录界面
    【Windows】制作文本框
    【windows】制作幸运“Tiger”机
    【python】函数
    SPOJ 3267 DQUERY
    CF 570D Tree Requests
    UVa 11809 Floating-Point Numbers
    Luogu P5098 Cave Cows 3
    GHOJ 428 未出现的子串
  • 原文地址:https://www.cnblogs.com/zeroones/p/8329501.html
Copyright © 2011-2022 走看看