1.一等函数
把函数作为对象
(1) 可以把函数赋给变量 然后可以通过调用变量来调用函数
(2) 可以把函数作为参数传递给函数 比如map的第一个参数就是函数
(3) 高阶函数 可以接收函数为参数 把参数作为结果返回
例 sorted() 可以key = len 通过长短来排序
list(map(fact, range(6)))
[fact(n) for n in range(6)]
list(map(factorial, filter(lambda n: n % 2, range(6))))
[factorial for n in range(6) if n % 2]
3.匿名函数
lambda x: x**2
4.可调用对象
调用运算符 ----> ()
除了函数 其他对象也可以使用 比如用内置的callable()函数
(1) 用户定义的函数
(2) 内置函数
(3) 内置方法
(4) 方法
(5) 类
(6) 类的实例 (如果类定义了__call__方法)
(7) 生成器函数
5.在类中实现__call__方法后 可以在创建实例后 像调用函数一样调用实例
例
class Bingo:
def init(self, items):
self._items = list(items)
random.shuffle(self._items)
def pick(self):
try:
return self._items.pop()
except IndexError:
raise LookupError('pick from empty BingoCage')
def __call__(self):
return self.pick()
bingo = Bingo(range(3))
bingo()
0
6.函数内省
函数对象有很多属性是其他对象没有的
可以通过dir来查看
7.调用函数时 使用*或**来展开可迭代对象
- 表示顺序上 任意个参数都会被捕获 存入一个元组中
** 表示没有明确指定名称的关键字参数会被捕获 存入一个字典
(1)普通情况的参数 叫 位置参数或者定位参数
(2)默认参数为 def func(name = ‘Tom’)
(3)可变参数 为* **
(4)关键字参数 在函数调用时 指定参数 func(name = 'Tom)
(5)def f(a, , b) 表示后面为关键字参数
f(1, b = 2)
9.可以通过内置属性来获得参数的信息
func.defaults 参数的默认值
func.code
func.code.co_varnames 获得函数的所有局部变量
func.code.co_argcount 参数的个数
(2) 使用inspect 模块
sig = inspect.signature(函数)
sig 包含参数 及其默认值
sig.__annotation 可以从函数签名中提取注解
-
支持函数式编程的包
operator 和 functools
例 from functools import reduce
from operator import mul -
itemgetter 和 attrgetter
例 itemgetter(1) -----> lambda fields: fields[1]
返回索引为1的值
例 itemgetter(1, 0)
返回索引为1的值和索引为0的值 构成的元组
例 attrgetter(参数) 参数可以深入嵌套结构
attrgetter(‘coord.lat’) P134
12.methodcaller 在对象上调用参数指定的方法
和之前的两个一样都可以创建函数
upcase = methodcaller(‘upper’)
upcase(‘You are so brilliant.’)
‘YOU ARE SO BRILLIANT.’
hiphenate = methodcaller(‘replace’, ’ ', ‘-’)hiphenate(‘You are so brilliant.’)
‘You-are-so-brilliant.’
13.使用functools.partial 冻结参数
参数 第一个为可调用对象 后面跟着任意个要绑定的定位参数和关键字参数
作用为基于一个函数创建一个新的可调用对象,把部分参数固定可以把接收多个参数的函数改编为需要回调的api
例
from operator import mul
from functools import partial
triple = partial(mul, 3)
triple(7)
21