1 函数

1.1 函数即变量

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

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

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

  

1.2 高阶函数

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

  1. def bar(func):
  2. print(func)
  3. func()
  4.  
  5. def foo():
  6. print('in foo')
  7.  
  8. bar(foo)
  9. >>>
  10. <function foo at 0x004BB6F0>
  11. in foo
  12. #调用bar函数,将foo函数名传参,打印foo的内存地址,然后执行foo函数。

  函数返回值为函数

  1. def bar(func):
  2. start = time.time()
  3. func()
  4. stop = time.time()
  5. print('cost time %f s' %(stop-start))
  6. return func
  7.  
  8. def foo():
  9. print('in foo')
  10. time.sleep(3)
  11.  
  12. foo = bar(foo)
  13.  
  14. foo()
  15. #首先运行bar(foo),在bar函数体内调用foo,然后返回foo的内存地址,赋值给foo,再运行foo。

1.3 嵌套函数

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

  1. def timer(func):
  2. def bar():
  3. start = time.time()
  4. func()
  5. stop = time.time()
  6. print('cost time %f s' %(stop-start))
  7. return bar
  8.  
  9. def foo1():
  10. print('in foo1')
  11. time.sleep(3)
  12. def foo2():
  13. print('in foo2')
  14. time.sleep(3)
  15.  
  16. foo1=timer(foo1)
  17. foo2=timer(foo2)
  18.  
  19. foo1()
  20. foo2()
  21. #bar函数里会调用传入原函数,然后bar的内存地址会赋值给原函数名。
  22. #foo1=timer(foo1)这一步就相当于在函数前写@timer

  

2 装饰器

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

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

  1. def timer(func):
  2. def bar():
  3. start = time.time()
  4. func()
  5. stop = time.time()
  6. print('cost time %f s' %(stop-start))
  7. return bar
  8.  
  9. @timer
  10. def foo1():
  11. print('in foo1')
  12. time.sleep(3)
  13. @timer
  14. def foo2():
  15. print('in foo2')
  16. time.sleep(3)
  17.  
  18. foo1()
  19. foo2()

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

  1. def timer(func):
  2. def bar(*args,**kwargs):
  3. start = time.time()
  4. func(*args,**kwargs)
  5. stop = time.time()
  6. print('cost time %f s' %(stop-start))
  7. return bar
  8.  
  9. @timer
  10. def foo1(arg):
  11. print('in %s' %(arg))
  12. time.sleep(3)
  13. @timer
  14. def foo2(arg):
  15. print('in %s' %(arg))
  16. time.sleep(3)
  17.  
  18. foo1('foo1')
  19. 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. Appium,IOS 模拟器,Java工程搭建

    首先进入sample code Test App 有TestApp.xcodeproj文件的工程目录下 下编译出TestApp.app文件 1.新建 java 工程 2.import需要的包 新建cl ...

  2. 关于 truncate table 的一点学习札记

    ---下面整理笔记来之 itpub 的各位前辈的语录.这里做了一个汇总.仅供学习. truncate table后,oracle会回收表和其表中所在的索引到initial 大小,也就是初始分配的seg ...

  3. VC 无边框对话框的任务栏右键菜单

    MFC ,基于对话框的程序,属性为:Border : none. 程序运行后,在任务栏里面点右键,不会弹出类似下面的菜单: 在对话框的OnInitDialog里面添加如下语句即可: ModifySty ...

  4. SQL常见问题及解决备忘

    1.mysql中:you cant't specify tartget table for update in from clause 错误 含义:在同一语句中update或delete某张表的时候, ...

  5. JVM的CPU资源占用过高问题的排查

    互联网后端架构 https://mp.weixin.qq.com/s/LiqAy2DikbmZzqogb5XRdA JVM的CPU资源占用过高问题的排查 互联网后端架构  今天 上午线上某应用的一台J ...

  6. MySQL table

    -- 使用数据库hr use hr; -- 在数据库中创建表-- ------------------------------------JOBS表-------------------------- ...

  7. mysql字符串的常用函数(截取和拼接)

    #截取字符串(先正序取2个,再倒序取1个)SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('aaa-gg-cc-dd','-',2),'-',-1) #获取子表某个字段的 ...

  8. linux初级学习笔记六:linux用户及权限详解!(视频序号:03_4)

    本节学习的命令:/etc/passwd,/etc/shadow,/etc/group文件详解 本节学习的技能: 安全上下文 文件与目录的权限管理 影子命令 用户,用户组类别详解 /etc/passwd ...

  9. html5--6-44信纸设计

    html5--6-44信纸设计 实例 <!doctype html> <html> <head> <meta charset="utf-8" ...

  10. 【Java】DateUtil(1)

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...