高阶函数

  •  数学概念 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. cocos2dx - 在MFC中使用cocos2dx

    本节主要讲一下如何在MFC窗口中使用cocos2dx 在做比较复杂的游戏,有时需要通过一些工具来编辑生成关卡或者特效,技能等的配置文件.为了方便配置,需要可以通过修改参数直观得到显示的效果.这就需要将 ...

  2. [Python]Codecombat攻略之地牢Kithgard(1-22关)

    首页:https://cn.codecombat.com/play语言:Python 第一界面:地牢 Kithgard(22关) 时间:1-3小时 内容:语法.方法.参数.字符串.循环.变量等 网页: ...

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

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

  4. win10 uwp 读写XML

    UWP 对 读写 XML做了一些修改,但和之前 WPF 的方法没有大的区别. 我们先来说下什么是 XML , XML 其实是 树结构,可以表达复杂的结构,所以在定制要求高的.或其他方面如json 做不 ...

  5. CSS3选择器在HTML5中的使用

    1,有CLASS属性的input标记 Input[class]{ } 2,class属性是sm的元素 Input[class='sm']{} 3,  凡是class=sm的元素 [class='sm' ...

  6. 小记:Touchpad 禁用和启用

    最近上课要背着电脑到处跑,不能带外接键盘,打字时候总会碰到触控版导致光标乱飘,看了下wiki,发现有简单的命令开启或者禁用触控版,记录如下 禁用: # synclient TouchpadOff=1 ...

  7. Nodejs.安装.非源码方式安装Node.js (Centos)

    已验证的适用环境: Centos6.x 树莓派官方ROM(Raspbian) 先去官网下载已编译好的安装包 https://nodejs.org/en/download/current/​ 以Cent ...

  8. LeetCode 461. Hamming Distance (汉明距离)

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  9. LeetCode 268. Missing Number (缺失的数字)

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...

  10. 攻克vue路由

    先下手 路由是个好功能,但是每次都感觉没法开始下手,愣愣的看半天官方文档,所以做个快速开始教程. 首先先搭好HTML文件结构: <!--link和view在一个父元素下--> <di ...