1 函数

1.1 函数即变量

  函数定义:把一个函数体作为变量赋值给一个函数名,同时函数体存放到内存中。

  函数调用:根据函数名去内存中寻找对用的函数体,找到了就执行。

>>> def bar():
...     pass
...
>>> bar
<function bar at 0x006BE930>
#只写函数名,打印了对应函数体的内存地址。bar()加括号,表示调用。

  

1.2 高阶函数

   把函数名作为变量实参传给另一个函数

def bar(func):
    print(func)
    func()

def foo():
    print('in foo')

bar(foo)
>>>
<function foo at 0x004BB6F0>
in foo
#调用bar函数,将foo函数名传参,打印foo的内存地址,然后执行foo函数。

  函数返回值为函数

def bar(func):
    start = time.time()
    func()
    stop = time.time()
    print('cost time %f s' %(stop-start))
    return func

def foo():
    print('in foo')
    time.sleep(3)

foo = bar(foo)

foo()
#首先运行bar(foo),在bar函数体内调用foo,然后返回foo的内存地址,赋值给foo,再运行foo。

1.3 嵌套函数

在一个函数内再次声明一个def func()

def timer(func):
    def bar():
        start = time.time()
        func()
        stop = time.time()
        print('cost time %f s' %(stop-start))
    return bar

def foo1():
    print('in foo1')
    time.sleep(3)
def foo2():
    print('in foo2')
    time.sleep(3)

foo1=timer(foo1)
foo2=timer(foo2)

foo1()
foo2()
#bar函数里会调用传入原函数,然后bar的内存地址会赋值给原函数名。
#foo1=timer(foo1)这一步就相当于在函数前写@timer

  

2 装饰器

  装饰器本质是函数,用于装饰其他函数,为其他函数添加功能。

  特点是不需要修改原函数代码和调用方式。就是说,对原函数,无法感知装饰器的存在,依旧按照自己的逻辑运行。

def timer(func):
    def bar():
        start = time.time()
        func()
        stop = time.time()
        print('cost time %f s' %(stop-start))
    return bar

@timer
def foo1():
    print('in foo1')
    time.sleep(3)
@timer
def foo2():
    print('in foo2')
    time.sleep(3)

foo1()
foo2()

  以上为原函数没有参数时可用,而原函数有多少参数是未知的,所以在装饰函数的嵌套函数bar里需要填非固定参数*args,**kwargs。

def timer(func):
    def bar(*args,**kwargs):
        start = time.time()
        func(*args,**kwargs)
        stop = time.time()
        print('cost time %f s' %(stop-start))
    return bar

@timer
def foo1(arg):
    print('in %s' %(arg))
    time.sleep(3)
@timer
def foo2(arg):
    print('in %s' %(arg))
    time.sleep(3)

foo1('foo1')
foo2('foo2')

  

python高级函数的更多相关文章

  1. Python—高级函数

    Python-高级函数 一.闭包 Python函数是支持嵌套的.如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包.闭包需要满足如下3个条件: 存在于两个嵌 ...

  2. python 高级函数

    高级函数 map 格式:map(func, lt) 说明:接受两个参数,一个函数和一个可迭代对象,返回一个生成器,将func依次作用于lt 示例: l = [1,2,3,4,5]​def double ...

  3. Python高级函数--map/reduce

    名字开头大写 后面小写:练习: def normalize(name): return name[0].upper() + name[1:].lower() L1 = ['adam', 'LISA', ...

  4. Python高级函数--filter

    def is_palindrome(n): return str(n) == str(n)[::-1] #前两个‘:’表示整个范围,‘-’表示从后面,‘1’表示数据间隔 output = filter ...

  5. python高级之函数

    python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...

  6. 第一篇:python高级之函数

    python高级之函数   python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没 ...

  7. Python函数式编程(一):高级函数

    首先有一个高级函数的知识. 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(x, y, f): return f(x) + f(y) 当我们调用add(-, , abs ...

  8. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  9. python高级特性和高阶函数

    python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...

随机推荐

  1. Activity左边滑出,右边滑入的动画切换

    Activity左边滑出,右边滑入的动画切换 转载请注明出处:http://blog.csdn.net/u012301841/article/details/46920809 大家都知道Android ...

  2. js对象的属性问题

    ES6之前js的对象的属性只能是字符串, <html> <head> <script type="text/javascript"> var a ...

  3. JavaScript中label语句的使用

    之前在读<javascript高级程序设计>的时候,看到过lable语句,当时看完感觉好像很少用到,但是今天,刚好在项目终于到了合适的场景,合理使用label可以大幅度优化性能. 首先来简 ...

  4. HTML5 and Websocket

    在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法 ...

  5. GSON的简单示例

    https://github.com/google/gson package com.example.wolf; import com.google.gson.JsonArray; import co ...

  6. Hadoop 中的 (side data) 边数据

    一.用途 边数据是作业所需的额外的只读数据,通常用来辅助主数据集: 二.方法 1.利用Configuration类来配置,利用setter()和getter()可方便的使用,方便存储一些基本的类型: ...

  7. HBase集群出现NotServingRegionException问题的排查及解决方法

    HBase集群在读写过程中,可能由于Region Split或Region Blance等导致Region的短暂下线,此时客户端与HBase集群进行RPC操作时会抛出NotServingRegionE ...

  8. 201响应为什么进了AJAX error回调函数

    明明AJAX发送请求成功,但是后端返回的不是200,而是201,结果进了error的回调函数,想这种情况,只需要把“dataType:"json",改成dataType:" ...

  9. JNI 接口规范

    1. 简介 Java 本地接口概述 背景 JDK 1.0 本地方法接口 Java 运行时接口 原始本地接口和 Java/COM 接口 目标 Java 本地接口方法 利用 JNI 编程 JDK 1.1. ...

  10. Synchronized之三:Synchronized与线程中断、线程wait

    线程中断 见<Thread之八:interrupt中断> 正如中断二字所表达的意义,在线程运行(run方法)中间打断它,在Java中,提供了以下3个有关线程中断的方法 //中断线程(实例方 ...