zoukankan      html  css  js  c++  java
  • 【python之路20】函数作为参数 及闭包

    1、函数可以作为参数

    1)函数名相当于变量指向函数

    2)函数名后面加括号表示调用函数

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    
    def f1(args):
        print(args)
    def f2(args):
        args('你好')
        print("hello")
    
    #f1与变量的作用是相同的指向f1函数
    #f1() 表示执行函数
    f2(f1)  #打印出你好  hello

     3)内置函数filter()的实现方法

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    def MyFilter(fun,sq):
        result = []
        for i in sq:
            bol = fun(i)
            if bol:
                result.append(i)
        return result
    
    def f1(x):
        return x>30
    
    r = MyFilter(f1,[11,22,33,44,55])
    print(r)  #结果返回[33, 44, 55]

     4)内置函数map()的实现方法

    #!usr/bin/env python
    # -*- coding:utf-8 -*-
    def MyMap(fun,seq):
        li = []
        for i in seq:
            li.append(fun(i))
        return li
    def f1(x):
        return x+100
    
    re = MyMap(f1,[11,22,33])
    print(re) #打印输出[111, 122, 133]

     2、闭包

    1)内层函数调用了外层函数的变量叫闭包,可以让一个局部变量常驻内存

    def func():
        name = "sun"
    
        def inner():
            print(name) #内层函数调用了外层函数的变量叫闭包,可以让一个局部变量常驻内存
    
        return inner
    
    
    fun = func()
    fun() #结果返回sun,那么这个函数所用到的name,会常驻内存,当函数调用的时候直接返回

    2)闭包的应用

    from urllib.request import  urlopen
    def but():
        content = urlopen("http://www.baidu.com").read()
        def inner():
            # 在函数中使用了外部变量,属于闭包,那么对inner函数来说content常驻内存,随用随取
            return content
        print(inner.__closure__) #如果返回内容则表示是闭包函数
        return inner
    
    fn =but() #执行but函数,返回inner函数,并把inner返回给fn
    con1 = fn() #调用inner函数,不再去加载网站
    print(con1)
    con2 = fn() #调用inner函数,不再去加载网站
    print(con2)
    内层函数调用了外层函数的变量叫闭包,可以让一个局部变量常驻内存


    import time
    
    def getNum():
        li = [i for i in range(100000000)]
        def inner():
            return li
        return inner
    
    t0 = time.clock()
    
    fun1 = getNum()
    t1 = time.clock()
    print(t1 - t0)
    
    fun2 = fun1()
    t2 = time.clock()
    print(t2 - t1)
    
    fun3 = fun1()
    t3 = time.clock()
    print(t3 - t2)
    
    # 结果输出:
    # 9.215686900000001
    # 0.00221929999999837
    # 3.0999999999892225e-
    
    # 说明li生成后放到内存中后面调用函数直接去内存取数


  • 相关阅读:
    MarkDown SequenceDiagram 语法
    mysql导出数据库文档
    使用gitlab作为go mod私服
    go context理解
    go-micro入门
    golang 接口测试
    小程序配置 app.json
    Nginx 配置详解(2)
    windows下安装nginx
    任意文件夹下打开命令提示窗
  • 原文地址:https://www.cnblogs.com/sunshuhai/p/6384923.html
Copyright © 2011-2022 走看看