• 函数


    一.高阶函数

    1.map:将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回

    格式:
    map(fun, [Iterable])

    示例:

    def minutes(hour):
        return int(hour * 60)
    
    minutes_list = map(minutes, [1, 1.5, 3])
    print(minutes_list)
    print(list(minutes_list))
    

      

    输出:
    <map object at 0x000001F0DE502550>
    [60, 90, 180]

    由于minutes_list是一个Iterator,因此通过list()函数让它把整个序列都计算出来并返回一个list。

    2.reduce:把一个函数作用在一个序列[x1, x2, x3, ...]上,reduce把结果继续和序列的下一个元素做累积计算

    格式:

    from functools import reduce
    reduce(fun, [Iterable])

    示例:

    from functools import reduce
    
    def add(x,y):
        return x+y
    
    total = reduce(add, [1, 2, 3])
    print(total)
    

      

    输出:
    6

    3.filter:过滤序列

    格式:
    filter(f, [....])

    示例:

    def add(x):
        return x % 2 == 0
    
    filter_list = filter(add, [1, 2, 3])
    print(list(filter_list))
    

      

    4.sorted:排序

    格式:
    sorted([...], key=function, reverse=True)

    示例:

    print(sorted([1,2,4], key=abs, reverse=True))
    

      

    二.返回函数和闭包

    1.返回函数:

    def lazy_sum(*args):
        def sum():
            total = 0
            for x in args:
                total += x
            return total
        return sum
    
    f = lazy_sum(1,2,34)
    print(f)
    print(f())
    

      

    输出:
    <function lazy_sum.<locals>.sum at 0x00000174FF153BF8>
    37

    2.闭包

    返回函数不要引用任何循环变量,或者后续会发生变化的变量。

    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()
    print(count())
    print(f1(), f2(), f3())
    

      

    输出:
    [<function count.<locals>.f at 0x0000023B02F03D90>, <function count.<locals>.f at 0x0000023B02F03E18>, <function count.<locals>.f at 0x0000023B02F03EA0>]
    9 9 9

    你期望输出 1 4 9,但其实输出了9 9 9

    如果要输出1 4 9,你需要再创建一个闭包函数

    def count():
        fs = []
        def f(j):
            def a():
                return j*j
            return a
        for i in range(1, 4):
            fs.append(f(i))
        return fs
    
    f1, f2, f3 = count()
    print(count())
    print(f1(), f2(), f3())
    

      

    输出:
    [<function count.<locals>.f.<locals>.a at 0x00000267C2673E18>, <function count.<locals>.f.<locals>.a at 0x00000267C2673EA0>, <function count.<locals>.f.<locals>.a at 0x00000267C2673F28>]
    1 4 9

    三.匿名函数

    格式如:
    lambda x: x * x

    示例:

    f= (lambda x:x*x)(10)
    print(f)

    也可以将匿名函数作为函数返回:

    def func(x):
        return lambda: x*x
    print(func(10))
    print(func(10)())
    

      

    输出:
    <function func.<locals>.<lambda> at 0x00000212FBA93BF8>
    100

    四.装饰器:

    示例:

    import functools
    
    def log(log_text):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                print("%s: call %s()" % (log_text, func.__name__))
                return func(*args, **kwargs)
            return wrapper
        return decorator
    
    @log('execute')
    def now(time_str):
        print(time_str)
    
    now('2018')
    

      

    输出:
    execute: call now()
    2018

    这与以下代码实现的功能是一致的:

    import functools
    
    def log(log_text):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kwargs):
                print("%s: call %s()" % (log_text, func.__name__))
                return func(*args, **kwargs)
            return wrapper
        return decorator
    
    def now(time_str):
        print(time_str)
    
    #相当于执行了
    f = log('execute')(now) #返回了log中的wrapper
    f('2019')
    

      

    五.偏函数

    把一些函数的某些参数固定住,返回新函数

    #注意分隔符*,这表示在这之后的参数是关键字参数,如果该位置有个可变参数,则不需要分隔符
    def log(fun, *, default_text):
        print(default_text)
        return '%s 执行了' % fun
    
    
    import functools
    
    print(log('send', default_text = 'email'))
    
    default_log = functools.partial(log, default_text='hello')
    print(default_log('send'))
    

      

    输出:
    email
    send 执行了
    hello
    send 执行了
  • 相关阅读:
    Membership provider Role provider 机制详解
    android Toast大全(五种情形)建立属于你自己的Toast
    android:scaleType属性
    Android接收短信同时获取短信内容
    JAVA三大框架的各自作用
    Android短信监听器
    ImageView / ImageButton 图片太大或者太小解决方法
    Android LayoutInflater详解
    Android开发之Intent.Action
    Android实现短信监听并且转发到指定的手机号,转发后不留痕
  • 原文地址:https://www.cnblogs.com/itfenqing/p/10253457.html
Copyright © 2020-2023  润新知