python 计量做hp滤波_Python量化随笔丨那些年,我写python踩过的坑(二)

如果别人问我,你在Python量化策略方面做的怎么样呀,我从来都是说,在这方面我还是个小学生,不多评价,不多发言,毕竟这个行业,现在牛鬼蛇神,各路神仙,稍微多说那么一句就会感觉,不是会跑到算法,就是会跑到金融,要么就是跑到去计量了,然后,我都会在心里默默的告诉自己,不想学算法、数学的金融矿工不是好程序员。

那么,如果别人问我,你最擅长做啥啊?我以前会两个眼睛冒着绿光,找到知音一样的对他说,挖坑。然后,等我用了python才发现,我只是擅长给自己挖坑,真的大神,向来都是给别人挖坑,挖完了坑,坐在一个好角度欣赏各种踩坑的姿势,偶尔指点一下,接受大伙的膜拜,比如python。不过不管什么样的坑,早知道,少些纠结,多点从容。上篇儿:Python量化随笔丨那些年,我写Python踩过的坑(一)

对python命名空间比较熟悉的同学会发现,这种编写方式其实更像是一个工厂函数,其实并没有将执行者名称和命名空间通过装饰器绑定,只是构建了两个独立的函数命名空间而已,当然我们可以通过构建可以传入参数的装饰器完成这个操作,但是为了将和装饰器内部编写逻辑这个事情说清楚,这些已经足够了。

如果,使用编辑器的时候都是像我们上面写的hello_by_yellow_teeth = greeting_and_counter(hello)这种方式,那么装饰器还是比较理解的。但是,python里面有一个装饰器的语法糖就是将装饰器的使用写成这样:

@greeting_and_counterdef hello():

return 'Hello, world!'

这种写法可以这样理解:

hello = greeting_and_counter(hello)

那么对于这种更常见的方式进行装饰器使用的方法,对于一个函数,只能返回一个被装饰后的函数并赋值给和原函数相同的变量名。所以如果想通过这种更容易阅读的方式使用装饰器完成之前两个动作执行者分别计次的要求,就需要再进一步改进装饰器的代码。这里面就不再进一步讲解传入参数的装饰器写法。

装饰器的原理已经介绍清楚了,那么对于装饰器的坑,我们就以不带参数的装饰器进行讲解。

首先,我们编写两个装饰器。

def decorator1(func):

print('Enter decorator1') def wrapper1():

print('Enter wrapper1')

print(func())

print('Exit wrapper1')

print('Exit decorator1') return wrapper1

def decorator2(func):

print('Enter decorator2') def wrapper2():

print('Enter wrapper2')

print(func())

print('Exit wrapper2')

print('Exit decorator2') return wrapper2

之所以说在装饰器中会产生一些坑是因为用的人驾驭不了,是因为对于刚刚编写好的decorator1这个装饰器来说,每一个print都会在什么时候打印出来需要花点时间弄明白。那么我们可以看一下。

我们先使用decorator1对一个函数进行装饰

@decorator1def help():

return 'help me'

Out:

Enter decorator1

Exit decorator1

此时运行了enter decorator1和exit decorator1部分,这是最开始初学装饰器非常容易弄错的一点,对于enter decorator 部分还是比较容易理解的,但是调用一个函数的时候定义了另一个函数,然后学习者可能就会忽略掉exit decorator的部分。

然后我们调用help函数

help()

Out:

Enter wrapper1

help me

Exit wrapper1

那么运行在wraper之内的部分就稍微好理解很多,就是正常的一个函数调用时候内部代码的运行顺序,从上到下。

其实说到这里,虽然稍微有点绕,但是还是可以弄清楚然后进行使用的,但是,如果在装饰器各个部分之间内部编写上相互之间配合的逻辑就很容易因为命名空间的问题导致代码运行出错,另外,在装饰器里面的逻辑编写因为其运行顺序,并不是从上到下这样一种人容易理解的顺序,那么如果编写复杂后也很难理解,代码的可读性就会大打折扣。

如果说花些时间,然后冒着被同事打的风险还是可以在装饰器里面编写一些能够理解的逻辑,那么多重装饰器,特别是在装饰器中附带装饰器可能理解起来就真的需要花些精力梳理一下了,例子如下。

@decorator1@decorator2def help1():

print('help me1')

Out:

Enter decorator2

Exit decorator2

Enter decorator1

Exit decorator1

或者这样

def decorator3(func):

print('Enter decorator3') @decorator1

def wrapper3():

print('Enter wrapper3')

print(func())

print('Exit wrapper3')

print('Exit decorator3')

@decorator3def help():

return 'help me3'

Out:

Enter decorator3

Enter decorator1

Exit decorator1

Exit decorator3

那么,这个时候,如果有人还在decorator1里面写了比较复杂的逻辑,而且写错了的话,我想大家就只剩下打人的冲动了。

所以说,对于装饰器,一个非常大的坑就是你觉得你已经掌握的很熟练了,希望弄得与众不同,然后就在一些别人貌似不敢尝试的地方做些文章,最后,即使你还是完成了一个装饰器内部非常复杂的运行逻辑,但是,工作环境中,你就会发现最经常用的还是效率比较高的写法。

以上就是本篇文章介绍的内容了,写到这,发现要是想把一些高级一些的坑讲清楚,都是要花一些时间。那么,我为什么会花这么多精力去写一系列文章,原因有这样几个:一是自己学python时候遇到了无数的坑,初级的坑靠自己,高级的坑也靠自己,虽然可以通过各种的博客和书籍找到相应的解决方案,或者自己根据python的运行原理推出潜在的坑,但是由于网络文章鱼目混珠,观看书籍又如大海捞针,浪费了很多时间,当时我就特别希望有人能够给我讲讲,或者有那么几篇不错的文章,可惜没有,求不得的苦也就没必要让众人重复,算是行善积德;二是介绍一个观点,就是编程必然是一个不断遇到错误的过程,编程的能力不仅仅包括读代码、写代码的能力,还包括debug的能力。如果你不能debug,那么你就不算学会了编程,太多python初学者遇到bug喜欢请教别人,其实放弃了掌握必备技能的机会,算是指明去路;三,也是关键,我长得这么丑,又没文化,写一些好的技术文章也许是我出名最后的机会了。>>>点击咨询Python量化学习指南

挖坑也好,踩坑也罢,编程、学习、工作、生活,处处充满了如意和不如意的事情,不同人对于类似事情反应各不相同,也就有了这样一种说法,见得多了也便习以为常。所以,珍惜你身边的每一个程序员或程序媛,他们充满坎坷的debug经历培养了他们缜密的逻辑和过人的耐心,嫁他或者娶她,都将是你一生最好的选择。

最后,还是用郭德刚郭大爷相声里的一句话结个尾:

“雷霆雨露具是天恩”

所以,常怀感恩之心,面对大神,少点bug,就没有杀害。

AQF考友群:760229148

金融宽客交流群:801860357

微信公众号:量化金融分析师

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值