Date Tags python

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]:
'j'
In [4]:
data.list
Out[4]:
['j', 'jj']
In [5]:
data().data
Out[5]:
'3'
In [6]:
data()()().list
Out[6]:
['3', '33']

函数连续求和

In [7]:
def myadd(arg):
    myadd.num += arg
    return myadd
In [8]:
myadd.num = 0
In [9]:
myadd(1)(2)(3).num
Out[9]:
6

函数执行次数计数

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]:
10

函数属性存储在那里?

In [13]:
foo.__dict__
Out[13]:
{'exec_count': 10}
In [14]:
foo.a = 1
In [15]:
foo.__dict__
Out[15]:
{'exec_count': 10, 'a': 1}

构建函数链

我们使用naja库中的pipe来构建,导入pipe中的全部后,会自动把所有内置函数转化成带有to_前缀的函数,支持管道操作

函数管道

曾经我们是这么写代码的,圆括号能折腾死人,光标前后跳,思路不停被打断

In [16]:
print(sum(list(range(10))))
45

以后我们是这样的 ,思路连贯,写起来舒服,看起来清晰

In [17]:
from naja.pipe import *
from naja.pipe import X
In [18]:
range(10)>>to_list>>to_sum>>to_print
45
In [19]:
(1,2)|concat('-')
Out[19]:
'1-2'
In [20]:
'abc'>>as_tuple
Out[20]:
('a', 'b', 'c')
In [21]:
{'a':[1,2,3],'b':[4,5,6]} >> to_dataframe(orient='index')
Out[21]:
0 1 2
a 1 2 3
b 4 5 6

自定义管道函数

In [22]:
@Pipe
def foo(i):
    return i*2
In [23]:
[1,2]>>foo
Out[23]:
[1, 2, 1, 2]
In [24]:
2>>foo
Out[24]:
4

管道链末端直接赋值

计算好数据了,想赋值?也不用跑到代码前面写变量名了,把他给到变量存储空间X里面去

In [25]:
[1,2,3]>>to_sum>>X('var1')
Out[25]:
6
In [26]:
X.var1
Out[26]:
6