Fluent Python 3函数 1一等对象

目录

 

把函数视作对象

高阶函数和匿名函数

可调用对象

函数的参数

函数注解

operator 模块

functools.partial


把函数视作对象

编程语言理论家把“一等对象”定义为满足下述条件的程序实体:

在运行时创建 ;

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

能作为参数传给函数 ;

能作为函数的返回结果;

Python 中,整数、字符串和字典都是一等对象。人们经常将 把函数视作一等对象 简称为 一等函数 ”。 1.函数是“一等公民”
 

高阶函数和匿名函数

有了一等函数,就可以使用函数式风格编程。函数式编程的特点之一是使用高阶函数。

接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higher- order function)。比如内置函数 sorted,函数被作为关键字参数 key(任何单参数函数都能作为 key 参数的值)。

mapfilterreduce

函数式语言通常会提供 mapfilter reduce 三个高阶函数。

列表推导或生成器表达式具有 map filter 两个函数的功能,而且更易于阅读。在 Python 3 中,map filter 返回生成器(一种迭代器),因此现在 它们的直接替代品是生成器表达式(在 Python 2 中,这两个函数返回列表,因此最接近的替代品是列表推导)。

 
匿名函数
 
 
在参数列表中最适合使用匿名函数,比如内置函数 sorted的关键字参数 key。lambda 句法只是语法糖:与 def 语句一样,lambda 表达式会创建函数对象。 
 

可调用对象

 
可调用对象可以用 调用运算符(即 ())进行调用。如果想判断对象能否调用,可以使用内置的 callable() 函数。
 
Python 数据模型文档列出了 7 种可调用对象,如下:
 
用户定义的函数。使用 def 语句或 lambda 表达式创建。

内置函数。使用 C 语言(CPython)实现的函数,如 len 或 time.strftime。

内置方法。使用 C 语言实现的方法,如 dict.get。

方法。在类的定义体中定义的函数。

类。调用类时会运行类的 __new__ 方法创建一个实例,然后运行 __init__ 方法,初始化实例,最后把实例返回给调用方。因为 Python 没有 new 运算符,所以调用类相当于调用函数。(通常,调用类会创建那个类的实例,不过覆盖 __new__ 方法的话,也可能出现其他行为。 19.1.3 节会见到一个例子。)

类的实例。如果类定义了 __call__ 方法,那么它的实例可以作为函数调用。

生成器函数 。使用 yield 关键字的函数或方法。调用生成器函数返回的是生成器对象。 
 
__call__  方法
 

object.__call__(self[, args...])

此方法会在实例作为一个函数被“调用”时被调用;如果定义了此方法,则 x(arg1, arg2, ...) 就相当于 x.__call__(arg1, arg2, ...) 的快捷方式。

函数的参数

Python 提供了极为灵活的参数处理机制。Python args 和 kwargs
 
函数的属性
 
 __code__ 包含已编译函数的代码对象 bytecode

__defaults__  位置或关键字参数的任何默认值的元组

 __annotations__ 将参数名映射到批注;“return”键保留给返回批注。
 

函数注解

 
Python 3 提供了一种句法,用于为函数声明中的参数和返回值附加元数据。
 
 

operator 模块

 

operator.itemgetter(*items)

返回一个使用操作数的 __getitem__() 方法从操作数中获取 item 的可调用对象。 如果指定了多个条目,则返回一个查找值的元组。 例如:

  • 在 f = itemgetter(2) 之后,调用 f(r) 将返回 r[2]

 
 
 

operator.attrgetter(*attrs)

返回一个可从操作数中获取 attr 的可调用对象。 如果请求了一个以上的属性,则返回一个属性元组。 属性名称还可包含点号。 例如:

  • 在 f = attrgetter('name') 之后,调用 f(b) 将返回 b.name

 

operator.methodcaller(name/*args**kwargs)

返回一个在操作数上调用 name 方法的可调用对象。 如果给出额外的参数和/或关键字参数,它们也将被传给该方法。 例如:

  • 在 f = methodcaller('name') 之后,调用 f(b) 将返回 b.name()

functools.partial

functools. partial( func/*args**keywords)
 
 
partial() 会被“冻结了”一部分函数参数和/或关键字的部分函数应用所使用,从而得到一个具有简化签名的新对象。
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值