zoukankan      html  css  js  c++  java
  • [Python笔记]Python学习笔记三

    Python高阶函数

    filter() 用于过滤序列

    第一个参数接收一个函数,根据返回值来决定是否保留, True则留下,False则丢弃

    def is_odd(n):
        return n%2 == 1
    
    filter( is_odd, range(1,16) )
    
    def not_empty(s):
        return s and s.strip()
    
    filter( not_empty, [ 'A', ' ', 'B ', None, '  ' ])

    内置sorted()函数用于列表排序

    返回函数

    将函数作为返回值, 这就涉及到"闭包"

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

    记住经典的循环问题,最后得到的数都是一样。

    匿名函数:lambda表达式

    匿名函数只能有一个表达式,不用写return

    map(lambda n: n*n, range(1,11))
    # 匿名函数的语法就是 lambda关键字后面跟上函数参数,再加冒号 : 没有return

    匿名函数也可以作为函数的返回值使用

    装饰器

    在Python中,任何事物都是对象。 函数也是一个对象,函数对象有 __name__ 属性

    def now():
        print '2016-03-23'
    
    f = now
    
    now.__name__ # 'now'
    f.__name__ # 'now'

    在代码运行期间动态添加功能的方式就叫做 "装饰器Decorator" 本质上就是一个返回函数的高阶函数。

    import functools
    #
    一个最简单的无参数的装饰器 # 定义一个能打印日志的函数作为装饰器 # 装饰器的本质就是返回一个函数 def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw): print 'call %s():'%func.__name__ return func(*args, **kw) return wrapper # 使用装饰器的语法就是使用@符号将其放置在其他函数之上 @log #等价于 now = log(now) def now(): print '2016-03-23' now() # 一个需要传入参数的装饰器 def log(text): def decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kw): print '%s %s()'%(text, func.__name__) return func(*args, **kw) return wrapper return decorator @log('execute') # 等价于 log('execute')(now) def now(): print '2016-03-23' now()

    为了不把原始函数的__name__属性进行修改,需要使用内置的 functools.wraps装饰器来保证属性不被修改。

    #!/usr/bin/env python
    # Python装饰器小练习
    # 写出一个@log的装饰器,使得它既支持无参数,也支持带参数
    import functools
    import time
    
    def log(obj):
        if isinstance(obj, (str,int,float,bool)):
            param = obj
            def decorator(func):
                @functools.wraps(func)
                def wrapper(*args, **kw):
                    print 'call %s() begin with param %s:'%(func.__name__, param)
                    res = func(*args, **kw)
                    print 'call %s() end:'%func.__name__
                    return res
                return wrapper
            return decorator
        else:
            @functools.wraps(obj)
            def wrapper(*args, **kw):
                print 'call %s() begin:'%obj.__name__
                res = obj(*args, **kw)
                print 'call %s() end'%obj.__name__
                return res
            return wrapper
    
    
    # 写出一个装饰器用于在函数调用前后分别打印出'begin call'和'begin end'日志
    import functools
    import time
    
    def showFunName(func):
        @functools.wraps(func)
        def wrapper(*args,**kw):
            print 'begin call'
            res = func(*args, **kw)
            print 'begin end'
            return res
        return wrapper
    
    @showFunName
    def myFunc():
        print 'executing...'
    
    myFunc()

    偏函数

    functools.partial()作用就是将一个函数的某些参数的值进行固定,从而返回一个新的函数,使得调用该函数变得更加简单。

    由于任何函数都可以接收定义参数,可变参数,关键字参数。所以调用functools.partial()方法时也可以传入这两种参数。

  • 相关阅读:
    在thinkphp中批量生成Word并压缩打包下载
    使用phpExcel实现Excel数据的导入导出(完全步骤)
    HTML的几种触发
    IOS上iframe的滚动条失效的解决办法。
    VC6下安装与配置OpenCV1.0
    VS2010+Opencv2.4.0的配置攻略
    could not find the main class
    Makefile 教程
    第一个小程序——显示图像
    自建CDib类库
  • 原文地址:https://www.cnblogs.com/joyjoe/p/6613980.html
Copyright © 2011-2022 走看看