高阶函数

  •  数学概念 y=g(f(x))
  •  在数学和计算机科学中,高阶函数应当至少满足下面一个条件的函数

  条件1. 接受一个或多个函数作为参数
  条件2. 输出一个函数

  举例:

  def counter(base):
    def inc(step=1):
      nonlocal base #修改外部变量base,赋值需要nonlocal
      base += step
      return base
    return inc   foo = counter(5)
  foo1 = counter(5)   print(foo == foo1) #False   print(id(foo),foo)
  print(id(foo1),foo1)

  

柯里化

  •   指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
  •   z = f(x,y) 转换成 z = f(x)(y)的形式

  举例:

    有这样一个add函数

     def add(x,y):    #柯里化成 add(x)(y) 的格式
      return x + y

    将此函数柯里化

    def add(x):
def _add(y):
return x + y
return _add foo = add(7) #等同于 add(7)(8)
print(foo(8))

  

闭包

  •   函数中用到了外层变量就形成了闭包,如果想对外层变量修改,可以使用 global 或者 nonlocal 声明。

自由变量

  •  对闭包来说外层变量就是自由变量,不在本地作用域的变量。

生成器

  • 惰性求值,使用yield关键字可以构造一个生成器函数,调用这个函数就得到一个生成器对象。
  • 使用next函数多次执行。
  • 简单理解就是需要的时候才求值。
  • 下面的例子是模拟一个无限增长的user_id号:
def increasing():
id = 0
while True:
id += 1
yield id user_id = increasing() for _ in range(10):
print(next(user_id))

  

装饰器(无参)

  •  装饰器本身是一个函数
  •  需要一个函数作为它的形参
  •  返回值也是一个函数
  •  可以使用@functionname 方式,简化调用,语法糖
  •  也是高阶函数,两个条件都满足,但装饰器是对传入函数的功能的装饰(功能增强)

 举例:

	def logger(fn):
def _logger(*args,**kwargs):
print('before')
ret = fn(*args,**kwargs)
print('after')
return ret
return _logger @logger # add = logger(add)
def add(x,y):
return x + y print(add(5,600))

  

带参装饰器:

  •   装饰器返回的是内层函数的引用

  举例:

	import functools
import datetime
import time def copy_property(src):
def _copy_property(dst):
dst.__name__ = src.__name__
dst.__doc__ = src.__doc__
#dst.__qualname__ = src.__qualname__ #限定名
return dst
return _copy_property def timeoutTip(t):
def logger(func):
#@functools.wraps(func)
@copy_property(func)
def wrapper(*args, **kwargs):
'''test2'''
# before 功能增强
start = datetime.datetime.now()
# print('Call:{}() StartTime:{} nowDescription:{}'.format(func.__name__,start,func.__doc__),end='\t\t')
print('Call:{}()'.format(func.__name__), end='\t\t')
ret = func(*args,**kwargs)
# after 功能增强
stopTime = (datetime.datetime.now() - start).total_seconds() if stopTime > t:
print('Timeout time:{} '.format(stopTime))
return ret # copy_property(func, wrapper)
return wrapper
return logger @timeoutTip(2) #带参装饰器与不带参装饰器的区别
def add(x,y):
'''test1'''
#time.sleep(3)
print('returnValue = x+y')
return x+y print(add(100,y=200))
print(add.__doc__,add.__qualname__)

  

Python 函数相关概念的更多相关文章

  1. 悉数 Python 函数传参的语法糖

    TIOBE排行榜是程序开发语言的流行使用程度的有效指标,对世界范围内开发语言的走势具有重要参考意义.随着数据挖掘.机器学习和人工智能相关概念的风行,Python一举收获2018年年度语言,这也是Pyt ...

  2. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  3. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  4. Python函数讲解

    Python函数

  5. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  6. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  7. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

  8. Python函数解析

    对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...

  9. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

随机推荐

  1. topN 算法 以及 逆算法(随笔)

    topN 算法 以及 逆算法(随笔) 注解:所谓的 topN 算法指的是 在 海量的数据中进行排序从而活动 前 N 的数据. 这就是所谓的 topN 算法.当然你可以说我就 sort 一下 排序完了直 ...

  2. 【学习】ie-css3.htc---让ie8以下支持css3

    学习了偶象大神的一篇文章:<让IE6/IE7/IE8浏览器支持CSS3属性>http://www.zhangxinxu.com/wordpress/?p=783 亲自实践了一下,主要是bo ...

  3. 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML

    在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...

  4. UVa1599,Ideal Path

      说实话,这题参考的: http://blog.csdn.net/u013382399/article/details/38227917 倒着BFS就把我难住了T T,原来这样倒着BFS一遍,遍历完 ...

  5. 升级fedora 18到fedora 19

    猫终于发布了,之前看过gnome 3.8的介绍视频,感觉比3.6比起来要好太多了,所以很期待,全新安装也太麻烦,所以准备升级安装.fedora提供有升级工具fedup,升级起来还是比较方便的.下面结合 ...

  6. AOP的实现的几种方式

    1.静态代理,实现代码如下,实际上是对装饰器模式的一种应用 interface UserManager { public void addUser(); } class UserManagerImpl ...

  7. 微信小程序点击返回顶层实现方法

    最近在研究微信小程序,被这个返回顶层给坑了一波,下面贴代码 wxml代码: <scroll-view scroll-y style="height: 1000rpx;" sc ...

  8. java的集合框架set 和map的深入理解

    Java的集合框架之Map的用法详解 Map有两种比较常用的实现:HashMap 和 TreeMap. HashMap: HashMap 也是无序的,也是按照哈希编码来排序的,允许使用null 值和n ...

  9. iOS之 重绘机制

    最近在看Core Animation , 今天来谈谈CALayer 和 UIView 中的重绘的一些认识: 我们都知道UIView里面有个成员layer,利用这个这个layer我们可以设置一些圆角,阴 ...

  10. Linux系列教程(十)——Linux文本编辑器vim

    通过前面几篇博客我们终于结束了Linux常用命令的介绍,Linux常用命令主要包括以下: ①.Linux文件和目录处理命令 ②.Linux链接命令和权限管理命令 ③.Linux文件搜索命令 ④.Lin ...