zoukankan      html  css  js  c++  java
  • Python学习(九)--[进阶]函数

    • 闭包
            Python的函数时可以嵌套的,可以将一个函数放在另外一个里面。
    def multiplier(factor):
        def multiplyByFactor(number):
            return number*factor
        return multiplyByFactor
            调用multiplier()时,返回的是里层函数,也就是说函数本身被返回了,但并没有被调用。重要的是返回的函数还可以访问它的定义所在的作用域。
            在一个外函数中定义了一个内函数,内函数运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包。如果外函数在结束的时候发现自己的临时变量将来会在内函数中用到,就会把这个临时变量绑定给了内部函数,然后自己再结束。
            使用闭包的过程中,一旦外函数被调用了一次返回内函数的引用,虽然每次调用内函数是开启一个函数执行过后消亡,但是闭包变量实际上只有一份,每次开启内函数都在使用同一份闭包变量。
            可以来看一个例子:
    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
     
    f1, f2, f3 = count()
            在这个例子里,每次循环,都会创建一个新的函数,然后把函数名放到列表fs里,并没有调用函数f,也就是说不会进行内部计算。最后把三个函数都返回。这里要注意的是,外函数变量fs,i都是只有一份的,所以循环了3次以后,i就变成了3。所以最后我们发现调用f1(),f2(),f3()返回的结果都是9。
    >>> f1()
    9
    >>> f2()
    9
    >>> f3()
    9
     
    • 匿名函数
            lambda作为表达式,定义了一个匿名函数。比如:lambda x: x+1。实际上是定义了一个函数,和下面的效果一样。
        def fun(x)
            return(x+1)
     
    • 装饰器
            在Python里函数也是一个对象,函数对象有一个__name__属性,可以拿到函数的名字:
    >>> def name():
    ...     print 'Tom'
    ...
    >>> name.__name__
    ‘name'
         如果想要增强name()函数的功能,但是又不希望修改name()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”。
            装饰器就是一个返回函数的高阶函数,比如定义一个打印日志的装饰器:
    def log(func):
        def wrapper(*args, **kw):
            print 'call %s():' % func.__name__
            return func(*args, **kw)
        return wrapper
            log是一个装饰器,接受一个函数作为参数,并返回一个函数。所以我们使用装饰器时,就需要用@语法:
    @log
    def name():
        print ‘Tom'
            多以现在调用name(),相当于执行了name = log(name),然后再执行name()。
     
    • 偏函数
            Python的functools模块提供了片函数的功能。
            比如int()函数可以把字符串转换为整数,也可以传入base参数,设置转换的进制。比如int(‘1234’,base = 8)。如果要转换大量的八进制字符串,每次都要传入进制参数,于是可以:
    def int8(x,base = 8)
        return int(x,base)
            我们也可以使用片函数实现相同的效果,也就是:
    int8 = functools.partial(int, base=2)
     
     
     
  • 相关阅读:
    [BZOJ 3282] Tree 【LCT】
    [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】
    [BZOJ 1036] [ZJOI2008] 树的统计Count 【Link Cut Tree】
    [HDOJ
    Excel+DDT数据驱动实例
    jenkins+SVN配置
    [转]loadrunner:系统的平均并发用户数和并发数峰值如何估算
    loadrunner:Auto Correlate自动定位瓶颈
    loadrunner:判断是否服务器连接池瓶颈
    利用page_source抓取网页中的URL,进行链接测试
  • 原文地址:https://www.cnblogs.com/mujiujiu/p/9278735.html
Copyright © 2011-2022 走看看