在python中,支持面向对象,也支持面向过程编程。字典,整数等这些都是对象,那么函数呢?答案:函数也是对象,在python中,一切都是对象。python
实例编程
def funca(): # 建立一个函数 """返回ok""" return 'ok' print(funca.__doc__) print(funca) print(funca()) type(funca)
输出app
返回ok # __doc__ 是函数对象众多属性中的一个 <function funca at 0x00000257BDAC2598> # 函数对象在内存中的地址 ok # 函数的返回值 function # funca 是 function 类的实例
为了更进一步说明函数式对象,能够把函数赋值给其余变量,或者把函数对象做为参数传递给其余函数。ssh
>>> fact = factorial >>> fact <function factorial at 0x...> >>> fact(5) 120 >>> map(factorial, range(11)) <map object at 0x...> >>> list(map(fact, range(11))) [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
什么是高阶函数:接受函数为参数,或者把函数做为结果返回的函数是高阶函数
常见高阶函数函数
- map - filter - reduce - apply - sorted
内置函数 sorted :可选的 key 参数用于提供一个函数,它会应用到各个元素上进行排序ui
根据单词长度给一个列表排序,据单词的长度排序,只需把 len 函数传给 key 参数code
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana'] >>> sorted(fruits, key=len) ['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry'] >>
根据反向拼写给一个单词列表排序,下面例子中列表里的单词没有变,咱们只是把反向拼写看成排序条件orm
>>> def reverse(word): ... return word[::-1] >>> reverse('testing') 'gnitset' >>> sorted(fruits, key=reverse) ['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry'] >>>
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次做用到序列的每一个元素,并把结果做为新的list返回。对象
有一个函数f(x)=x2,要把这个函数做用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就能够用map()实现以下排序
>>> def f(x): ... return x * x ... >>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) # map()传入的第一个参数是f,即函数对象自己。 [1, 4, 9, 16, 25, 36, 49, 64, 81]
把这个list全部数字转为字符串
>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]) ['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的全部数据进行下列操做:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 一、2 个元素进行操做,获得的结果再与第三个数据用 function 函数运算,最后获得一个结果。
>>> from functools import reduce # 在python3,reduce不在做为内置函数出现 >>> from operator import add >>> reduce(add, range(100)) 4950 >>> sum(range(100)) 4950 >>> >>> def fn(x, y): ... return x * 10 + y ... >>> reduce(fn, [1, 3, 5, 7, 9]) # 将序列直接转化成整数 13579
将一个str对象转化内int对象
>>> def fn(x, y): ... return x * 10 + y ... >>> def char2num(s): ... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] ... >>> reduce(fn, map(char2num, '13579')) 13579
参考自廖雪峰教程
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,若是要转换为列表,可使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每一个元素做为参数传递给函数进行判,而后返回 True 或 False,最后将返回 True 的元素放到新列表中。
在一个list中,删掉偶数,只保留奇数,能够这么写:
def is_odd(n): return n % 2 == 1 filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]) # 结果: [1, 5, 9, 15]
在 Python 3 中,map 和 filter 仍是内置函数,可是因为引入了列表推导和生成器表达式,它们变得没那么重要了。列表推导或生成器表达式具备 map 和 filter 两个函数的功能,并且更易于阅读,
计算阶乘列表:map 和 filter 与列表推导比较
>>> list(map(fact, range(6))) [1, 1, 2, 6, 24, 120] >>> [fact(n) for n in range(6)] [1, 1, 2, 6, 24, 120] >>> list(map(factorial, filter(lambda n: n % 2, range(6)))) [1, 6, 120] >>> [factorial(n) for n in range(6) if n % 2] [1, 6, 120] >>>
lambda 关键字在 Python 表达式内建立匿名函数。匿名函数是为了解决函数对象的命名繁琐而存在的,可是使用匿名函数又大大下降了代码的可阅读性,因此除了在高阶函数将匿名函数做为参数之外,不多使用匿名函数。
在参数列表中最适合使用匿名函数。
以下:使用 lambda 表达式反转拼写,而后依此给单词列表排序
>>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana'] >>> sorted(fruits, key=lambda word: word[::-1]) ['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry'] >>>
用户自定义的函数对象一般是可调用的,能够经过()
运算符应用到可调用的对象,例如内置函数str
>>>mystr = 123 >>>str(mystr) # mystr内置函数是可调用的 '123'
那么除了它,Python中的其余对象是否可调用呢,可使用内置的 callable() 函数。
>>> abs, str, 13 (<built-in function abs>, <class 'str'>, 13) >>> [callable(obj) for obj in (abs, str, 13)] [True, True, False]
Python 数据模型文档列出了 7 种可调用对象。
既然把函数做为对象看待,那么就应该具备对象同样的特性:内省
内省是什么:内省指一种能力,能够肯定对象是什么,包含何种信息,能够作什么。
像这样使用 dir 函数能够探知factorial 具备下述属性:
>>> dir(factorial) ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']