zoukankan      html  css  js  c++  java
  • Python基础学习(四)

    菜鸟咀嚼python基础之继续。

    一、返回函数

    第三章已经简单操作了Python的高阶函数,目前继续练手函数作为返回值的特效;通常,高阶函数除了可以接收函数作为参数外,还可以把函数作为结果值返回。

    案例:通常我们写一个求和的函数会这样写 

    #通常我们写一个求和的函数会这样写
    def get_sum(*param):
        count = 0;
        for item in param:
            count = count + item
        return count
    
    print( get_sum(1,2,3,4) )
    

      输出: 10

    #但是,如果不去求和,而是在后面的代码根据需要在计算可以吗,可以的。它可以不用返回求和结果,而是返回求和函数。
    def last_sum(*param):
        def sum():
            num = 0
            for n in param:
                num = num + n
            return num
        return sum
    
    fun = last_sum(1,2,3,4)
    print( fun )
    print( fun() )
    

      输出结果:

    <function last_sum.<locals>.sum at 0x7f4a2d3b58c8>
    10
    

      说明:由此可见单纯的输出返回的函数是没有结果的,只有调用返回的函数,才能将求和打印出来

      另外,如果多次调用 last_sum 函数,每次返回的都是一个新的函数,即使传入相同的参数;

      例如:

    fun1 = last_sum(1,2,3,4)
    fun2 = last_sum(1,2,3,4)
    
    print( fun1 == fun2 )
    

      返回:False

      说明:fun1() 和 fun2() 的调用互不影响

      闭包  

    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

      说明:这是因为当一个函数返回了一个函数后,i 这个内部局部变量还被新的函数引用,等到三个函数都返回时,函数 i 已经比变成3了,所以执行的 函数输出 9, 9, 9

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

      可以这样写:

    def count2():
        def f(i):
            def g():
                return i * i
            return g
        fs = []
        for i in range(1,4):
            fs.append( f(i) )
        return  fs
    
    
    f11, f22, f33 = count2()
    
    print( f11() )
    print( f22() )
    print( f33() )
    

      返回结果:1,4,9

      说明:方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变

      也就是说当我们必须要调用循环变量的时候,需要多加一个局部函数,在每次执行 循环变量 i 的时候 去调用那个新的函数并将 i 作为它的一个参数 达到立刻被执行,则 i 无论后期怎么变都不会受到影响。

     二、匿名函数

      匿名函数就是没有名字的函数,有些时候为了简洁方便可以不去定义函数,而是直接使用匿名函数,案例:

    #匿名函数
    mylist = list( map(lambda y:y*y, [1,2,3,4]) )
    print( mylist )
    

      输出:[1, 4, 9, 16]

      说明:匿名函数 lambda y:y*y  其实就是匿名函数,用 lambda 去表示一个匿名函数,第一个 y 代表匿名函数的参数,冒号后面是匿名体,可以表示函数处理的功能。

           匿名函数就是一个表达式,不用写returen 返回值就是表达式结果,同时,匿名函数还可以是一个变量,例如:

    #匿名函数-变量
    mytest = lambda y:y*y
    mylist = list( map( mytest , [1,2,3,4]) )
    print( mylist )
    

      输出:[1, 4, 9, 16]       效果同上;

    三、装饰器

    其实函数就是一个对象。而且函数对象可以被赋值给变量,所以,通过变量也就相当于调用了那个函数。

      例如:

    def myFun(a):
        return a*a
    
    test = myFun
    
    print( test(5) )
    

      输出:25

      其实函数有一个__name__的属性,可以验证出他真正的函数是谁。例如:

    print( test.__name__ )
    

      输出:myFun

    四、偏函数

      Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial Function)例如:int()它可以将一个字符串转换为整数,其实它还可以指定转换的类型,默认的十进制的,其实可以指定进制转换;

      例如:  

    print( int('123') )
    print( int('123', base=8) )
    print( int('11111', base=2) )
    print( int('123', base=16) )
    print( int('123', base=10) )
    

      输出:

    123
    83
    31
    291
    123
    

      说明:base= 就是制定转换进制的入口;

      案例2:

    def intTest2( x, base = 2):
        return int( x, base)
    
    print( intTest('100000') )
    

      输出:32

      案例3:functools.partial 就是帮助创建一个偏函数,这样就不需要自定义 intTest2(),

      例如:

    import functools
    
    intTest2 = functools.partial(int, base=2)
    
    print( intTest2('10000000') )
    

      输出:128

      说明:functools.partial 的作用就是把一个函数的某些参数设定一个默认值,在重新返回一个新的函数,这样更方便调用一个新的函数。

      

  • 相关阅读:
    正则表达式
    c#文件流
    css
    Flash笔记 快捷键
    .Net截取指定长度的汉字,其余用...表示的方法
    远程修改最新消息管理系统(JQuery版)
    远程修改最新消息管理系统
    kubernetes 1.6 集群实践 (一)
    创建kafak集群
    创建zookeeper集群
  • 原文地址:https://www.cnblogs.com/dump/p/9567160.html
Copyright © 2011-2022 走看看