一等对象

什么是一等对象:

  • 在运行时创建

  • 能赋值给变量或数据结构中的元素

  • 能作为参数传递给函数

  • 能作为函数的返回结果

python中的字符串,列表什么的都是一等对象,但对如果之前只是使用c++、java语言的人们来说python中的函数也是一等对象,那一定会有一点不可思议

接下来就介绍一下这个一等对象—函数

函数是一等对象

我们就马上证明一下函数是一等对象:


def func():
print('一等对象函数') print(type(func)) #<class 'function'>

将上面定义的函数func的type打印出来为<class 'function'="">,可见函数func是类function的实例,也就是func是一个对象,对象肯定是在运行时创建的了。

接下来:


obj = func
obj() # 一等对象函数

把func赋给obj,在obj后加括号执行,输出“一等对象函数”,可见函数是可以赋值给变量的


def func():
print('一等对象函数') def func2(n):
print(n)
return n print(func)
func2(func)()
"""
<function func at 0x0000021FED3EC268>
<function func at 0x0000021FED3EC268>
一等对象函数
"""

上面这段代码同样证实了函数可以作为参数传递给函数,同时返回值依然可以是函数,也可以向下面这样


def func():
print('一等对象函数') def func2(n):
print(n)
def func3():
print('函数作为返回值')
return func3 print(func)
func2(func)()
"""
<function func at 0x0000021FED3EC268>
<function func at 0x0000021FED3EC268>
函数作为返回值
"""

在函数中定义函数并返回

高阶函数

函数作为一等对象的使用在python中其实很常见,举个例子,内置函数sorted()


fruits = ['strawberry','apple','cherry','banana',' pineapple']
list = sorted(fruits,key=len)
print(list)
# ['apple', 'cherry', 'banana', 'strawberry', ' pineapple']

这种把函数作为参数或者返回值为函数的函数就叫做高阶函数,显然sorted()就是高阶函数,这种高阶函数在python中还有很多很多。

匿名函数

说道刚才用到的sorted()函数,经常和他一起配合使用的就是匿名函数了

匿名函数顾名思义就是没有名字,它通过lambda关键字创建,即建即用,节省了创建函数的时间,也叫做lambda表达式


fruits = ['strawberry','apple','cherry','banana',' pineapple']
list = sorted(fruits,key=lambda x:x[-1])
print(list)
# ['banana', 'apple', ' pineapple', 'strawberry', 'cherry']

上面的sorted()函数按照水果最后一位字符的顺序排序,这里并没有什么实际意义,只是使用lambda表达式的一个举例。

可调用对象

函数是对象,函数名加括号便是调用这个函数,那么其他对象能否也变成像函数一样可以加括号调用呢

这是可以的,只需要在类中实现特殊方法call


class Fruit():
def __init__(self,name):
self.name = name def __call__(self, *args, **kwargs):
print(self.name+' was called') apple = Fruit('apple')
apple() # apple was called

call方法还可以添加任意的参数,和函数一样。

对于一个对象可不可以被调用可以通过callable()函数判断


print(callable(apple)) # True
print(callable(Fruit)) # True

能够调用就会返回True。这里我们发现Fruit同样也可以调用,这是因为类同样也是一个对象,Fruit也是一个实例,创造它的类也实现了call方法,这里就不细说了。


参考《流畅的Python》

python中的一等对象--函数的更多相关文章

  1. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  2. 【Python核心编程笔记】一、Python中一切皆对象

    Python中一切皆对象 本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做 ...

  3. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

  4. Python中的可变对象和不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...

  5. 《python解释器源码剖析》第4章--python中的list对象

    4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的 ...

  6. python中一切皆对象的理解

    一切皆对象? 学过Java都知道,Java中有8个基本类型,其余的都是继承自Object类的引用类型.方法内的基本类型变量会在栈上分配,而引用类型会通过逃逸分析来决定在栈上分配或堆上分配.Java中关 ...

  7. Python中的高阶函数与匿名函数

    Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...

  8. python中enumerate()函数用法

    python中enumerate()函数用法 先出一个题目:1.有一 list= [1, 2, 3, 4, 5, 6]  请打印输出:0, 1 1, 2 2, 3 3, 4 4, 5 5, 6 打印输 ...

  9. Python中sort和sorted函数代码解析

    Python中sort和sorted函数代码解析 本文研究的主要是Python中sort和sorted函数的相关内容,具体如下. 一.sort函数 sort函数是序列的内部函数 函数原型: L.sor ...

随机推荐

  1. php 对数组按照字符串长度排序

    $file = file('zong.txt'); usort($file, 'sortByLen'); $handle = fopen('zong2.txt', 'a'); foreach ($fi ...

  2. 第七章:四大组件之Service

    Service是Android系统中的一种组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行,并且可以和其他组件进行交互.Service是没有界面的长生命周期的代码.Servic ...

  3. Vue + Element UI 实现权限管理系统 前端篇(十五):嵌套外部网页

    嵌套外部网页 在有些时候,我们需要在我们的内容栏主区域显示外部网页.如查看服务端提供的SQL监控页面,接口文档页面等. 这个时候就要求我们的导航菜单能够解析嵌套网页的URL,并根据URL路由到相应的嵌 ...

  4. 一、Windows下Git的安装与配置

    一.下载Git安装包 1.打开Git的官方网站:https://git-scm.com/ 2.找到下载页:https://git-scm.com/downloads 3.找到Windows版本下载页面 ...

  5. POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...

  6. Go语言学习笔记(二) [变量、类型、关键字]

    日期:2014年7月19日 1.Go 在语法上有着类 C 的感觉.如果你希望将两个(或更多)语句放在一行书写,它们 必须用分号分隔.一般情况下,你不需要分号.   2.Go 同其他语言不同的地方在于变 ...

  7. Spring之IOC容器

    在前面博客中介绍什么是依赖注入时有提到:依赖注入是组件之间依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中.那什么是容器?既然Spring框架实现了IOC,那Spring中的容器 ...

  8. [转]Angular2 Material2 封装组件 —— confirmDialog确定框

    本文转自:https://www.jianshu.com/p/0c566fc1730d 环境: Angular 4.0.0 Angular2 Material2 2.0.0-beta.3 node v ...

  9. 《深入理解Java虚拟机》(五)JVM调优 - 工具

    JVM调优 - 工具 JConsole:Java监视与管理控制台 JConsole是一个机遇JMX(Java Management Extensions,即Java管理扩展)的JVM监控与管理工具,监 ...

  10. Oracle入门《Oracle介绍》第一章1-1

    1.Oracle 简介 a.对象关系型的数据库管理系统 (ORDBMS) b.在管理信息系统.企业数据处理.因特网及电子商务等领域使用非常广泛 c.在数据安全性与数据完整性控制方面性能优越 d.跨操作 ...