In [ 1 ]: def function ( n ): ... : """ ...: return n! ...: """ ... : return 1 if n 2 else n * function ( n - 1 ) ... : In [ 2 ]: function . __doc__ Out [ 2 ]: '\n return n!\n ' In [ 3 ]: help ( function ) Help on function function in modul
...: """
...: return n!
...: """
...: return 1 if n < 2 else n * function(n-1)
...:
In [2]: function.__doc__
Out[2]: '\n return n!\n '
In [3]: help(function)
Help on function function in module __main__:
function(n)
return n!
In [4]: fact = function
In [5]: fact
Out[5]: <function __main__.function(n)>
In [6]: fact(5)
Out[6]: 120
In [7]: list(map(fact, range(11)))
Out[7]: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
- __doc__是函数对象众多属性中的一个。
- map、filter、和reduce三个高阶函数,在Python3中,map和filter还是内置函数,但是由于引入列表推导和生成器表达式,它们变得没那么重要了。列表推导或生成器表达式具有map和filter两个函数的功能。
Out[8]: [1, 1, 2, 6, 24, 120]
In [9]: [fact(n) for n in range(6)]
Out[9]: [1, 1, 2, 6, 24, 120]
- 在Python3中,map和filter返回生成器(一种迭代器)
- 在Python2中,reduce是内置函数,但是Python3中放到functools模块中。
In [11]: from operator import add
In [12]: reduce(add, range(100))
Out[12]: 4950
In [13]: sum(range(100))
Out[13]: 4950
- sum和ruduce的通用思想是把某个操作连续应用到序列的元素上,累计之前的结果,把系列值归约成一个值。
- all和any也是内置的归约函数。
- Python简单的句法限制了lambda函数的定义体只能使用纯表达式,换句话说,lambda函数的定义体中不能赋值,也不能使用while和try等Python语句。
- 除了作为参数传给高阶函数之外,Python很少使用匿名函数。
用户定义的可调用类型
In [26]: class C(object):...: def __init__(self, items):
...: self._items = list(items)
...: def f(self):
...: return self._items.pop()
...:
In [27]: c = C(range(3))
In [28]: c.f()
Out[28]: 2
In [29]: c.f()
Out[29]: 1
In [30]: f()
------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-30-c43e34e6d405> in <module>
----> 1 f()
NameError: name 'f' is not definedIn [19]: class C(object):
...: def __init__(self, items):
...: self._items = list(items)
...: def f(self):
...: return self._items.pop()
...: def __call__(self):
...: return self.f()
...:
In [20]: c = C(range(3))
In [21]: c
Out[21]: <__main__.C at 0x29fb92b9278>
In [22]: c.f()
Out[22]: 2
In [23]: c()
Out[23]: 1
In [24]: c()
Out[24]: 0
函数注解
In [42]: def f(a:int, b:'int > 0'=1)->int:...: return a + b
...:
In [43]: f(3)
Out[43]: 4
In [44]: f(3, 2)
Out[44]: 5
- 注解中最常用的类型是类(str、int)和字符串(‘int > 0’)
- Python函数及其注解有丰富的属性,在inspect模块的帮助下,可以读取它们。
使用itemgetter排序一个元组列表
In [49]: from operator import itemgetterIn [50]: for city in sorted(metro_data, key=itemgetter(1)):
...: print(city)
...:
('Delhi NCR', 'IN', 2)
('Tokyo', 'JP', 1)
('Mexico City', 'MX', 3)
('New York', 'US', 4)
namedtuple
Tuple还有一个兄弟,叫namedtuple。虽然都是tuple,但是功能更为强大。对于namedtuple,你不必再通过索引值进行访问,你可以把它看做一个字典通过名字进行访问,只不过其中的值是不能改变的。-- https://baijiahao.baidu.com/s?id=1613589944704758634&wfr=spider&for=pc
In [55]: from collections import namedtuple
In [56]: Animal = namedtuple('Animal', 'name age type')
In [57]: perry = Animal(name='perry', age=31, type='cat')
In [58]: perry
Out[58]: Animal(name='perry', age=31, type='cat')
In [59]: perry.name
Out[59]: 'perry'
In [60]: perry._asdict()
Out[60]: OrderedDict([('name', 'perry'), ('age', 31), ('type', 'cat')])