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))