所谓的“一等对象”:
--在运行时创建
--能赋值给变量或数据结构中的对象
--能作为参数传给函数
--能作为函数的返回结果
函数也是对象,这句话的意义在于
def test(n):
"""
这是一个测试函数
"""
if n == 1:
return 1
return n * test(n-1)
test(2)
Out[4]: 2
test.__doc__
Out[5]: '\n 这是一个测试函数\n '
type(test)
Out[6]: function
dir(test)
Out[7]:
['__annotations__',
'__call__',
'__class__',
...
'__str__',
'__subclasshook__']
一个函数自带了__doc__属性,在看看dir。
type(test)可知这只是function类的实例而已。
a = test
a(2)
Out[9]: 2
a(test(2))
Out[10]: 2
这里体现了函数既可以作为参数,也可以作为函数的返回结果。
高阶函数
也就是map,filter,reduce,all,any,sum之类的
在python里的lambda表达式只能使用纯表达式,除非像pyspark那样重载了。
可调用对象:也就是调用运算符()
用户定义的函数,内置函数,内置方法,方法,类,类的实例,生成器函数(即yield)
用户定义的可调用类型
import random
class Test():
"""
测试函数
"""
def __init__(self, items):
self._items = list(items)
random.shuffle(self._items)
def pick(self):
return self._items.pop()
def __call__(self):
return '2'
a = Test(range(3))
a()
Out[18]: '2'
a.pick
Out[19]: <bound method Test.pick of <__main__.Test object at 0x00000124D5D96240>>
a.pick()
Out[20]: 2
这个意味着这个类也像函数一样可以调用了,在调用的时候可以缓冲一些大量计算的结果
然后我们来看看参数和关键字参数
def test(a, b = '1', *c, **d):
print('a:',a)
print('b:',b)
print('c:',c)
print('d:',d)
test(1,2, 34,4,3,c= 2,d =4)
a: 1
b: 2
c: (34, 4, 3)
d: {'c': 2, 'd': 4}
函数注解:
__annotations__的默认方法可以看到,在参数后面写上:号
def test(a:str, b:'2' = '1'):
print('a:',a)
print('b:',b)
test.__annotations__
Out[30]: {'a': str, 'b': '2'}