1 2 3 4

【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生成后放到内存中后面调用函数直接去内存取数


posted @ 2017-02-10 08:57  I我的博客I  阅读(411)  评论(0编辑  收藏  举报