2020-11-16

一.高阶函数

-->分类:

        1.将函数作为参数    2.将函数作为返回值

-->好处:

        1.当使用函数作为参数的时候,实际是将函数代码传入到目标函数,交互性好

-->不同的函数实现不同的功能,满足不同用户需求,简单示例

求偶数

def fn1(n):

    if n % 2 == 0:

        return True

大于5

def fn2(n):

    if n > 5:

        return True

3的倍数

def fn3(n):

    if n % 3 == 0:

        return True

lst = [1,2,3,4,5,6,7,8,9]

def fn(fun,l):    #传入函数参数

    lst1 = []

    for i in l:

        if fun(i) :     #调用函数

            lst1.append(i)

    return lst1

print(fn(fn3,lst))  #[3, 6, 9]

二.匿名函数

格式:filter(function,interable)

function: 函数名

interable: 可迭代对象

返回值:对象

lst = [1,2,3,4,5,6,7,8,9,10]

def fn1(n):

     if n > 5:

         return True

print(filter(fn1,lst))

print(list(filter(fn1,lst)))

# <filter object at 0x0000024456291CF8>

# [6, 7, 8, 9, 10]

-->由于创建的函数内容(实现功能简单),引入匿名函数

        1.占用空间小,

        2.只会调用一次,就会在内存中消失了

-->匿名函数lambda

        格式: lambda 参数表达式;返回值

r =lambda a,b : a + b

print(r)    # at 0x000002037A2EC268>

print(r(100,200))    #300

三.闭包

-->高阶函数第二种形式:将函数作为返回值

-->通过闭包创建一个只有当前函数才能返回的变量,我可以将一些私有数据放到闭包

形成闭包的条件:

    1.函数嵌套    

    2.内部函数使用了外部函数的变量(还包括外部函数的参数) 

    3.外部函数返回了内部函数

实例如下:

def num_add():

lst = []

    def fn(n):

    lst.append(n)

    return sum(lst) /len(lst)

return fn

r = num_add()

print(r(10))

print(r(20))

lst = [ ]     无影响,不改变运行结果

lst = 7  无影响, 不改变运行结果

print(r(30))

# 10.0

# 15.0

# 20.0

四.装饰器

-->我们可以直接修改函数代码完成需求,但是会产生一些问题    

        1.如果修改的函数较多,修改起来麻烦   

         2.不方便后期维护    

        3.这种方式会违反OCP原则(扩展代码,但不允许修改源码)

-->例子:对f4函数扩展

def f4():

#    print('我是F4')

# def f5():

#    print('函数开始')

#    f4()

#    print('函数结束')

# f5()

# 函数开始

# 我是F4

# 函数结束

-->扩展案例

def add(a,b):

# 求任意两个数的和

    # print('开始运行')

    r = a + b

# print('结束运行')

    return r

# v = add(109,108)

# print(v)

# 开始运行

# 结束运行

# 217

def new_add(a,b):

print('开始运行')

print('结束运行')

return add(a,b)

print(new_add(123,543))

# 开始运行

# 结束运行

# 666

-->装饰器的使用

def add(a,b):

    r = a + b

return r

def f_start(old):    #传入函数参数,对其进行拓展

    def new_fun(*a,**b):    #接收多种参数

        print('开始执行')

res = old(*a,**b)

print('结束执行')

return res

return new_fun

r = f_start(add)

value = r(132,543)

print(value)

开始执行

结束执行

675 

-->类似于f_start(old)函数称之为装饰器函数

对传入的old函数扩展

-->实际使用

@f_start

def say():

print('hello world')

say()

开始执行

hello world

结束执行

五.命名空间

--> locals() 获取当前作用域的命名空间

a =10  #相当于在命名空间田间key-value ( 'a' = 10)

r =locals()

print(r)

print(r['a'])

# {'__name__': '__main__',

# '__doc__': None,

# '__package__': None,

# '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000211C6E31CF8>,

# '__spec__': None, '__annotations__': {}, '__builtins__': ,

# '__file__': 'C:/untitled/001.小黑/命名空间.py', '__cached__': None, 'r': {...}}

10

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 9,202评论 0 27
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,507评论 0 6
  • 20200206 ##命名空间(namespace) 指的是变量存储的位置,每一个变量都需要存储到指定的命名空间中...
    张腾_1fc4阅读 1,423评论 0 0
  • 1. 选教程 看到crossin的编程教室python教程还不错。以这个为主要学习内容。 python简单实验...
    青岛大桥_Android到后端阅读 3,688评论 0 0
  • 1.集合的使用 1.1集合的操作len(),返回集合的长度。s = set('python')#s为{'p','y...
    rivulet阅读 1,482评论 0 0