zoukankan      html  css  js  c++  java
  • Python 高阶函数

    Python 高阶函数

    什么是高阶函数:

    高阶函数就是能够接收函数对象作为参数的函数。

    比如:

    def higher_func(arg_func):
    	print 'in higher func'
    	return arg_func
    
    def func():
    	print 'hello world'
    
    x = higher_func(func)
    x()
    

    上段代码的执行结果为:

    in higher func
    hello world
    

    为什么会这样呢,要解释清楚就需要从基础慢慢的来了~

    变量可以指向函数

    首先,我们要知道。在Python中,变量可以指向函数对象,这就可以做很多好玩的东西。比如说:

    >>> abs(10)					// 调用内置的求绝对值的函数
    10
    >>> abs						// 查看函数对象本身,可见`abs(10)`是函数对象调用,而`abs`作为函数名指向函数对象本身
    <built-in function abs>
    >>> f = abs					// 把函数对象赋值给变量f
    >>> f
    <built-in function abs>
    >>> f(10)						// 通过变量去调用函数
    10
    

    经过上面的折腾就能看到变量f其实是指向了一个函数对象,通过它也能够调用函数对象,效果和函数名调用对象相同。

    函数名也是变量

    变量名可以指向函数对象,那么函数名是不是也只是一个变量呢,是不是也可以指向其他的函数对象呢,我们来试一下:

    >>> f = abs
    >>> abs = len							// 让`abs`这个函数名不在指向绝对值函数对象,重新指向`len`函数对象
    >>> abs								// `abs`已经改变
    <built-in function len>
    >>> len
    <built-in function len>
    >>> abs(10)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: object of type 'int' has no len()
    >>> f									// 变量f依然指向的是绝对值函数对象
    <built-in function abs>
    >>> f(10)
    10
    

    高阶函数

    这样就能解释开头的代码了:

    # 定义一个函数对象
    def higher_func(arg_func):
    	print 'in higher func'
    	return arg_func
    
    # 定义另外一个函数对象
    def func():
    	print 'hello world'
    
    # 将函数func的对象作为参数传给higher_func,返回的依然是func的对象本身,并且顺带之行了higher_func内的打印语句
    x = higher_func(func)
    # x被赋值为func对象,x()调用该对象
    x()
    
    

    这里的higher_func便是一个高阶函数。再来一个例子:

    def add(x, y, func):
    	return func(x) + func(y)
    	
    x = add(-4, 6, abs)
    print x					// 执行的是abs(-4) + abs(6) = 10
    

    高阶函数总结

    高阶函数的概念并不仅仅在Python才有,JavaScript、PHP甚至C/C++中都能够遇到高阶函数

    JavaScript中大量的使用了高阶函数,PHP的使用闭包也会遇到高阶函数。

    C/C++中使用指针和函数指针也会遇到高阶函数

  • 相关阅读:
    ps中的一些方法
    extjs 横向滚动条 和 本地排序
    JS JSON.parse() 和 JSON.stringify()
    SQL 同一个表中 根据一列更新另一列(不同行)
    extjs2.2 panel加背景色
    extjs2.2 combo的监听
    ExtJS2.2 form表单提交时不提交emptyText
    Extjs 复制对象
    Extjs 显示或隐藏滚动条
    Extjs2.2 开始时间,结束时间,工期 联动(选二补一),包含日期,天数的互转
  • 原文地址:https://www.cnblogs.com/tingyugetc/p/6684481.html
Copyright © 2011-2022 走看看