《流畅的Python》Functions as Object

牧云@^-^@ 提交于 2019-12-10 19:53:20
  • 5 First-Class Functions
  • 6 Design Patterns wiith First-Class Functions
  • 7 Function Decorators and Closures

First-Class Functions

创建者Rossum说,不把Python当成函数式编程语言。

Python中,所有函数都是一等公民。即一等对象。

编程语言理论家认为一等对象是:

  • 在运行时创建
  • 可以分配给变量/数据结构中的元素
  • 作为参数传递给一个函数
  • 能够以函数形式返回。

在Python, Integers, stirngs, dict,也是一等对象。

 


 

Treating a Function Like an Object

 

看这个例子:

def factorial(n):
    '''returns n!'''
    return 1 if n < 2 else n * factorial(n - 1)

print(factorial(4)) #24
print(factorial.__doc__)  # returns n!
print(type(factorial))    # <class 'function'>

 上个例子用到了递归。

 使用__doc__查看用···xxx···,定义的文档。在控制台,可以使用help(factorial)查看文档。

可以使用:http://www.pythontutor.com/ 工具非常方便。

 

Higher_Order Functions 高阶函数

一个函数可以接受另一个函数作为参数,或者返回一个函数,就叫做高级函数。

比如map(fun, iterable),  sorted(iterable, key=None), filter() , 这是三个内建函数。

>>> def reverse(word):
...     return word[::-1]
...
>>> reverse('testing')
'gnitset'
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
>>> sorted(fruits, key=reverse)
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']

 

 

Modern Replacements for map, filter, reduce

map和filter返回一个生成器(迭代器),所以现在Python3直接用生成器表达式,Python2用 list 推导式。

reduce被sum()进行求和替代。

 


 

 

Anonymous Functions

lambda关键字,可以创建匿名函数。但Python做了限制,只能使用纯表达式,不能用诸如if, try等语句。

lambda就是一个语法糖,可以用def替代。

lambda创建一个函数对象。

 


 

The Seven Flavors of Callable Objects

call operator,就是括号,除了用在自定义的函数,还可以通过使用callable(object),来判断这个对象是否可调用

7种可调用对象:

  1. User-defined functions:  使用def或lambda创建
  2. 内建函数,用C语言实现的函数。如len
  3. 内建方法,用C语言实现的方法。如dict.get
  4. Methods, 定义在一个类种的函数。
  5. Classes
  6. 类实例Class instances
  7. Generator functions。使用yield的函数/方法,返回的是a generator object

例子:

>>> abs, str, 13
(<built-in function abs>, <class 'str'>, 13)
>>> [callable(obj) for obj in (abs, str, 13)]
[True, True, False]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!