python中函数也是一种对象,那么你能对对象做的事情,对函数也可以做 比如可以这样:
- 把函数当成参数传递
- 把函数当成返回结果
- 给函数增加属性
- 通过管道构建函数链
前两个比较常见和简单,我们今天主要看后面两个
函数属性¶
给函数设置属性,并且这个函数返回值也是一个函数,并且还是个递归,返回函数自身。函数可以使用属性,增加执行状态
In [1]:
def get_data():
import random
r = random.choice(list('12345kfjdw39'))
get_data.data = r
get_data.list = [r,r*2]
return get_data
In [2]:
data = get_data()
In [3]:
data.data
Out[3]:
In [4]:
data.list
Out[4]:
In [5]:
data().data
Out[5]:
In [6]:
data()()().list
Out[6]:
函数连续求和¶
In [7]:
def myadd(arg):
myadd.num += arg
return myadd
In [8]:
myadd.num = 0
In [9]:
myadd(1)(2)(3).num
Out[9]:
函数执行次数计数¶
In [10]:
def foo():
foo.exec_count += 1
return
In [11]:
foo.exec_count = 0
for i in range(10):
foo()
In [12]:
foo.exec_count
Out[12]:
函数属性存储在那里?¶
In [13]:
foo.__dict__
Out[13]:
In [14]:
foo.a = 1
In [15]:
foo.__dict__
Out[15]:
构建函数链¶
我们使用naja库中的pipe来构建,导入pipe中的全部后,会自动把所有内置函数转化成带有to_前缀的函数,支持管道操作
函数管道¶
曾经我们是这么写代码的,圆括号能折腾死人,光标前后跳,思路不停被打断
In [16]:
print(sum(list(range(10))))
以后我们是这样的 ,思路连贯,写起来舒服,看起来清晰
In [17]:
from naja.pipe import *
from naja.pipe import X
In [18]:
range(10)>>to_list>>to_sum>>to_print
In [19]:
(1,2)|concat('-')
Out[19]:
In [20]:
'abc'>>as_tuple
Out[20]:
In [21]:
{'a':[1,2,3],'b':[4,5,6]} >> to_dataframe(orient='index')
Out[21]:
自定义管道函数¶
In [22]:
@Pipe
def foo(i):
return i*2
In [23]:
[1,2]>>foo
Out[23]:
In [24]:
2>>foo
Out[24]:
管道链末端直接赋值¶
计算好数据了,想赋值?也不用跑到代码前面写变量名了,把他给到变量存储空间X里面去
In [25]:
[1,2,3]>>to_sum>>X('var1')
Out[25]:
In [26]:
X.var1
Out[26]: