zoukankan      html  css  js  c++  java
  • Python3基础-特别函数(map filter partial reduces sorted)实例学习

    1. 装饰器

    关于Python装饰器的讲解,网上一搜有很多资料,有些资料讲的很详细。因此,我不再详述,我会给出一些连接,帮助理解。

    探究functools模块wraps装饰器的用途

    案例1

    import functools
    
    def log(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print("打印传入参数func的名字:{}".format(func.__name__))
            return func(*args, **kw)
        return wrapper
    
    @log
    def new():
        print('2018-11-24')
        
    new()
    
    打印传入参数func的名字:new
    2015-3-25
    

    案例2

    from functools import wraps   
    
    def my_decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print('Calling decorated function...')
            return func(*args, **kwargs)
        return wrapper  @my_decorator 
    
    def example():
        """Docstring""" 
        print('Called example function')
    
    print(example.__name__, example.__doc__)
    
    example Docstring
    

    案例3

    def logger(text):
        def decorator(func):
            @functools.wraps(func)
            def wrapper(*args, **kw):
                print("logger传入的参数text:{}".format(text))
                print("打印传入参数func的名字:{}".format(func.__name__))
                return func(*args, **kw)
            return wrapper
        return decorator
    
    @logger('DEBUG')
    def today():
        print('2018-11-24')
        
    today()
    
    print('-------------')
    print(today.__name__)
    
    logger传入的参数text:DEBUG
    打印传入参数func的名字:today
    2018-11-24
    -------------
    today
    

    2. filter 过滤器

    Python函数式编程

    案例1

    def is_odd(n):
        return n % 2 == 1
    L = range(100)
    print(L)
    print(list(filter(is_odd, L)))
    
    range(0, 100)
    [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
    

    案例2

    def not_empty(s):
        return s and s.strip()
    print(list(filter(not_empty, ['A', '', 'b', None, 'c', '         '])))
    
    ['A', 'b', 'c']
    

    3. map 映射

    Python函数式编程

    def f(x):
        return x*x
    print(list(map(f, [1, 2, 3, 4, 5])))
    
    [1, 4, 9, 16, 25]
    

    4. partial 偏导雏形

    partial具有固定参数的功能

    案例1

    固定say中的man参数

    import functools
    def say(man, words):
        print('say', words, 'to', man)
        
    # say('boss', 'hello')  # say hello to boss
    say2boss = functools.partial(say, 'boss')
    say2boss('good morning')
    
    say good morning to boss
    

    案例2

    固定基,固定二进制,也就是将二进制函数中的基固定为2

    import functools
    int2 = functools.partial(int, base=2)
    print('1000000 =', int2('1000000'))
    print('1010101 =', int2('1010101'))
    
    1000000 = 64
    1010101 = 85
    

    案例3

    def add(a,b):
        return a + b + 10
    add3 = functools.partial(add,3)
    add5 = functools.partial(add,5)
    print("固定add函数中一个参数3,结果为3+4+10 = {} ".format(add3(4)))
    print("固定add函数中一个参数5,结果为5+10+10 = {} ".format(add5(10)))
    
    固定add函数中一个参数3,结果为3+4+10 = 17 
    固定add函数中一个参数5,结果为5+10+10 = 25 
    

    5. reduce

    案例1

    import functools
    S = range(1,6)
    print(functools.reduce(lambda x, y: x+y, S))
    
    15
    

    案例2 字符串数字转化为整型

    from functools import reduce
    CHAR_TO_INT = {
        '0':0,
        '1':1,
        '2':2,
        '3':3,
        '4':4,
        '5':5,
        '6':6,
        '7':7,
        '8':8,
        '8':9
    }
    def str2int(s):
        ints = map(lambda ch: CHAR_TO_INT[ch], s)
        return reduce(lambda x, y: x*10 + y, ints)
    
    print(str2int('0'))
    print(str2int('12300'))
    print(str2int('0012345'))
    
    0
    12300
    12345
    

    案例3 字符串数字转化为浮点型

    CHAR_TO_FLOAT = {
        '0': 0,
        '1': 1,
        '2': 2,
        '3': 3,
        '4': 4,
        '5': 5,
        '6': 6,
        '7': 7,
        '8': 8,
        '9': 9,
        '.': -1
    }
    
    def str2float(s):
        nums = map(lambda ch: CHAR_TO_FLOAT[ch], s)
        point = 0
        def to_float(f, n):
            nonlocal point
            if n == -1:
                point = 1
                return f
            if point == 0:
                return f * 10 + n
            else:
                point = point * 10
                return f + n / point
        return reduce(to_float, nums, 0.0)
    
    print(str2float('0'))
    print(str2float('123.456'))
    print(str2float('123.45600'))
    print(str2float('0.1234'))
    print(str2float('.1234'))
    print(str2float('120.0034'))
    
    0.0
    123.456
    123.456
    0.12340000000000001
    0.12340000000000001
    120.0034
    

    6. sorted

    案例1 简单排序

    L = ['bob', 'about', 'Zoo', 'Credit']
    print(sorted(L))
    print(sorted(L, key=str.lower))
    
    ['Credit', 'Zoo', 'about', 'bob']
    ['about', 'bob', 'Credit', 'Zoo']
    

    案例2 根据要求排序

    from operator import itemgetter
    students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    print(sorted(students, key=itemgetter(0)))
    print(sorted(students, key=lambda t: t[1]))
    print(sorted(students, key=itemgetter(1), reverse=True))
    
    [('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
    [('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
    [('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
    

    7. 返回函数

    案例1

    def lazy_sum(*args):
        def sum():
            ax = 0
            for n in args:
                ax = ax + n
            return ax
        return sum
    f = lazy_sum(1, 2, 3, 4, 5, 6, 7, 8, 9)
    print(f)
    print(f())
    
    <function lazy_sum.<locals>.sum at 0x000001C8F8CF69D8>
    45
    

    案例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(f1())
    print(f2())
    print(f3())
    
    9
    9
    9
    

    案例3

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

    8. 素数

    Python3基础-代码阅读系列—素数

    def main():
        for n in primes():
            if n < 50:
                print("{}是1——100之间的素数。".format(n))
            else:
                break
    
    def _odd_iter():
        n = 1
        while True:
            n = n + 2
            yield n
    
    def _not_divisible(n):
        return lambda x: x % n > 0
    
    def primes():
        yield 2
        it = _odd_iter()
        while True:
            n = next(it)
            yield n
            it = filter(_not_divisible(n), it)
    
    if __name__ == '__main__':
        main()
    
    2是1——100之间的素数。
    3是1——100之间的素数。
    5是1——100之间的素数。
    7是1——100之间的素数。
    11是1——100之间的素数。
    13是1——100之间的素数。
    17是1——100之间的素数。
    19是1——100之间的素数。
    23是1——100之间的素数。
    29是1——100之间的素数。
    31是1——100之间的素数。
    37是1——100之间的素数。
    41是1——100之间的素数。
    43是1——100之间的素数。
    47是1——100之间的素数。
    

    参考文献

    1. http://y.tsutsumi.io/dry-principles-through-python-decorators.html
    2. http://wklken.me/posts/2013/08/18/python-extra-functools.html
    3. https://github.com/michaelliao/learn-python3/tree/master/samples/functional
  • 相关阅读:
    android 使用AlarmManager定时启动service
    mac 删除文件夹里所有的.svn文件
    Eclipse配置SVN
    OSD锁定怎么解锁?
    如何用Mac远程桌面连接windows
    获取设备识别信息
    类库冲突问题
    如何将Eclipse中的项目迁移到Android Studio中
    python 日历(Calendar)模块
    python datetime处理时间(转)
  • 原文地址:https://www.cnblogs.com/brightyuxl/p/10011746.html
Copyright © 2011-2022 走看看