博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的一等对象--函数
阅读量:7117 次
发布时间:2019-06-28

本文共 1925 字,大约阅读时间需要 6 分钟。

一等对象

什么是一等对象:

  • 在运行时创建

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

  • 能作为参数传递给函数

  • 能作为函数的返回结果

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

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

函数是一等对象

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

def func():    print('一等对象函数')print(type(func)) #

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

接下来:

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

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

def func():    print('一等对象函数')def func2(n):    print(n)    return nprint(func)func2(func)()"""
一等对象函数"""

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

def func():    print('一等对象函数')def func2(n):    print(n)    def func3():        print('函数作为返回值')    return func3print(func)func2(func)()"""
函数作为返回值"""

在函数中定义函数并返回

高阶函数

函数作为一等对象的使用在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)) # Trueprint(callable(Fruit)) # True

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


参考《流畅的Python》

转载于:https://www.cnblogs.com/sfencs-hcy/p/10454125.html

你可能感兴趣的文章
《21天学通C++(第7版)》——17.1 std::vector的特点
查看>>
《HTML5完美游戏开发》——第1章 Open Web Game王国
查看>>
JDBC案例演示,供参考
查看>>
android守护进程
查看>>
设计模式之适配器模式(adaptor pattern)
查看>>
《C++语言基础》实践项目——链表类及其应用
查看>>
【Spark Summit East 2017】Intel与Spark共同助推机器学习与深度学习
查看>>
阿里王坚:数据大航海时代为什么中国人可能是第一个出海互联网的?
查看>>
MongoDB 远程连接
查看>>
云数据库·ApsaraDB 产品8月刊
查看>>
新世纪版五笔字根背诵
查看>>
第十八章_SSL证书
查看>>
仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字...
查看>>
【原创】Erlang 之 debugger 调试简介
查看>>
昂贵的付费学习时代,云栖为什么会做面向开发者的纯公益?
查看>>
如何通过备份文件恢复SQL Server数据库
查看>>
Linux堆内存管理深入分析 (下)
查看>>
暂停、恢复CALayer 动画
查看>>
Android 通过Get/Post提交请求数据到服务器
查看>>
http 415 错误
查看>>