首先注意不要和数学中的函数搞混了
那么到底什么是函数呢?
函数其实就是当我们在程序中需要大量重复的代码块,我们将其封装成一个代码块,用一个名字来表示,而这个名字是标识符(变量名)。需要遵循标识符(变量名)的规则。
函数的优点就是避免了代码重复率,提高开发效率。
举个例子:
了解函数的作用,如下例,计算数值
如果是计算一个数的累加值(就是1+2+3+...+n),比如10 (1+2+3+...+10)
对比用函数来计算
当计算的是一个数的时候,会觉得用for循环和用函数都一样,为什么要用函数多此一举呢?
我们学习函数的原因是,当需要重复一段代码非常多次的时候,用函数这个工具,会轻松很多,加快了工作效率。
比如让你一次性算10,20,30很多数字,我们就可以用函数来计算,比如
重复调用三次a() 函数,分别输入10,20,30即可算出答案
如果不用函数的话,用for循环,代码篇幅长度是这样的
对比上一个调用函数的方法,这个用for循环去写代码,就明显的篇幅过长!
总结:函数的作用就是封装一段代码,调用的时候,只需要一行代码 函数名(),即可让函数里面的代码运行,提高工作效率~
如果A让代码缩进,那代码的服务对象就是A
无参函数是最基本的函数,基本上很少用到,都是拿来练习理解函数的。
函数是可以传递参数的,而参数分为形参和实参。
形参就是形式上的参数,就像一家公司有员工,清洁工,董事长等职位,但是有些职位却空着,这些空着的职位,就相当于形参,需要有人去做这个职位,才能发挥作用,而这个能发挥职位作用的人,就叫做实参(实际参数)。
而我们定义有参函数的时候,需要定义形参来表示我们的函数,有这些东西,你想让我们的函数去发挥作用的话,就需要给我们传递实际参数。
有参有参,在哪里体现的有参呢?
在我们定义的时候,我们需要在括号里面定义形参,用于接收参数。
而在我们调用的时候,也是通过函数名后面的括号传递实参的。
我们会定义一个有参函数来使两个参数拼接在一起,并遍历。
PinJie('sasa', 4564)
#也可以这么写
'''
PinJie(a='sasa',b=4564)
这样写的好处是
就算你的位置写错了
参数传递的也还是对的
也就是说,参数传递的位置不固定
就像这样
PinJie (b=4564, a='sasa')
是完全一样的
'''
运行:
之前说过,return 一般是使用在函数中的,那么他的作用是什么呢?
先根据见名知意的规律来解读:返回。
确实,他的作用就是返回,返回值。
通过return xxx来达到返回值得目的,这里是返回了xxx这个东西,至于xxx 是什么。众所周知,xxx可以什么都是!根据我们需要使用的函数值来定。
那么返回的值到了哪里呢?到了函数的调用那里,这个函数名字(参数)就是返回的值。
看上面的那个函数,他显示拼接后的结果,使用了print()函数(内置函数)。
那么我们使用return试试。
PinJie('sasa', 4564)
那么会怎么样呢?
答案是,什么都不会显示!
为什么呢?因为我们没有使用print()函数(瞎说,那不是有!)。
为什么这么说呢?因为上次讲过,return用于结束一段代码,而我们在中间return,下面的代码for循环也就不会被执行,就直接结束了。
怎么显示循环呢?把return放在函数最下面!
答案是,函数内循环的值确实有显示出来,证明我们刚才想法是对的!
那么上面说了返回的值被 **函数名()**接收了,那么他现在就是一个值了,想要让它显示,那么只能用print()了啊!
结果:
他就显示了返回值,也就是函数拼接str_的结果值,需要注意的是我们这里return的位置没有改变,所以return下面的代码for循环也就不会被执行,也就不会打印出来str_中的每个字符了,想要都展示出来,还是要放到函数最下面,可以自己去试试了。
在 ForTrader 里面,我们会看到四个函数模块
4个模块都是函数的知识,在学习的过程中,我们需要做的是写函数的内容,就是在对应的函数里面写入我们的策略代码
比如这里面的代码内容,只需要学会填充到对应的函数即可!
指标 函数 用于计算各种交易指标的数值。计算指标的方法多种多样,可以是经济数据或估值指标,也可以是技术指标。
标的 函数 根据你的交易想法选择相应的投资标的,可以是股票、基金等标的代码。选择标的时,需要判断某只标的是否满足该条件,如果满足,就将该标的添加到投资组合中,如果不满足,就不加入投资组合或者从投资组合中删除。
择时 函数 主要解决“什么时候交易”的问题。在这个模块编写策略的买入卖出逻辑,在合适的时机交易标的。
风控 函数 就是指风险管理者采取各种措施和方法,消灭或减少风险事件发生的各种可能性,或风险控制者减少风险事件发生时造成的损失。它是策略组成的一个可选部分,并不是所有经典的策略都存在风险控制逻辑。
编程语言有面向对象(Java,Python)和面向过程(C语言)之分,面向对象需要一些抽象的思维才行。
面向过程和面向对象有什么区别呢?
面向过程注重亲力亲为,意思也就是自己去干这件事;而面向对象更倾向于找个人给自己做事。
就拿那个老生常谈的例子来说吧——洗衣服:
面向过程的洗衣服是:
把衣服拿到洗衣机旁边
放进去
等待
捞出来
等下一次洗衣服,你还得重复这些操作
而这就是函数式编程。
而面向对象则是:
创造一个机器人
教他如何洗衣服
把衣服拿到洗衣机旁边
放进去
等待
捞出来
让他去干活
等下一次需要洗衣服,就让机器人去干就行了。
而面向对象绕不开的就是类和对象了,接着往下看吧。
看了上面的内容,应该已经对面向对象有了一定的理解吧,那么来看看什么是类和对象吧。
类是个抽象的东西,比如说人类,动物类,植物类,类是具有某些相同特征的事物的集合。
那么如何在python中定义一个属于我们的类呢?
这就成了。
注意类名首字母大写,这样可以与函数名进行区分,方便后面我们调用时辨别。
而类需要有属性,行为(方法)等东西
而属性就是在类里面的局部变量。
而行为就是定义在类里面的函数。
说到类,比较难的点,就只有初始化方法和Self的用法
初始化方法的特征,函数名是 __init__ 即 双划线init双划线
类方法的调用,格式通常是 实例名.方法名() 才可以调用,但是这里person=Chinese()类的实例化的代码,就能引起__init__的方法调用
这里的终端结果,只有init的方法再运行
而a函数没有运行,是因为我们没有进行一个调用函数,如果我们在函数下面写多一行,比如
这时候,a方法里面的print()语句就会打印输出~
这个对比,我们可以了解到,初始化方法(init)他是可以趁 类初始化的代码运行的时候,他也会自动运行
总结:我们只是创建了实例,还没有调用,初始化方法就自动执行了!如果不是初始化方法,函数的调用需要写调用函数的代码
类的定义格式
这里多了一个self参数,它用来指对象本身。
因为在定义类的时候,不清楚将会有哪个实例是这个类的一员,但是类里面的方法要在其他方法调用的时候需要用到 实例名.方法名() 格式,因此我们需要设置一个形式参数一样的存在,如self,作为一个(形式上的)实例名用于 调用方法和属性,因此在类里面调用方法的时候,只需要写 self.方法名()
这个self是可以用其他变量名字代替的,可以用aaa,bbb来替代self的作用
在ForTrader平台,他本身是在一个大的类运行代码,因此我们的 指标,标的,择时,风控方法是在类里面的
因此变量名context是一个跟self一样的形式参数,充当 账户 的作用
那对象是什么呢?
对象是类的实例化,拿人类来说,人是一个类,而我们每个人都是人这个类的实例化对象。
看代码:
很明显,大黄是人这个类的实例化对象,换句话说,大黄是个人,在这句话里,大黄就是对象,人就是类。
虽然Python是面向对象的语言,但是他也能面向过程编程,也就是函数式编程。
话不多说,直接上代码
运行结果:
我们需要调用每一个的行为才会执行对应的动作。
代码:
运行结果:
我们只要创建一个大黄的实例,也就是一个机器人,对应的它就会帮我们执行里面包含的行为,从而执行所有的动作,所以类也可以理解为行为的一个合集。.
联系客服